详解三种主流分布式事务方案的优劣(2)
1)实现:一个完整的业务活动由一个主业务服务于若干的从业务服务组成。主业务服务负责发起并完成整个业务活动。从业务服务提供TCC型业务操作。业务活动管理器控制业务活动的一致性,它登记业务活动的操作,并在业务活动提交时确认所有的TCC型操作的Confirm操作,在业务活动取消时调用所有TCC型操作的Cancel操作。 2)成本:实现TCC操作的成本较高,业务活动结束的时候Confirm和Cancel操作的执行成本。业务活动的日志成本。 3)使用范围:强隔离性,严格一致性要求的业务活动。适用于执行时间较短的业务,比如处理账户或者收费等等。 4)特点:不与具体的服务框架耦合,位于业务服务层,而不是资源层,可以灵活的选择业务资源的锁定粒度。TCC里对每个服务资源操作的是本地事务,数据被锁住的时间短,可扩展性好,可以说是为独立部署的SOA服务而设计的。 最大努力通知型 1)实现:业务活动的主动方在完成处理之后向业务活动的被动方发送消息,允许消息丢失。业务活动的被动方根据定时策略,向业务活动的主动方查询,恢复丢失的业务消息。 2)约束:被动方的处理结果不影响主动方的处理结果。 3)成本:业务查询与校对系统的建设成本。 4)使用范围:对业务最终一致性的时间敏感度低。跨企业的业务活动。 5)特点:业务活动的主动方在完成业务处理之后,向业务活动的被动方发送通知消息。主动方可以设置时间阶梯通知规则,在通知失败后按规则重复通知,知道通知N次后不再通知。主动方提供校对查询接口给被动方按需校对查询,用户恢复丢失的业务消息。 适用范围:银行通知,商户通知。 三、基于可靠消息的最终一致性方案 消息发送一致性 消息中间件在分布式系统中的核心作用就是异步通讯、应用解耦和并发缓冲(也叫作流量削峰)。在分布式环境下,需要通过网络进行通讯,就引入了数据传输的不确定性,也就是CAP理论中的分区容错性。 消息发送一致性是指产生消息的业务动作与消息发送一致,也就是说如果业务操作成功,那么由这个业务操作所产生的消息一定要发送出去,否则就丢失。 处理方式一:
在上面的情况中,如果业务操作成功,执行的消息发送之前应用发生故障,消息发送不出去,导致消息丢失,将会产生订单系统与会计系统的数据不一致。如果消息系统或者网络异常,也会导致消息发送不出去,也会造成数据不一致。 处理方式二:
如果将上面的两个操作调换一下顺序,这种情况就会更加不可控了,消息发出去了业务订单可能会失败,会造成订单系统与业务系统的数据不一致。那么JMS标准中的XA协议是否可以保障发送的一致性? JMS协议标准的API中,有很多以XA开头的接口,其实就是前面讲到的支持XA协议(基于两阶段提交协议)的全局事务型接口。
JMS中的XA系列的接口可以提供分布式事务的支持。但是引用XA方式的分布式事务,就会带来很多局限性。 要求业务操作的资源必须支持XA协议,但是并不是所有的资源都支持XA协议。 两阶段提交协议的成本。 持久化成本等DTP模型的局限性,例如:全局锁定、成本高、性能低。 使用XA协议违背了柔性事务的初衷。 保证消息一致的变通做法 1)发送消息:主动方现将应用把消息发给消息中间件,消息状态标记为“待确认”状态。 2)消息中间件收到消息后,把消息持久化到消息存储中,但是并不影响被动方投递消息。 3)消息中间件返回消息持久化结果,主动方根据返回的结果进行判断如何进行业务操作处理:
4)业务操作完成后,把业务操作结果返回给消息中间件。消息中间件收到业务操作结构后,根据业务结果进行处理:
前面的正向流程都成功之后,向被动方应用投递消息。但是在上面的处理流程中,任何一个环节都有可能出现问题。 常规MQ消息处理流程和特点 常规的MQ队列处理流程无法实现消息的一致性。投递消息的本质就是消息消费,可以细化。 消息重复发送问题和业务接口幂等性设计 对于未确认的消息,采用按规则重新投递的方式进行处理。对于以上流程,消息重复发送会导致业务处理接口出现重复调用的问题。 消息消费过程中消息重复发送的主要原因就是消费者成功接收处理完消息后,消息中间件没有及时更新投递状态导致的。如果允许消息重复发送,那么消费方应该实现业务接口的幂等性设计。 本地消息服务方案 (编辑:ASP站长网) |