Algunas excepciones en el manejo de seata (análisis y procesamiento del código fuente)

¡Continúe creando, acelere el crecimiento! Este es el 7º día de mi participación en el "Nuggets Daily New Plan · June Update Challenge", haz clic para ver los detalles del evento


escribir delante

Cómo decir, muchas veces, solo usamos el código abierto de otras personas 服务, algún código abierto 框架.

Si no podemos profundizar en la capa inferior del marco para analizar, comprenda algunos de los principios de implementación de la capa inferior de estos marcos.

Cuando nos encontramos con problemas, ¡solo podemos ser Aba Aba Aba! ! ! Esta es una realidad muy frustrante. =_=

imagen.png

Por lo tanto, debemos profundizar en algunos marcos de código abierto excelentes para aprender, comprender mejor sus capas subyacentes y abordar los problemas que encontramos en el análisis del código fuente.

Hoy, compartiré seataalgunos problemas encontrados en el uso de transacciones distribuidas y cómo resolverlos.

problema resuelto

1. Excepción de asiento

anormal:

io.seata.core.exception.GlobalTransactionException: No se pudo encontrar la transacción global xid = 192.168.2.121:8091:239779337648214016, es posible que haya finalizado.

imagen.png

Este problema, el documento oficial de seata tiene una resolución:

举例说明:

@GlobalTransactional(timeout=60000) 
public void A(){

​ call remoting B();//远程调用B服务​ local DB operation;

}

public void B(){

}
可能原因:
1. A 执行的总体时间超过了60000ms,导致全局事务发起了全局回滚,此时A或B方法继续执行DB操作,校验全局事务状态,发现全局事务已经回滚。
2. B服务执行超出其设定的readTimeout 返回异常给A并将异常抛出导致全局事务回滚,此时B服务执行DB操作时,校验全局事务状态,发现全局事务已经回滚。
3. tc集群节点时间不一致。

影响:出现这种情况时,数据会整体回滚至A方法执行前的数据的初态,从数据一致性的视角上看,数据是整体一致的。

除了上述情况,如果引用的是`seata-spring-boot-starter`的话,产生这个错误的原因也可能是因为一个bug,目前在1.5版本进行了修复,具体可以参考[issues4020](https://github.com/seata/seata/issues/4020),[PR4039](https://github.com/seata/seata/pull/4039)。

复制代码

Trata de arreglarlo:

  • 1. @GlobalTransactional(timeout=60000), timeout*10 se establece en 600s, que ya es muy largo.

Pero el resultado final no es capaz de resolver el problema.

github continúa encontrando, existe tal descripción: 3438

imagen.png

Este anciano también encontró este problema.La respuesta oficial es que el tctiempo del nodo debe estar sincronizado.

Pero soy un solo nodo, no hay múltiples tcnodos, y la hora del servidor y la hora de la base de datos también están sincronizadas.

Así que todavía no resolvió mi problema.

Tenemos este problema, es este: 多次提交,总会成功那么一两次.

Esto demuestra que no hay problema con nuestro código comercial.

Y este problema apareció recientemente, y no apareció antes.

imagen.png

  • 2. Intente resolver y depurar el código fuente de seata desde el código fuente.

Este es un proceso muy engorroso, y también es un proceso que quema el cerebro, pero aún tenemos que ser pacientes y depurar paso a paso.

Este proceso se ignora aquí, porque la depuración del código fuente no encontró el problema.

  • 3. Luego analice desde la experiencia y la práctica.
1.为什么之前都好好的?
2.为什么时得时不行?
复制代码

Del análisis de estos dos problemas, puede deberse a problemas ambientales, así que intentemos restaurar un seataservicio limpio.

¿Cómo probarlo?

Hacemos esto service.vgroupMapping.xxxx_tx_group=defaultyendo a buscar el servicio seata registrado a nacos

imagen.png

Predeterminado significa encontrar el servicio de asiento en ese clúster.

Luego podemos cambiar este valor y cambiarlo a un nuevo servicio de asiento propio,

imagen.png

imagen.png

por ejemplo esto

Luego, permita que nuestro microservicio se conecte a llsseata debajo del clúster. Entonces pruébalo.

El efecto de esta prueba también es muy poderoso y esta anormalidad básicamente no ocurrirá.

Eso es todo, aquí, podemos sacar tal conclusión:

Cuando el servidor de seata registra demasiados servicios, la carga de seata aumentará, lo que provocará una presión excesiva sobre seata.

Esta excepción también ocurrió.

¿Por qué nos damos de alta en tantos servicios?

Debido a que usamos la función de múltiples fuentes de datos, cada fuente de datos también se registrará con seata, lo que genera una gran carga de seata.

  • 4. La solución definitiva

Aumente los recursos del servidor, implemente el clúster en un solo asiento y reduzca la presión en un solo asiento.

De acuerdo, ¡estaré aquí primero hoy, hojeando, hojeando! ! ! ^_^

Si lo encuentras útil, ¡ayuda por favor 点赞、评论、收藏! ! !

imagen.png

Supongo que te gusta

Origin juejin.im/post/7103901225455714317
Recomendado
Clasificación