分布式事务有多种处理方法,这里想讲一下最终一致性做法的一些核心点。
一般来说,为了实现最终一致性,通常会使用本地事务+消息的方式。但是这种做法又会带来一个新的分布式事务的问题,因为本地事务和消息的事务又是两个事务。
面对这个问题,有两个解法,
一个是通过在本地事务处理过程中将是否发送消息的FLAG也存储在本地事务中。并且,保证先发发送未提交消息,然后再提交本地事务的方式,最后再提交确认消息。这种有一个极端情况是最后一步提交前服务当机了导致消息未发送了。因此,可以通过一个调度器,通过分析本地事务的flag来将未发送的消息提交掉来解决。
前面一种做法比较复杂,下面介绍一种较为简单粗暴的做法。将本地事务与消息事务封装成一个任务模型。通过调度算法来调度执行这个任务。任务的本地事务和消息事务无需特殊处理。一旦有任何一方失败,调度重试即可。这种做法简单,但是对业务实现有要求,要求所有本地事务操作均是可以重试的。
正常情况下,建议使用第二种实现方式。