首页 > 其他分享 >「微服务」Saga 模式 如何使用微服务实现业务事务-第二部分

「微服务」Saga 模式 如何使用微服务实现业务事务-第二部分

时间:2024-01-08 16:04:16浏览次数:25  
标签:事务 服务 Saga 命令 回复 参与者


「微服务」Saga 模式 如何使用微服务实现业务事务-第二部分_架构师

在上一篇文章中,我们看到了实现分布式事务的一些挑战,以及如何使用Event / Choreography方法实现Saga的模式。在本文中,我们将讨论如何通过使用另一种类型的Saga实现(称为Command或Orchestration)来解决一些问题,如复杂事务或事件的循环依赖性。

Saga的命令/编曲序列逻辑

在编曲方法中,我们定义了一项新服务,其唯一责任是告诉每个参与者该做什么以及何时做什么。saga orchestrator以命令/回复方式与每个服务进行通信,告诉他们应该执行哪些操作。

让我们看一下使用我们之前的电子商务示例的样子:

「微服务」Saga 模式 如何使用微服务实现业务事务-第二部分_微服务_02

  1. 订单服务保存挂起的定单并要求Order Saga Orchestrator(OSO)启动创建订单交易。
  2. OSO向付款服务发送执行付款命令,并回复付款已执行消息
  3. OSO向库存服务发送准备订单命令,并回复订单准备消息
  4. OSO向Delivery Service发送Deliver Order命令,并以Order Delivered消息回复

在上面的例子中,Order Saga Orchestrator知道执行“创建订单”事务所需的流程是什么。如果有任何失败,它还负责通过向每个参与者发送命令以撤消先前的操作来协调回滚。

为saga协调器建模的标准方法是状态机,其中每个转换对应于命令或消息。状态机是构建定义明确的行为的极好模式,因为它们易于实现,特别适合测试。

在Saga的命令/编曲中回滚

当你有一个协调器来协调所有事情时,回滚会容易得多:

「微服务」Saga 模式 如何使用微服务实现业务事务-第二部分_微服务_03

使用Saga命令/编曲设计的好处和缺点

基于编排的传奇有各种好处:

避免服务之间的循环依赖,因为saga orchestrator调用saga参与者但参与者不调用orchestrator

  • 集中分布式事务的编排
  • 降低参与者的复杂性,因为他们只需要执行/回复命令。
  • 更容易实施和测试
  • 添加新步骤时,事务复杂性保持线性
  • 回滚更容易管理
  • 如果您有第二个愿意更改同一目标对象的事务,您可以轻松地将其保留在协调器上,直到第一个事务结束。

然而,这种方法仍然存在一些缺点,其中之一是在协调器中集中过多逻辑的风险,最终导致智能协调器告诉哑巴服务该做什么的架构。

Saga的Orchestration模式的另一个缺点是它会略微增加您的基础架构复杂性,因为您需要管理额外的服务。

Saga(传奇)模式提示

  • 为每个事务创建唯一ID

为每个事务提供唯一标识符是可追溯性的常用技术,但它也有助于参与者以标准方式相互请求数据。例如,通过使用交易ID,交付服务可以询问库存服务在哪里提取产品,如果订单已付款,则可以使用支付服务仔细检查。

  • 在命令中添加回复地址

不要将参与者设计为回复固定地址,而是考虑在消息中发送回复地址,这样您就可以让参与者回复多个协调者。

  • 幂等运算

如果您使用队列进行服务之间的通信(如SQS,Kafka,RabbitMQ等),我个人建议您使您的操作具有幂等性。大多数队列可能会两次传递相同的消息。

它还可能会增加您的服务的容错能力。通常,客户端中的错误可能会触发/重放不需要的消息并弄乱您的数据库。

  • 避免同步通信

随着事务的进行,不要忘记将每个要执行的操作所需的所有数据添加到消息中。整个目标是避免服务之间的同步调用只是为了请求更多的数据。即使其他服务处于脱机状态,它也可以使您的服务执行本地事务。

缺点是您的协调器会稍微复杂一些,因为您需要操纵每个步骤的请求/响应,因此请注意权衡。

公众号:【架构师酒馆】


标签:事务,服务,Saga,命令,回复,参与者
From: https://blog.51cto.com/jiagoushipro/9146190

相关文章

  • DreadHunger恐惧饥荒海上狼人杀服务器搭建架设教程windows系统
    DreadHunger恐惧饥荒海上狼人杀服务器搭建架设教程windows系统大家好我是艾西,在11月底我有发文DreadHunger恐惧饥荒海上狼人杀官方停服的消息,当时在官方的公告模版中公布了在2024年一月一日会将服务端公开让喜欢玩这个游戏的玩家能够继续的快乐其中。经过漫长的等待DreadHunger工作......
  • 鸿蒙原生应用/元服务开发-消息通知整体说明
    应用/元服务可以通过通知接口发送通知消息,终端用户可以通过通知栏查看通知内容,也可以点击通知来打开应用。通知常见的使用场景:显示接收到的短消息、即时消息等。显示应用的推送消息,如广告、版本更新等。显示当前正在进行的事件,如下载等。HarmonyOS通过ANS(AdvancedNotificationSer......
  • systemd管理服务
    一、systemd简介Systemd是一款用于Linux操作系统的系统和服务管理工具,在RHEL7之前使用init来初始化系统,从RHEL7之后开始使用systemd来初始化系统,也就是操作系统启动时运行的第一个程序systemd对比init的优势:systemd是并行启动 init是串行启动systemd启动更快;而init相对较慢init通......
  • 数据访问控制的事务处理与一致性保障
    1.背景介绍数据访问控制(DataAccessControl,DAC)是一种基于访问控制列表(AccessControlList,ACL)的安全机制,它允许系统用户在请求访问某个对象时,根据其具有的权限来决定是否允许访问。这种机制在数据库系统、文件系统和网络系统中都有广泛应用。在数据库系统中,事务处理(Transactio......
  • Lua网络爬虫实战:使用http服务器获取虾皮商品信息的全过程
    这段Lua代码是一个简单的爬虫示例,使用了Lua中的http模块进行网络请求,并设置了代理信息。以下是对代码的一些解释和注意事项:安装http模块:luarocksinstallhttp这个命令用于安装Lua的http模块,以便在程序中使用HTTP请求功能。代理设置:localproxy_host="www.duoip.cn......
  • linux下使用heartbeat做HA集群,把nginx作为HA对应的服务
    通过安装该Linux-HA软件,可以实现Linux双机系统的高可用性解决方案,实现双机系统的热备份,并能够做到双机之间的无缝切换,从而对外提供稳定可靠的服务,最终实现系统高性能RAS(reliability,availability,andserviceability)。这里使用heartbeat来做HA集群,并且把nginx服务作为HA对应的服......
  • 这个开源项目,让你轻松搭建属于自己的云存储服务!
    大家好,我是Java陈序员。我们在工作生活中,难免会有一些学习资料、文档,或者是生活中记录下来的精彩瞬间。大家是如何保存这些文件的呢?可能有些文件仅仅是保存在本地的终端中,手机、电脑等。如果本地存储满了,会考虑将文件上传到云盘中。如果你有自己的服务器,强烈建议你自己搭建一个云......
  • 云智一体,大模型服务的超级工厂
    随着云计算和人工智能技术的快速发展,云智一体已成为新的发展趋势。云智一体将云计算的高效计算能力和人工智能的智能决策能力相结合,为企业提供更高效、智能的服务。在近期的一次演讲中,百度沈抖阐述了云智一体的优势,并提出了打造大模型服务的“超级工厂”的构想。首先,云智一体的优势......
  • 关于消耗服务器带宽的因素
    关于消耗服务器带宽的因素1、网站布局更改:如果更改网站布局,那么网站页面大小就会增加,用户在访问时获取的数据也会越大,那么对于服务器带宽的消耗当然也就会变得更大。2、流量增长:访客增加的情况下,用户浏览页面数据就会增加,也就会加大对带宽的消耗。3、页面增加:当添加更多页面时,浏览......
  • LiveSIPB流媒体国网B接口功能-国网B接口服务安装使用说明
    LiveSIPB国网B接口服务安装使用说明1、服务说明1.1、安装包说明1.2、国网B接口信令服务1.3、国网B接口流媒体服务1.4、配置信令服务(LiveCMS)1.5、配置流媒体服务(LiveSMS)2、服务运行2.1、Windows2.2、Linux3、配置设备接入3.1、海康STATE_GRID接入示例4、平台使用4.1、管理平台......