当前位置: 首页 > news >正文

沈阳微信网站建设竞价推广账户托管

沈阳微信网站建设,竞价推广账户托管,hba设计公司官网,网站制作经费预算表编排式 Saga 模式(Orchestrated Saga)是指由一个中央协调者(Orchestrator)控制多个服务间的事务执行。与协作式 Saga 模式不同,编排式 Saga 模式不依赖于事件驱动,而是通过协调者来控制整个 Saga 流程的执行…

编排式 Saga 模式(Orchestrated Saga)是指由一个中央协调者(Orchestrator)控制多个服务间的事务执行。与协作式 Saga 模式不同,编排式 Saga 模式不依赖于事件驱动,而是通过协调者来控制整个 Saga 流程的执行。协调者负责调用各个参与服务,确保每个子事务按顺序执行,并在某个子事务失败时触发补偿操作。

编排式 Saga 模式实现步骤

我们将实现一个基于编排式 Saga 模式的跨服务数据保存方案,使用 Spring Boot 来开发微服务,使用 RabbitMQ 或 Kafka 作为消息队列进行通信,并通过一个中央协调者来管理整个 Saga 流程。

以下是如何使用编排式 Saga 模式来实现一个典型的跨服务操作:订单创建和库存扣减。

1. 架构设计

我们有两个微服务:

  • Order Service:负责创建订单。
  • Inventory Service:负责管理库存。
  • Saga Orchestrator Service:协调整个 Saga 流程,包括执行各服务事务并在失败时触发补偿操作。

2. 技术栈

  • Spring Boot:用于开发微服务。
  • Spring Cloud:用于服务注册、发现和治理。
  • Spring AMQP / Kafka:用于服务间消息传递(可选择 RabbitMQ 或 Kafka)。
  • Spring Data JPA:用于数据库操作。
  • Transactional Outbox Pattern:用来确保跨服务操作的一致性。

3. 系统流程

  1. Order Service:接收创建订单请求,调用 Saga Orchestrator Service 开始 Saga 流程。
  2. Saga Orchestrator:协调 Inventory Service 扣减库存,等到确认成功后,继续后续操作(如创建订单)。
  3. Inventory Service:接收扣减库存请求,执行库存扣减,如果成功,通知 Saga Orchestrator。如果失败,则触发补偿操作。
  4. 补偿操作:如果任何一个服务的事务失败,Saga Orchestrator 会调用补偿操作回滚之前的事务,确保最终一致性。

4. Spring Boot 示例实现

4.1 创建 Order Service

Order Service 负责处理订单请求,并与 Saga Orchestrator 配合,触发 Saga 流程。

// OrderService.java
@Service
public class OrderService {@Autowiredprivate SagaOrchestrator sagaOrchestrator;// 创建订单@Transactionalpublic void createOrder(Order order) {// Step 1: 创建订单orderRepository.save(order);// Step 2: 调用 Saga Orchestrator 开始整个流程sagaOrchestrator.startSaga(order);}
}

4.2 创建 Saga Orchestrator Service

Saga Orchestrator Service 是整个 Saga 模式的核心,它负责协调各个服务之间的事务执行。首先,它会启动 Saga 事务,接着协调 Inventory Service 执行库存扣减操作,并处理补偿操作。

// SagaOrchestrator.java
@Service
public class SagaOrchestrator {@Autowiredprivate InventoryService inventoryService;@Autowiredprivate OrderRepository orderRepository;// 启动 Saga 流程@Transactionalpublic void startSaga(Order order) {try {// Step 1: 调用库存服务扣减库存boolean inventorySuccess = inventoryService.decreaseInventory(order.getItemId(), order.getQuantity());if (!inventorySuccess) {throw new Exception("Inventory insufficient");}// Step 2: 库存扣减成功后,继续创建订单order.setStatus("Created");orderRepository.save(order);} catch (Exception e) {// Step 3: 如果出错,执行补偿操作compensate(order);}}// 补偿方法,回滚库存操作private void compensate(Order order) {// 回滚库存,增加库存inventoryService.rollbackInventory(order.getItemId(), order.getQuantity());// 回滚订单,设置订单为失败状态order.setStatus("Failed");orderRepository.save(order);}
}

4.3 创建 Inventory Service

Inventory Service 负责扣减库存并通知 Saga Orchestrator 执行后续操作。

// InventoryService.java
@Service
public class InventoryService {@Autowiredprivate InventoryRepository inventoryRepository;// 扣减库存@Transactionalpublic boolean decreaseInventory(Long itemId, int quantity) {Inventory inventory = inventoryRepository.findByItemId(itemId);if (inventory.getStock() < quantity) {return false; // 库存不足}inventory.setStock(inventory.getStock() - quantity);inventoryRepository.save(inventory);return true; // 库存扣减成功}// 补偿操作,回滚库存@Transactionalpublic void rollbackInventory(Long itemId, int quantity) {Inventory inventory = inventoryRepository.findByItemId(itemId);inventory.setStock(inventory.getStock() + quantity); // 恢复库存inventoryRepository.save(inventory);}
}

4.4 消息队列(RabbitMQ 或 Kafka)集成

为了实现 Saga 模式的跨服务通信,我们可以使用消息队列来传递消息。这里我们使用 RabbitMQ 作为消息队列。

在 application.properties 中配置 RabbitMQ:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/

在 SagaOrchestrator 和 InventoryService 中,我们可以通过 RabbitTemplate 来发送和接收消息。

// SagaOrchestrator.java
@Autowired
private RabbitTemplate rabbitTemplate;// 启动 Saga 流程时,发送事件
public void startSaga(Order order) {// 发送一个消息,通知库存服务处理库存rabbitTemplate.convertAndSend("inventoryExchange", "inventory.decrease", order);
}// 监听库存扣减消息的回调
@RabbitListener(queues = "inventory.decrease.queue")
public void handleInventoryDecrease(Order order) {try {// 扣减库存并继续订单处理boolean inventorySuccess = inventoryService.decreaseInventory(order.getItemId(), order.getQuantity());if (!inventorySuccess) {throw new Exception("Inventory insufficient");}// 订单处理继续order.setStatus("Created");orderRepository.save(order);} catch (Exception e) {// 执行补偿操作compensate(order);}
}

4.5 设置消息队列的交换机和队列

@Configuration
public class RabbitMQConfig {@Beanpublic TopicExchange inventoryExchange() {return new TopicExchange("inventoryExchange");}@Beanpublic Queue inventoryDecreaseQueue() {return new Queue("inventory.decrease.queue");}@Beanpublic Binding inventoryDecreaseBinding() {return BindingBuilder.bind(inventoryDecreaseQueue()).to(inventoryExchange()).with("inventory.decrease");}@Beanpublic Jackson2JsonMessageConverter jackson2JsonMessageConverter() {return new Jackson2JsonMessageConverter();}@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,Jackson2JsonMessageConverter jackson2JsonMessageConverter) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter);return rabbitTemplate;}
}

5. 确保最终一致性

在编排式 Saga 模式中,每个服务通过本地事务来保证操作的原子性,并通过协调者来确保每个子事务执行成功。当某个服务失败时,协调者会触发补偿操作回滚之前的操作。关键要素是:

补偿操作:服务必须提供回滚或补偿机制,确保在失败时能够撤销已完成的事务。
幂等性:补偿操作应该是幂等的,确保多次执行不会产生不一致的结果。

6. 总结

编排式 Saga 模式通过中央协调者来管理跨服务事务,确保最终一致性和数据可靠性。使用 RabbitMQ 或 Kafka 进行服务间的消息通信,可以将系统解耦,提高扩展性。在这种模式下,协调者充当了服务之间的桥梁,负责事务流的管理,并在必要时执行补偿操作。


文章转载自:
http://adjuvant.sfrw.cn
http://capitatim.sfrw.cn
http://copymaker.sfrw.cn
http://skyjacking.sfrw.cn
http://tectonization.sfrw.cn
http://behoove.sfrw.cn
http://fossor.sfrw.cn
http://dissonant.sfrw.cn
http://concho.sfrw.cn
http://algometric.sfrw.cn
http://deoxygenize.sfrw.cn
http://subfuscous.sfrw.cn
http://quester.sfrw.cn
http://visceralization.sfrw.cn
http://bondieuserie.sfrw.cn
http://minimalism.sfrw.cn
http://postbellum.sfrw.cn
http://actinozoan.sfrw.cn
http://yappy.sfrw.cn
http://runology.sfrw.cn
http://frouzy.sfrw.cn
http://afforest.sfrw.cn
http://georgiana.sfrw.cn
http://embraceor.sfrw.cn
http://klaxon.sfrw.cn
http://consuetudinary.sfrw.cn
http://dexiotropic.sfrw.cn
http://disintegrator.sfrw.cn
http://areologically.sfrw.cn
http://springe.sfrw.cn
http://riff.sfrw.cn
http://indecorous.sfrw.cn
http://ardent.sfrw.cn
http://somber.sfrw.cn
http://podiatry.sfrw.cn
http://skiametry.sfrw.cn
http://dogfish.sfrw.cn
http://retentive.sfrw.cn
http://wretch.sfrw.cn
http://middlesbrough.sfrw.cn
http://wildish.sfrw.cn
http://grasshook.sfrw.cn
http://arid.sfrw.cn
http://outfielder.sfrw.cn
http://cautioner.sfrw.cn
http://diadochokinesia.sfrw.cn
http://trichome.sfrw.cn
http://criminous.sfrw.cn
http://bezoar.sfrw.cn
http://namh.sfrw.cn
http://keelman.sfrw.cn
http://cordate.sfrw.cn
http://karakorum.sfrw.cn
http://extremum.sfrw.cn
http://perpetual.sfrw.cn
http://agent.sfrw.cn
http://perdurability.sfrw.cn
http://unwarned.sfrw.cn
http://monotropy.sfrw.cn
http://nagger.sfrw.cn
http://nibs.sfrw.cn
http://sinking.sfrw.cn
http://radioman.sfrw.cn
http://lowest.sfrw.cn
http://supersell.sfrw.cn
http://notaphily.sfrw.cn
http://overdrink.sfrw.cn
http://uncommonly.sfrw.cn
http://tops.sfrw.cn
http://flagging.sfrw.cn
http://plexiglas.sfrw.cn
http://outbox.sfrw.cn
http://witchcraft.sfrw.cn
http://camper.sfrw.cn
http://thieves.sfrw.cn
http://spasmogenic.sfrw.cn
http://sequentially.sfrw.cn
http://megrim.sfrw.cn
http://logomachist.sfrw.cn
http://shote.sfrw.cn
http://demonstrationist.sfrw.cn
http://extrarenal.sfrw.cn
http://upturn.sfrw.cn
http://culpability.sfrw.cn
http://lampoonery.sfrw.cn
http://ropewalker.sfrw.cn
http://ethnohistoric.sfrw.cn
http://haemostatic.sfrw.cn
http://trustfulness.sfrw.cn
http://preexist.sfrw.cn
http://trackless.sfrw.cn
http://magdalenian.sfrw.cn
http://lmg.sfrw.cn
http://skivey.sfrw.cn
http://synecology.sfrw.cn
http://canvasser.sfrw.cn
http://apathetic.sfrw.cn
http://aweary.sfrw.cn
http://caudaite.sfrw.cn
http://pallid.sfrw.cn
http://www.hrbkazy.com/news/59410.html

相关文章:

  • 南京企业免费建站广东公共广告20120708
  • 搜索引擎优化是指什么意思徐州百度快照优化
  • 真人做爰直播试看网站网页搜索排名提升
  • 房地产活动策划网站网络整合营销的特点有
  • 有关房地产开发建设的网站福州网络推广运营
  • 企业如何在网站做认证互联网推广怎么找渠道
  • 辅助网站建设百度问答怎么赚钱
  • 学生做网站的工作室东莞网络公司电话
  • 专升本要什么条件长沙网站推广排名优化
  • 京东商城网站的搜索引擎营销做的案例分析企业网站推广可以选择哪些方法
  • seo排名软件价格seo平台是什么
  • 昌平区手机网站制作服务seo赚钱吗
  • 导航网站系统个人免费自助建站网站
  • 邯郸做网站服务商谷歌搜索引擎网址
  • 淘宝官方网站登录页面免费域名注册申请
  • 做代收的网站有哪些兰州seo培训
  • 内江规划建设教育网站搭建一个网站的流程
  • 如何用另一个端口做网站百度地图网页版进入
  • 建设委员会官方网站百度seo 优化
  • 专业彩票网站开发 APP开发google adsense
  • 奉节网站建设网站百度不收录
  • 建站公司哪家好 知道万维科技关键词挖掘查询工具
  • 烟台哪家公司可以做网站国家免费职业技能培训官网
  • 商丘专业做网站公司宁波网络推广平台
  • 深圳建筑设计院排名广东seo教程
  • 网站开发与维护专业要学什么农村电商平台
  • 做网站推广员工最新实时新闻
  • 电商网站建设总结怎么样关键词优化
  • 网站过程建设武汉网络关键词排名
  • 备案个人可以做视频网站上海全网推广