分布式事务中的三种解决方案详解

发布时间:2020-08-07 00:01:24 作者:BlueMiaomiao
来源:网络 阅读:11199

[TOC]

一、分布式事务前奏

二、柔性事务解决方案架构

在电商领域等互联网场景下,传统的事务在数据库性能和处理能力上都暴露出了瓶颈。柔性事务有两个特性:基本可用和柔性状态。所谓基本可用是指分布式系统出现故障的时候允许损失一部分的可用性。柔性状态是指允许系统存在中间状态,这个中间状态不会影响系统整体的可用性,比如数据库读写分离的主从同步延迟等。柔性事务的一致性指的是最终一致性。

(一)、基于可靠消息的最终一致性方案概述

分布式事务中的三种解决方案详解

(二)、TCC事务补偿型方案

分布式事务中的三种解决方案详解

(三)、最大努力通知型

分布式事务中的三种解决方案详解

三、基于可靠消息的最终一致性方案详解

(一)、消息发送一致性

消息中间件在分布式系统中的核心作用就是异步通讯、应用解耦和并发缓冲(也叫作流量削峰)。在分布式环境下,需要通过网络进行通讯,就引入了数据传输的不确定性,也就是CAP理论中的分区容错性。

分布式事务中的三种解决方案详解

消息发送一致性是指产生消息的业务动作与消息发送一致,也就是说如果业务操作成功,那么由这个业务操作所产生的消息一定要发送出去,否则就丢失。

处理方式一

public void completeOrderService() {
    // 处理订单
    order.process();

    // 发送会计原始凭证消息
    pipe.sendAccountingVouchetMessage();
}

在上面的情况中,如果业务操作成功,执行的消息发送之前应用发生故障,消息发送不出去,导致消息丢失,将会产生订单系统与会计系统的数据不一致。如果消息系统或者网络异常,也会导致消息发送不出去,也会造成数据不一致。

处理方式二

public void completeOrderService() {
    // 发送会计原始凭证消息
    pipe.sendAccountingVouchetMessage();

    // 处理订单
    order.process();
}

如果将上面的两个操作调换一下顺序,这种情况就会更加不可控了,消息发出去了业务订单可能会失败,会造成订单系统与业务系统的数据不一致。那么JMS标准中的XA协议是否可以保障发送的一致性?

(二)、保证消息一致的变通做法

分布式事务中的三种解决方案详解

  1. 发送消息:主动方现将应用把消息发给消息中间件,消息状态标记为“待确认”状态。
  2. 消息中间件收到消息后,把消息持久化到消息存储中,但是并不影响被动方投递消息。
  3. 消息中间件返回消息持久化结果,主动方根据返回的结果进行判断如何进行业务操作处理:
    1. 失败:放弃执行业务操作处理,结束,必要时向上层返回处理结果。
    2. 成功:执行业务操作处理。
  4. 业务操作完成后,把业务操作结果返回给消息中间件。
  5. 消息中间件收到业务操作结构后,根据业务结果进行处理:
    1. 失败:删除消息存储中的消息,结束。
    2. 成功:更新消息存储中的消息状态为“待发送”,然后执行消息投递。
  6. 前面的正向流程都成功之后,向被动方应用投递消息。

但是在上面的处理流程中,任何一个环节都有可能出现问题。

(三)、常规MQ消息处理流程和特点

分布式事务中的三种解决方案详解

(四)、消息重复发送问题和业务接口幂等性设计

分布式事务中的三种解决方案详解

对于未确认的消息,采用按规则重新投递的方式进行处理。对于以上流程,消息重复发送会导致业务处理接口出现重复调用的问题。消息消费过程中消息重复发送的主要原因就是消费者成功接收处理完消息后,消息中间件没有及时更新投递状态导致的。如果允许消息重复发送,那么消费方应该实现业务接口的幂等性设计。

(五)、本地消息服务方案

分布式事务中的三种解决方案详解

(六)、独立消息服务方案

分布式事务中的三种解决方案详解

(七)、消息服务子系统的设计实现

示例消息数据表:

名称 数据类型 允许空 默认值 属性 释义
uuid varchar(50) No unique UUID
version int(11) No 0 版本号
editer varchar(100) Yes NULL 修改者
creater varchar(100) Yes NULL 创建者
edit_time datetime Yes 0000-00-00 00:00:00 最后修改时间
create_time datetime No 0000-00-00 00:00:00 创建时间
msg_id varchar(50) No 消息ID
msg_body longtext No 消息内容
msg_date_type varchar(50) Yes 消息数据类型
consumer_queue varchar(100) No 消费队列
send_times int(6) No 0 消息重发次数
is_dead varchar(20) No 是否死亡
status varchar(20) No 状态
remark varchar(200) Yes 备注
field0 varchar(200) Yes 扩展字段0
field1 varchar(200) Yes 扩展字段1
field2 varchar(200) Yes 扩展字段2
推荐阅读:
  1. 分布式事务详解
  2. 分布式事务解决方案,中间件 Seata 的设计原理详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

tcc 分布式事务 数据库

上一篇:oracle中 DG和GG的区别

下一篇:使用httpd-2.2和httpd-2.4实现指定httpd服务

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》