分布式一致性保证模式之【可靠消息模式 】
在分布式系统中,对于主流程中优先级比较低的操作,大多采用异步的方式执行,也就是前面提到的异步确保型,为了让异步操作的调用方和被调用方充分的解耦,也由于专业的消息队列本身具有可伸缩、可分片、可持久等功能,我们通常通过消息队列实现异步化,对于消息队列,我们需要建立特殊的设施保证可靠的消息发送以及处理机的幂等等。
消息的可靠发送
消息的可靠发送可以认为是尽最大努力发送消息通知,有两种实现方法:
第一种,发送消息之前,把消息持久到数据库,状态标记为待发送,然后发送消息,如果发送成功,将消息改为发送成功。定时任务定时从数据库捞取一定时间内未发送的消息,将消息发送。
第二种,实现方式与第一种类似,不同的是持久消息的数据库是独立的,并不耦合在业务系统中。发送消息之前,先发送一个预消息给某一个第三方的消息管理器,消息管理器将其持久到数据库,并标记状态为待发送,发送成功后,标记消息为发送成功。定时任务定时从数据库捞取一定时间内未发送的消息,回查业务系统是否要继续发送,根据查询结果来确定消息的状态。
一些公司把消息的可靠发送实现在了中间件里,通过Spring的注入,在消息发送的时候自动持久消息记录,如果有消息记录没有发送成功,定时会补偿发送。
消息处理器的幂等性
如果我们要保证消息可靠的发送,简单来说,要保证消息一定要发送出去,那么就需要有重试机制,有了重试机制,消息一定会重复,那么我们需要对重复做处理。
处理重复的最佳方式为保证操作的幂等性,幂等性的数学公式为:
f(f(x)) = f(x)
- 1
- 2
保证操作的幂等性常用的几个方法:
- 使用数据库表的唯一键进行滤重,拒绝重复的请求
- 使用分布式表对请求进行滤重
- 使用状态流转的方向性来滤重,通常使用行级锁来实现(后续在锁相关的文章中详细说明)
-
根据业务的特点,操作本身就是幂等的,例如:删除一个资源、增加一个资源、获得一个资源等
浙公网安备 33010602011771号