最近在团队里,讨论技术规划的时候,出现了一个争论,到底是先做Seata分布式事务,还是先做DevOps流水线。一部分同事认为,现在微服务架构下,分布式事务的问题越来越突出,经常出现数据不一致的问题,应该先做Seata分布式事务,解决数据一致性的问题。另一部分同事认为,现在的发布效率太低,每次发布都要手动操作,很容易出错,而且很耗时,应该先做DevOps流水线,提升发布效率和质量。
两边都有道理,争论了很久,也没达成一致。今天这篇文章,就来聊聊这个话题,Seata分布式事务和DevOps流水线,到底该选哪个,它们各自解决什么问题,适用什么场景,以及,在不同的团队阶段,该如何选择和平衡。
一、先说说,为什么会有这个争论
先说说,为什么会有这个争论。
我们团队,这两年,在做微服务改造,把原来的单体应用,拆成了几十个微服务。微服务架构,确实带来了很多好处,比如,服务独立部署,独立扩展,技术栈灵活,团队协作高效,等等。但是,也带来了很多新的问题,其中,最突出的两个问题,就是分布式事务,和发布效率。
先说分布式事务的问题。单体应用的时候,所有的操作,都在一个数据库里,用本地事务,就能保证数据一致性,很简单。但是,拆成微服务之后,一个业务操作,可能会调用多个服务,操作多个数据库,这时候,本地事务就没用了,因为,每个服务,都有自己的数据库,不能用一个本地事务,来覆盖多个服务。这就导致,经常出现数据不一致的问题,比如,订单服务创建了订单,但是,库存服务扣库存失败了,或者,支付服务扣款成功了,但是,订单服务更新状态失败了,等等,这些问题,都会导致数据不一致,影响业务,甚至,造成资金损失。
我们团队,现在就经常遇到这样的问题,每个月,都会有几起数据不一致的故障,需要人工去修复,很麻烦,也很影响业务。所以,一部分同事认为,应该先做Seata分布式事务,解决数据一致性的问题,这是当务之急。
再说发布效率的问题。单体应用的时候,就一个应用,发布很简单,打包,部署,就行了,虽然发布的时候,要停机,但是,操作简单,不容易出错。但是,拆成微服务之后,有几十个服务,每次发布,可能要发布好几个服务,每个服务,都要打包,上传,部署,重启,验证,而且,服务之间还有依赖关系,发布的顺序,也很重要。现在,我们还是手动发布,每次发布,都要花好几个小时,而且,很容易出错,比如,漏发了一个服务,或者,发布顺序错了,或者,配置改错了,等等,每次发布,都提心吊胆的,而且,发布频率也很低,一般一周才发布一次,很多功能,开发完了,要等很久,才能上线。
所以,另一部分同事认为,应该先做DevOps流水线,实现自动化构建,自动化测试,自动化部署,提升发布效率和质量,这也是当务之急。
两边说的,都很有道理,都是现在团队面临的,很迫切的问题,但是,团队的资源有限,不可能同时做,所以,就有了这个争论,到底该先做哪个。
二、Seata分布式事务,解决什么问题
再详细说说,Seata分布式事务,解决什么问题,它的价值是什么。
1. 解决微服务架构下的数据一致性问题
Seata,是阿里开源的分布式事务框架,致力于提供高性能和简单易用的分布式事务服务。它支持AT、TCC、SAGA、XA等多种事务模式,能解决微服务架构下,跨服务、跨数据库的数据一致性问题。
简单来说,Seata能让你,在微服务架构下,像使用本地事务一样,使用分布式事务,只需要加一个注解,就能保证,多个服务的操作,要么都成功,要么都失败,不会出现部分成功,部分失败,导致数据不一致的问题。
比如,下单的场景,订单服务创建订单,库存服务扣库存,支付服务扣款,这三个操作,用Seata的分布式事务,就能保证,要么都成功,要么都失败,不会出现,订单创建了,但是库存没扣,或者,扣款成功了,但是订单状态没更新,这样的数据不一致问题。
对于电商、金融、支付等,对数据一致性要求很高的业务来说,分布式事务,是必须的,不然,数据不一致,会造成很大的业务问题,甚至,资金损失。
2. 减少人工修复数据的成本,提升业务稳定性
没有分布式事务的时候,出现数据不一致的问题,只能靠人工去修复,比如,查日志,找问题,然后,手动改数据库,补数据,或者,回滚数据。这个过程,很耗时,也很容易出错,而且,修复不及时,还会影响业务,造成用户投诉,甚至,资金损失。
有了Seata分布式事务之后,大部分的数据不一致问题,都能从根源上避免,不需要人工修复了,大大减少了人工成本,也提升了业务的稳定性。而且,就算出现问题,Seata也有日志,有回滚机制,能快速定位,快速恢复,比人工修复,高效很多。
3. 降低业务开发的复杂度
没有分布式事务的时候,开发人员,在写业务代码的时候,要自己处理分布式事务的问题,比如,写补偿逻辑,写重试逻辑,写对账逻辑,等等,很复杂,也很容易出错,而且,每个业务,都要写一遍,重复开发,成本很高。
有了Seata分布式事务之后,开发人员,不需要自己处理分布式事务的问题了,只需要加一个注解,就能保证数据一致性,大大降低了业务开发的复杂度,提升了开发效率。而且,统一的分布式事务框架,也便于维护,便于治理,比每个业务自己写补偿逻辑,要可靠很多。
三、DevOps流水线,解决什么问题
再详细说说,DevOps流水线,解决什么问题,它的价值是什么。
1. 提升发布效率,缩短交付周期
DevOps流水线,能实现自动化构建,自动化测试,自动化部署,大大提升发布效率,缩短交付周期。原来手动发布,一次要花好几个小时,而且,一周才发布一次;有了DevOps流水线之后,一次发布,可能只需要十几分钟,而且,可以做到,每天发布,甚至,随时发布,功能开发完了,很快就能上线,大大缩短了交付周期,能更快地响应业务需求,更快地验证产品想法。
对于互联网公司来说,发布效率,很重要,因为,市场变化很快,竞争很激烈,谁能更快地发布功能,更快地响应市场,谁就能占得先机。DevOps流水线,能大大提升发布效率,让团队,更敏捷,更高效。
2. 提升发布质量,减少发布故障
手动发布的时候,很容易出错,比如,漏发服务,发布顺序错了,配置改错了,环境不一致,等等,这些问题,都会导致发布故障,影响业务。而且,手动发布,没有标准化的流程,每个人的操作,都不一样,质量参差不齐,很容易出问题。
有了DevOps流水线之后,发布流程,标准化了,自动化了,所有的操作,都由流水线自动完成,不需要人工干预,大大减少了人为错误,提升了发布质量。而且,流水线里,可以集成自动化测试,代码扫描,安全检查,等等,在发布之前,就能发现问题,避免有问题的代码,发布到线上,进一步提升了发布质量。
而且,流水线里,还可以集成灰度发布,蓝绿发布,回滚机制,等等,就算发布出了问题,也能快速回滚,减少影响,提升了发布的安全性。
3. 提升团队协作效率,减少沟通成本
手动发布的时候,需要开发、测试、运维,多个角色配合,沟通成本很高,而且,很容易出现,信息不对称,责任不清晰的问题。比如,开发说,我把包给运维了,运维说,我没收到,或者,测试说,这个功能还没测完,开发说,已经发布了,等等,这些沟通问题,都会影响发布效率,也会影响团队氛围。
有了DevOps流水线之后,发布流程,透明化了,标准化了,每个角色,都知道,自己该做什么,什么时候做,而且,流水线的状态,所有人都能看到,不需要反复沟通,大大减少了沟通成本,提升了团队协作效率。而且,责任也清晰了,出了问题,能快速定位,是谁的问题,怎么解决。
而且,DevOps的理念,是开发和运维一体化,打破开发和运维之间的壁垒,让开发,也参与到运维中,让运维,也参与到开发中,大家一起,对产品的质量和稳定性负责,这样,团队的协作,会更顺畅,更高效。
四、两者的对比和分析
说了这么多,我们来对比分析一下,Seata分布式事务和DevOps流水线,它们的区别,以及,各自的优先级。
1. 解决的问题不同
Seata分布式事务,解决的是,数据一致性的问题,属于业务层面的问题,它影响的是,业务的正确性,和数据的可靠性。如果数据不一致,会直接影响业务,甚至,造成资金损失,用户投诉。
DevOps流水线,解决的是,发布效率和质量的问题,属于工程效能层面的问题,它影响的是,交付的速度,和发布的稳定性。如果发布效率低,质量差,会影响功能上线的速度,也可能会导致发布故障,影响业务。
两者解决的问题,不一样,但是,都很重要,都是微服务架构下,必须解决的问题。
2. 投入成本不同
Seata分布式事务的投入成本,相对来说,低一些,因为,Seata是一个成熟的开源框架,部署和接入,都比较简单,一般,一两周,就能部署好,接入几个核心业务,就能看到效果。当然,如果要全公司推广,接入所有业务,可能需要更长时间,但是,整体来说,投入成本,不算太高。
DevOps流水线的投入成本,相对来说,高一些,因为,DevOps流水线,涉及到,工具选型,流程设计,自动化测试,代码扫描,安全检查,灰度发布,等等,很多方面,而且,要和团队的现有流程,现有工具,整合起来,需要花很多时间,很多精力。一般,搭建一套完整的DevOps流水线,可能需要一两个月,甚至更长时间,而且,后续还要持续优化,持续运营,投入很大。
当然,投入成本,也和团队的规模,现有的基础,有关系,如果团队,已经有一些基础的工具,比如,Jenkins,GitLab,那么,搭建流水线,会快一些;如果,什么都没有,从零开始,那就会慢很多。
3. 见效时间不同
Seata分布式事务,见效比较快,接入之后,马上就能看到效果,数据不一致的问题,大大减少,人工修复的成本,大大降低,业务的稳定性,大大提升。而且,效果很直观,很容易量化,比如,之前,每个月有5起数据不一致的故障,接入之后,可能只有1起,甚至0起,效果很明显。
DevOps流水线,见效相对慢一些,因为,搭建流水线,需要时间,而且,流水线的效果,是逐步体现的,不是一蹴而就的。比如,刚开始,可能只实现了,自动化构建和部署,发布效率,提升了一些;后来,集成了自动化测试,发布质量,提升了一些;再后来,集成了灰度发布,回滚机制,发布的安全性,提升了一些。整个过程,是逐步优化的,需要持续投入,持续运营,才能看到明显的效果。
而且,DevOps流水线的效果,也比较难量化,比如,发布效率提升了多少,发布质量提升了多少,团队协作效率提升了多少,这些,都需要长期的数据积累,才能看出来。
4. 风险不同
Seata分布式事务的风险,相对来说,低一些,因为,Seata是一个成熟的框架,很多公司都在用,经过了生产环境的验证,比较稳定。而且,接入的时候,可以先从非核心业务开始,慢慢推广,风险可控。就算出了问题,也有回滚机制,能快速恢复。
当然,Seata也有风险,比如,性能问题,分布式事务,会有一定的性能损耗,对于高并发的场景,可能会有影响;还有,可用性问题,Seata的Server(TC),如果挂了,会影响分布式事务,所以,要做好高可用。但是,这些问题,都有成熟的解决方案,风险可控。
DevOps流水线的风险,相对来说,高一些,因为,流水线,涉及到发布,一旦流水线出了问题,比如,构建失败,部署失败,配置错误,等等,都会影响发布,甚至,导致线上故障。而且,流水线的流程设计,如果不合理,可能会导致,发布效率更低,或者,发布质量更差,反而起反作用。
而且,DevOps流水线,还涉及到,工具的选型,团队的适应,流程的变革,等等,这些,都可能会遇到阻力,比如,团队成员,习惯了手动发布,不愿意用流水线,或者,觉得流水线太复杂,不好用,等等,这些,都会影响流水线的推广和效果。
五、到底该选哪个
说了这么多,可能大家最关心的问题就是,到底该选哪个?
我的答案是,没有绝对的答案,要根据团队的实际情况,来决定,不同的团队,不同的阶段,优先级不一样。
1. 如果数据一致性问题,已经严重影响业务,那么,先做Seata
如果,你的团队,现在,数据不一致的问题,很严重,经常出现,每个月,都有好几起,而且,已经造成了,业务损失,用户投诉,甚至,资金损失,那么,我建议,先做Seata分布式事务,因为,这是火烧眉毛的问题,必须马上解决,不然,会造成更大的损失。
而且,Seata的投入成本,相对低,见效快,风险可控,先做Seata,能快速解决,最迫切的问题,然后,再慢慢做DevOps流水线。
比如,我们团队,后来就是先做了Seata,因为,数据不一致的问题,已经影响到了核心业务,每个月,都要花很多时间,人工修复数据,而且,有一次,还造成了资金损失,老板很重视,所以,我们先花了两周,部署了Seata,接入了核心业务,数据不一致的问题,马上就少了很多,效果很明显。
2. 如果发布效率低,已经严重影响产品迭代,那么,先做DevOps
如果,你的团队,现在,发布效率很低,质量很差,已经严重影响了产品迭代,比如,功能开发完了,要等一两周,才能上线,或者,每次发布,都出问题,导致线上故障,那么,我建议,先做DevOps流水线,因为,发布效率,直接影响产品的迭代速度,和市场竞争力,如果发布太慢,功能不能及时上线,就会错过市场机会,被竞争对手超越。
而且,DevOps流水线,虽然投入大,见效慢,但是,它是长期的基础设施,一旦搭建好,能长期受益,大大提升团队的工程效能,和产品的交付能力。
比如,我之前待过的一个团队,就是先做了DevOps流水线,因为,那时候,我们的产品,迭代很快,每周都要发布好几次,但是,手动发布,效率太低,而且,经常出错,已经严重影响了产品的迭代,所以,我们花了一个多月,搭建了一套完整的DevOps流水线,实现了自动化构建,自动化测试,自动化部署,灰度发布,等等,发布效率,大大提升,从原来的,一次发布几个小时,变成了,一次发布十几分钟,而且,发布质量,也大大提升,很少出问题,产品的迭代速度,也快了很多。
3. 如果两个问题,都很迫切,那么,可以并行做,或者,分阶段做
如果,你的团队,两个问题,都很迫切,都需要马上解决,那么,可以考虑,并行做,或者,分阶段做。
并行做,就是,分成两个小组,一个小组,做Seata,另一个小组,做DevOps流水线,同时进行,这样,两个问题,都能解决,但是,需要更多的人力,如果团队人手不够,就不太现实。
分阶段做,就是,先做一个,快速见效,解决最迫切的问题,然后,再做另一个,解决长期的问题。比如,先花两周,做Seata,解决数据一致性的问题,然后,再花一两个月,做DevOps流水线,解决发布效率的问题。这样,既能快速解决,最迫切的问题,又能逐步解决,长期的问题,比较稳妥。
我们团队,后来就是分阶段做的,先做了Seata,用了两周,接入了核心业务,解决了数据一致性的问题,然后,再慢慢做DevOps流水线,花了一个多月,搭建了一套基础的流水线,然后,持续优化,现在,发布效率和质量,都提升了很多。
4. 不管先做哪个,都要做好规划,循序渐进
不管,你先做哪个,都要做好规划,循序渐进,不要想着,一步到位,一下子,就把所有的事情,都做完,那样,不现实,也容易出问题。
做Seata的时候,可以先从非核心业务开始,或者,先从一两个核心业务开始,验证效果,积累经验,然后,再慢慢推广到所有业务。不要一开始,就全公司推广,那样,风险大,也容易出问题。
做DevOps流水线的时候,可以先从基础的开始,比如,先实现自动化构建和部署,解决最基本的发布效率问题,然后,再慢慢集成,自动化测试,代码扫描,安全检查,灰度发布,等等,逐步完善,持续优化。不要一开始,就想做一套,完美的流水线,那样,会花很多时间,而且,团队也不一定能适应。
而且,不管做哪个,都要和团队,做好沟通,让大家理解,为什么要做,做了有什么好处,争取大家的支持,不然,推行的时候,会遇到阻力,效果也不好。
六、我的建议和总结
最后,总结一下,我的建议。
Seata分布式事务和DevOps流水线,都是微服务架构下,必须解决的问题,都很重要,没有绝对的,谁先谁后,要根据团队的实际情况,来决定。
如果,数据一致性问题,已经严重影响业务,造成了损失,那么,先做Seata,快速解决,最迫切的问题。
如果,发布效率低,已经严重影响产品迭代,和市场竞争力,那么,先做DevOps流水线,解决长期的工程效能问题。
如果,两个问题,都很迫切,那么,可以并行做,或者,分阶段做,先做见效快的,再做见效慢的。
不管,先做哪个,都要做好规划,循序渐进,不要一步到位,也不要半途而废。
而且,从长远来看,这两个,都要做,因为,它们解决的是,不同层面的问题,都是微服务架构下,必不可少的基础设施。Seata,保证业务的正确性和数据的可靠性;DevOps流水线,保证交付的效率和质量。两者结合,才能让微服务架构,真正发挥它的优势,让团队,更高效,更稳定,更敏捷。
希望今天的分享,能给正在面临同样选择的团队,一些参考和帮助,也欢迎大家,在评论区,分享你们的经验和看法,一起交流,一起进步。
愿我们都能,根据自己团队的实际情况,做出正确的选择,解决好团队面临的问题,让团队,更高效,更稳定,更敏捷。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录