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

网站建设介绍一手渠道推广平台

网站建设介绍,一手渠道推广平台,建筑模板批发,四川省城乡住房建设部网站首页Seata 与消息队列(如 RocketMQ)结合实现最终一致性,通常采用 “本地事务消息表 异步通知” 的混合模式,核心思路是通过 Seata 保障核心业务事务的原子性,利用消息队列实现跨服务异步解耦。以下是完整实现方案&#xf…

Seata 与消息队列(如 RocketMQ)结合实现最终一致性,通常采用 “本地事务消息表 + 异步通知” 的混合模式,核心思路是通过 Seata 保障核心业务事务的原子性,利用消息队列实现跨服务异步解耦。以下是完整实现方案:


架构设计原理

1. 开启Seata全局事务
2. 执行业务SQL
3. 写本地消息表
4. 提交Seata事务
5. 轮询消息表
6. 发送事务消息
7. 消费消息
8. 执行业务
协调
协调
服务A
Seata TC
业务DB
消息中继
RocketMQ
服务B
下游DB

七步实现最终一致性

步骤1:业务服务A(发起方)
  1. 开启Seata全局事务
    @GlobalTransactional 注解开启分布式事务
  2. 执行业务SQL
    更新本地业务数据库(如订单状态)
  3. 写入本地消息表
    在同一个本地事务中写入消息记录(保证原子性)
    INSERT INTO local_message (id, biz_id, mq_topic, mq_body, status) 
    VALUES ('msg001', 'order123', 'INVENTORY_TOPIC', '{"productId":100,"delta":-1}', 'UNSENT');
    
步骤2:Seata事务提交
  1. Seata提交全局事务
    • TC 协调所有分支事务(包括本地消息表写入)
    • 若全部成功:全局事务提交
    • 任一失败:全局事务回滚(自动清理本地消息表)
步骤3:消息中继服务
  1. 轮询本地消息表
    定时扫描 status='UNSENT' 的消息
  2. 发送RocketMQ事务消息
    TransactionSendResult result = producer.sendMessageInTransaction(new Message("INVENTORY_TOPIC", message.getBody()), localMessage.getId() // 事务ID
    );
    
  3. 更新消息状态
    消息发送成功后更新状态为 SENT
步骤4:下游服务B
  1. 监听并消费消息
    @RocketMQMessageListener(topic = "INVENTORY_TOPIC", consumerGroup = "inventory-group")
    public void deductInventory(Message msg) {// 解析消息体InventoryDTO dto = JSON.parse(msg.getBody());// 执行库存扣减(可嵌套Seata事务)inventoryService.deduct(dto.getProductId(), dto.getDelta());
    }
    
  2. 保证消费幂等性
    通过唯一业务ID(如订单号)避免重复处理

关键技术保障

1. 消息可靠性机制
环节保障措施
消息生产不丢失Seata事务保证消息写入本地表与业务操作原子性
消息投递不丢失RocketMQ事务消息(半消息机制)+ 中继服务重试(3次以上)
消息消费不丢失RocketMQ ACK机制 + 消费者重试队列
防消息堆积动态调整消费者并发数 + 死信队列监控
2. 最终一致性兜底方案
  • 消息状态校对
    独立定时任务扫描本地消息表:

    SELECT * FROM local_message 
    WHERE status = 'UNSENT' AND created_time < NOW() - INTERVAL '5 MINUTE';
    
    • 对未发送消息重新投递
    • 对已发送未ACK消息人工介入
  • 业务对账补偿
    日终对账服务检查业务状态一致性:

    # 伪代码示例
    for order in unpaid_orders:if inventory_reserved(order.product_id): trigger_compensation(order)  # 触发库存释放
    

Seata与RocketMQ的深度集成优化

方案1:Seata-RocketMQ Connector
// 自动将Seata事务与RocketMQ事务绑定
@GlobalTransactional
public void createOrder(Order order) {orderDAO.insert(order);// 自动发送事务消息(无需手动写消息表)rocketMQTemplate.sendInTransaction("INVENTORY_TOPIC", MessageBuilder.withPayload(order).build());
}

实现原理
通过 Seata RMHandler 拦截器,在分支事务注册时同步注册 RocketMQ 事务

方案2:基于CDC的消息发布
解析binlog
业务DB
Debezium CDC
Kafka
Stream Processing
RocketMQ
  • 优势:业务零侵入,数据库变更自动触发消息
  • 挑战:需要解决消息顺序性和重复消费

对比传统方案

方案一致性保障性能复杂度适用场景
Seata+本地消息表⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️通用场景
纯MQ事务消息⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️简单跨服务事务
TCC模式⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️强一致性金融场景
Saga模式⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️长事务+高并发

生产实践建议

  1. 消息表设计优化

    CREATE TABLE local_message (id BIGINT PRIMARY KEY,biz_id VARCHAR(64) NOT NULL,     -- 业务唯一IDmq_topic VARCHAR(64) NOT NULL,mq_body JSON NOT NULL,status ENUM('UNSENT','SENT','FAILED') NOT NULL,created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,sent_time TIMESTAMP,INDEX idx_status (status),        -- 状态索引加速扫描INDEX idx_created (created_time)  -- 时间索引用于清理
    );
    
  2. 中继服务关键配置

    # RocketMQ生产者
    rocketmq:producer:group: seata-relay-groupretryTimesWhenSendFailed: 5sendMsgTimeout: 3000# 消息扫描策略
    relay:scan-interval: 5000     # 5秒扫描一次batch-size: 200         # 每次最大处理量max-retry: 10           # 最大重试次数
    
  3. 监控指标

    • 关键指标
      seata_transaction_success_rate
      mq_message_delay_seconds
      compensation_trigger_count
    • 报警规则
      消息积压 > 1000条
      最终一致性延迟 > 1小时

典型应用场景

电商下单流程
  1. 订单服务:创建订单(Seata事务)
  2. 本地消息表:记录库存扣减消息
  3. 库存服务:异步扣减库存
  4. 若库存不足:触发补偿流程(生成退款单)
银行转账场景
账户A服务 RocketMQ 账户B服务 Seata 开启Seata事务 扣减A账户余额 写入转账消息表 提交全局事务 中继服务投递消息 消费转账消息 增加B账户余额 消费ACK 账户A服务 RocketMQ 账户B服务 Seata

总结:技术选择建议

  1. 强一致性场景
    直接使用 Seata AT/TCC 模式 + 跨服务调用
  2. 最终一致性场景
    Seata+本地消息表+RocketMQ 是黄金组合:
    • ✅ 利用 Seata 保障核心事务原子性
    • ✅ 通过本地消息表实现可靠事件
    • ✅ 依赖 RocketMQ 保证消息可靠投递
    • ✅ 消费者幂等设计解决重复消费

这种架构平衡了数据一致性与系统性能,是分布式系统中应用最广泛的最终一致性实现范式。

http://www.dtcms.com/wzjs/1162.html

相关文章:

  • 淄博网站制作设计怎么样创建网站
  • 昆山规建设局网站外贸营销推广
  • 网站先做前端还是后端网络营销的方式都有哪些
  • 网站规划与建设进度怎么写百度网站怎么申请注册
  • 网站做支付需要准备什么代运营公司
  • 建设银行网站首页口佛山快速排名seo
  • 可不可以用帝国cms做企业网站培训机构需要哪些证件
  • 取消网站的通知西安百度爱采购推广
  • 网站建设厦门公司推广
  • 关于门户网站建设的整改报告专业推广公司
  • 怎么自己做网站吓别人湖南关键词优化首选
  • 做衣服的网站推荐百度学术官网首页
  • 个性化定制客户和网站建设百度帐号
  • 有关建筑的网站seo排名优化的网站
  • 用net做新闻网站百度app下载并安装最新版
  • 合肥大型网站开发公司广州seo网络推广员
  • 什么网站可以做2.5D场景合肥网站推广优化公司
  • 九江做网站的公司哪里好淘大象排名查询
  • wordpress轮播主题南京seo排名扣费
  • 本溪做网站 淘宝店网址搜索引擎入口
  • 做网站的软件帝国上海排名优化seobwyseo
  • 广西建网站公司正规网络教育培训机构
  • 查询企业信息的网站百度账户
  • 半导体网站建设如何在手机上开自己的网站
  • 建设部执业注册中心网站dsp投放方式
  • 网页制作员工作厂家电话清远seo
  • 中国商务部市场建设司网站网站如何赚钱
  • 机械网站建设西地那非片的功能主治
  • 最好的建站公司安卓优化大师老版本
  • 如何添加网站电商培训机构哪家强