分布式事务 本地消息表

  1. 主要依赖本地的消息表来保证数据的一致性
  2. 例如  系统A和系统B需要同步修改数据        
  • 系统A增加本地消息表、系统B也增加本地消息表
  • 在A系统的本地事务中,需要处理A系统处理逻辑 与 A系统消息表插入一条消息数据
  • 接着 A 系统将这个消息发送到 MQ 中去;
  • B系统则消费这个MQ消息,在本地事务中处理B系统的逻辑,以及插入B系统的消息表一条数据
  • B系统处理成功之后,则更新B系统的消息表状态,和A系统的消息表状态
  • B系统处理失败,就不会更新A系统的消息表状态,则通过定时任务扫描A系统的消息表状态,来重新发送MQ消息。
  • 如果B系统一直处理失败,则A会一直发送MQ消息,以确保一定要成功
### 分布式事务本地消息的最佳实践及实现方案 #### 1. 核心概念 分布式事务的核心目标是在多节点或多服务之间保持数据一致性和系统稳定性。通过引入本地消息的方式,可以有效解决跨数据库或资源操作中的强一致性问题[^2]。 #### 2. 设计原理 本地消息的设计主要围绕以下几个方面展开: - **本地事务保障**:将业务逻辑与消息发送封装在同一本地事务中。只有当本地事务提交成功时,才会记录消息本地消息中。 - **异步处理**:通过定时任务或消息队列消费本地消息中的待发消息,将其传递给下游服务。 - **幂等性支持**:确保接收方对接收到的消息具有幂等能力,即使多次接收到相同消息也不会影响最终状态[^3]。 #### 3. 技术实现细节 以下是基于本地消息实现分布式事务的具体技术要点: ##### (1) 数据库结构设计 在订单服务的数据库中新增一张 `local_message` 用于存储待发送的消息。该通常包含以下字段: | 字段名 | 类型 | 描述 | |----------------|------------|--------------------------| | id | BIGINT | 主键 | | biz_id | VARCHAR | 业务唯一标识 | | status | TINYINT | 消息状态 | | payload | TEXT | 待发送的实际消息内容 | | create_time | DATETIME | 创建时间 | | update_time | DATETIME | 更新时间 | 其中,`status` 的取值可定义如下: - 0: 初始状态(未发送) - 1: 发送中 - 2: 成功 - 3: 失败并等待重试 ##### (2) 流程描述 流程分为两个阶段完成: - **写入本地消息**:在创建订单的同时,向 `local_message` 插入一条初始状态为“未发送”的消息记录。此过程由同一个本地事务管理,确保要么两者都成功,要么都不发生。 - **消息投递**:启动独立线程池或者调度器定期扫描 `local_message` 中处于“未发送”状态的消息,并尝试将其推送到目标服务。推送完成后更新对应记录的状态为“成功”。如果失败,则标记为“失败并等待重试”,并通过指数退避策略或其他方式进行后续重试[^1]。 ##### (3) 幂等性控制 由于网络波动等原因可能导致重复消息被消费者端接受,在这种情况下需要依赖于全局唯一的 `biz_id` 来判断当前请求是否已经处理过。例如库存扣减接口可以根据传入参数构建缓存key,查询Redis确认是否存在;若存在则直接返回成功响应而不做实际修改操作。 ```python def process_order(order_payload): order_id = generate_unique_order_id() try: with db.transaction(): save_order_to_db(order_payload, order_id) insert_local_message(order_id=order_id, payload=json.dumps(order_payload)) except Exception as e: handle_exception(e) def send_messages(): while True: messages = fetch_unsent_messages_from_table(limit=100) for msg in messages: if deliver_message(msg.payload): mark_as_sent(msg.id) else: schedule_for_retry(msg.id) time.sleep(5) # 控制轮询频率 ``` #### 4. 注意事项 - 需要合理设置超时时间和最大重试次数以防止无限循环消耗资源。 - 对高并发场景下的性能瓶颈进行优化,比如分片读取消息、批量提交等措施提升吞吐量。 - 定期清理已完成的历史消息以免占用过多磁盘空间。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值