[seata]事务分组集成注册中心后的作用?

2024-05-09 358 views
9
Ⅰ. Issue Description

seata在集成注册中心后,事务分组的作用是什么?

Ⅱ. Describe what happened
  1. 如果说为了保证程序的高可用,按官网说的异地机房宕机容错,nacos不是实现了动态监听服务嘛,当服务宕机后,后续nacos不是不会再将请求转发给这个宕机的服务吗?那此时这个事务分组是不是就有点多余?

2.seata官网示例中有用到“cluster ”数据模型,但是nacos不是已经将“cluster ”去除了吗? 官网示例:http://seata.io/zh-cn/docs/user/txgroup/transaction-group-and-ha.html

3.若seata与nacos集成。那seata事务分组的作用是什么?

回答

3

很好的问题。

  1. 事务分组是Seata流量路由和多租的逻辑单元,是高可用、多活容灾和多租隔离的基础。Seata承载数据面流量对RT敏感,一般不会多个机房(AZ)混搭一套集群,因为此处缺少同机房调用优先的路由规则和存在存储的时延问题。如果以Nacos为注册模型,相当于同一个service下的不同cluster对应不同的机房,可以在机房宕机的情况下手动或自动切换cluster级的路由实现多活容灾。
  2. Nacos 2.x 弱化了cluster概念与1.x模型不同,将分级改成了instance下的属性,订阅时提供属性过滤,从功能上是兼容的。

不同的注册中心概念模型和功能特性不同,Seata不绑定特定的实现,避免不同模型与Seata集成的学习成本,长期来看Seata需要实现核心依赖组件的自闭环。

4

非常感谢您的回答,还是有几个问题需要请教:

  1. 其实主要想问的是:seata的事务分组是怎么工作的?

  2. 在文档-第二类:注册中心和配置中心(以nacos为例)的示例中,这里有明确写到 seata.service.vgroup-mapping.my_test_tx_group=default需要与Seata-server注册到Nacos的cluster保持一致 ,但是上面您也说到nacos2.x已经不采用cluster概念,而且看其它注册中心的集成,在seata server注册的时候也没有指定cluster,那在seata client中的yml又是这样写到:seata.server.vgroup-mapping.xxx=cluster名,这个cluster名是有什么作用吗? 然后再看文档-事务分组如何找到后端Seata集群 又是通过nacos的cluster找到TC集群的。既然已经不采用nacos的cluster概念了,那seata client又如何找到seata server?

image image 文档:http://seata.io/zh-cn/docs/user/txgroup/transaction-group.html

3

eureka中事务分组对应的就是application,其余的实现中就是cluster https://github.com/seata/seata/blob/2.x/server/src/main/resources/application.example.yml 事务分组本身的目的就是为了资源隔离和资源切换,而其复杂度高最大的原因是引入了第三方的注册配置中心 1.第三方注册中心自带某些namespace,group,cluster,application等方式就可以做到资源隔离,配置项越多,复杂度就越高,把这几个配置对齐后,还需要再对齐事务分组名和server的cluster更是复杂,许多人栽倒在这。 2.配置中心,将本地化事务分组信息放到了远程配置中心,许多人因为本地也配置了,远程也配置了,导致傻傻分不清到底哪个生效,而seata日志也没有输出到底读的是远程配置中心中的配置,还是本地的配置。某些配置只读远程,某些配置又只读本地,比如注册中心的配置,理论上有配置中心,注册中心的配置就可以放到配置中心里拉取。使用体验上不太友好。 如果说没有配置中心和注册中心,单靠k8s configmap挂载统一配置,就不会有这么复杂,而注册中心上应该不要暴露这么多可配置项,只需要一个cluster统一作为资源隔离即可,这样复杂度会指数级下降,但是又会牵涉到向下兼容问题,所以seata需要自闭环,自身作为配置注册中心,避开其他的第三方注册中心,不能在这方面随波逐流。 统一将事务分组注册到seata-server中,就跟kafka创建topic到broker中一样,client配置topic获取元数据,发送消息到对应的partition leader中一样,把事务分组配置后,通过事务分组获取到seata-server集群(不要再有什么namespace,group啥的了),请求到seata-server中进行分布式事务相关动作

0

抱歉,之前给nacos弄混了,以为服务就是集群,实则服务下的多个实例,可通过集群隔离,也就是说服务下包含多个集群。 seata在注册nacos后,seata的异地多机房容灾中不同机房就对应不同cluster(集群)。 seata的异地多机房容灾的实现,在集成注册中心,注册中心就可实现,seata的事务分组似乎还是会显得多余,然后说后期需要自闭环,但那是后面的事。 就目前而言seata的异地多机房容灾的实现是注册中心实现还是seata自己实现。或者是两者协调配合? seata的事务分组目前是为了配合各注册中心实现异地多机房容灾嘛?

3

是的,跟第三方注册配置中心结合后,这个事务分组就变成有点多余了,因为已经可以按照注册中心的group,namespace之类的方式来切换集群了。这个跟dubbo那边的group面临的问题也是一样的,dubbo自带一个资源隔离的group和registry上的group(zk的node),在zk上由于没有这些什么group,namespace,cluster,application概念,这个东西是靠注册方和订阅方约定即可。而到了nacos上,出现了这些参数后,除非完全拥抱注册中心的做法,否则就是存在原本框架层之前的约定规则与注册中心冲突,如seata的事务分组和dubbo的group。