10、分布式事务 实战 - 最大努力通知型分布式事务原理

一、适用场景

在前面的章节中,虽然简单提到过最大努力通知型分布式事务解决方案的应用场景,但不够全面。这里就最大努力通知型分布式事务解决方案适用地场景进行总结。总体来说,最大努力通知型分布式事务解决方案适用于满足如下特点的场景:

1、 业务主动方完成业务逻辑操作后,向业务被动方发送消息,允许消息丢失;
2、 业务主动方需要提供消息回查接口,供业务被动方回查调用,以恢复丢失的业务消息;
3、 业务被动方未接收到业务主动方发送的消息,或者接收到消息执行业务逻辑失败,业务被动方查询业务主动方提供的消息回查接口,进行数据校对;
4、 业务被动方接收到业务主动方发送过来的消息,执行完业务处理(或者先将消息存储到本地,后续进行业务处理),需要向业务主动方返回已成功接收消息的状态,避免业务主动方触发消息重试机制;
5、 业务主动方未及时收到业务被动方返回的确认消息时,会根据一定的延时策略向业务被动方重新发送消息数据;
6、 业务被动方的业务处理结果不影响业务主动方的业务处理结果;

满足如上业务场景的往往是两个不同系统之间需要满足事务的最终一致性

二、方案特点

特殊的使用场景决定了最大努力通知型方案具有如下特点:

1、 使用到的服务模式有可查询操作、幂等操作;
2、 对最终一致性的时间敏感度低,短则几秒钟或几分钟,长则数天才能达到事务的一致性;
3、 业务被动方对业务的处理结果不会影响业务主动方对业务的处理结果;
4、 多用于跨企业的系统,或者企业内部比较独立的系统之间实现事务的一致性,总之,就是不同系统之间实现事务的一致性;
5、 业务主动方完成业务操作后向业务被动方发送通知消息,并允许消息丢失;
6、 业务主动方可以根据一定的策略设置阶梯型通知规则,在通知失败后,按照规则进行重复通知,直到通知的次数达到设置的最大次数为止;
7、 业务主动方需要提供查询接口给业务被动方按照需求进行校对查询,以便恢复可能丢失的业务消息;

三、基本原理

最大努力通知型分布式事务原理比较简单,在业务主动方主要分为业务处理服务、消息中间件、消息消费服务和消息通知服务四大部分。这四大部分协调完成了最大努力通知型分布式事务,具体如下图所示:

 

1、 业务处理服务处理完成业务逻辑,向消息中间件;
2、 消息中间件接收到消息数据后,将消息保存到消息数据库中,并将消息记录的状态标记为待发送;
3、 消息消费服务订阅消息中间件中的消息数据,当接收到消息数据时,会向消息中间件发送确认消息;
4、 消息中间件接收到消息消费者发送的确认消息,会将消息数据库中对应的消息记录状态更新为“已发送”;
5、 消息消费者调用消息通知服务的接口,将消息数据传递给消息通知服务;
6、 消息通知服务向业务被动方发送通知消息,并将通知记录保存到通知记录库中;
7、 如果业务被动方没有收到通知消息,或者收到通知消息后处理业务逻辑失败,或者需要再次获取通知消息,则会按照需求主动查询业务主动方提供的回调接口,以便恢复丢失的业务消息;
8、 业务被动方接收消息通知的接口需要实现消息的幂等操作;

四、异常处理

消息中间件宕机

业务处理服务向消息中间件发送消息失败,导致整个通知流程不可用,无法将消息正确通知到业务被动方

这种异常情况并不会影响整个服务,如果消息中间件宕机,消息无法发送出去,业务处理服务会多次尝试将消息发送给消息中间件,直到重试次数达到最大重试次数为止。如果在重试过程中,消息中间件恢复服务,则继续向下执行。如果消息仍然发送失败,则业务被动方会按照需求主动查询业务处理服务的接口,恢复丢失的业务消息

消息消费服务宕机

如果消息消费服务宕机,则无法消费消息中间件中的消息数据,消息中间件根据一定的规则会尝试多次投递消息。如果在尝试投递消息的过程中,消息消费服务已经恢复,则继续执行后续流程。如果在重试投递消息的次数达到了设置的最大重试次数时,消息恢复服务仍然没有回复,则业务被动方会按照需求主动查询业务处理服务的接口,恢复丢失的业务消息

消息通知服务宕机

如果消息通知服务宕机,则会无法向业务被动方发送通知消息。消息消费服务会根据一定的规则重新调用消息通知服务的接口,直到重试次数达到了设置的最大重试次数为止。如果在重试的过程中消息通知服务已经恢复,则继续执行后续通知逻辑。如果此时消息通知服务仍然未能恢复,则业务被动方会按照需求主动查询业务处理服务的接口,恢复丢失的业务消息

业务被动方宕机

如果业务被动方宕机,则消息通知服务向业务被动方发送通知消息失败。消息通知服务会按照一定的规则向业务被动方进行阶梯式消息通知,直到达到设置的最大重试次数为止。如果在重试的过程中业务被动方的服务已经恢复,则会成功发送消息通知。如果此时业务被动方仍然处于宕机状态,则消息通知服务不再向业务被动方发送消息通知。待业务被动方的服务恢复后,可以根据具体的业务需求,主动查询业务处理服务提供的回调接口,恢复丢失的业务消息

综上所述,只要业务主动方提供了回调查询接口,业务被动方保证接口的幂等性,消息数据是允许丢失的

在实现最大努力通知型分布式事务时,最关键的两点是业务主动方提供回调查询接口,业务被动方接收消息通知的接口保证幂等性