无风无影

   ::  :: 新随笔  ::  ::  :: 管理

分布式一致性保证模式之【可靠消息模式 】

 在分布式系统中,对于主流程中优先级比较低的操作,大多采用异步的方式执行,也就是前面提到的异步确保型,为了让异步操作的调用方和被调用方充分的解耦,也由于专业的消息队列本身具有可伸缩、可分片、可持久等功能,我们通常通过消息队列实现异步化,对于消息队列,我们需要建立特殊的设施保证可靠的消息发送以及处理机的幂等等。 
   
  消息的可靠发送 
   
  消息的可靠发送可以认为是尽最大努力发送消息通知,有两种实现方法: 
  第一种,发送消息之前,把消息持久到数据库,状态标记为待发送,然后发送消息,如果发送成功,将消息改为发送成功。定时任务定时从数据库捞取一定时间内未发送的消息,将消息发送。

这里写图片描述 
   
  第二种,实现方式与第一种类似,不同的是持久消息的数据库是独立的,并不耦合在业务系统中。发送消息之前,先发送一个预消息给某一个第三方的消息管理器,消息管理器将其持久到数据库,并标记状态为待发送,发送成功后,标记消息为发送成功。定时任务定时从数据库捞取一定时间内未发送的消息,回查业务系统是否要继续发送,根据查询结果来确定消息的状态。

这里写图片描述 
   
  一些公司把消息的可靠发送实现在了中间件里,通过Spring的注入,在消息发送的时候自动持久消息记录,如果有消息记录没有发送成功,定时会补偿发送。 
  消息处理器的幂等性 
  如果我们要保证消息可靠的发送,简单来说,要保证消息一定要发送出去,那么就需要有重试机制,有了重试机制,消息一定会重复,那么我们需要对重复做处理。 
  

处理重复的最佳方式为保证操作的幂等性,幂等性的数学公式为:
  f(f(x)) = f(x)
  • 1
  • 2

  保证操作的幂等性常用的几个方法:

  • 使用数据库表的唯一键进行滤重,拒绝重复的请求
  • 使用分布式表对请求进行滤重
  • 使用状态流转的方向性来滤重,通常使用行级锁来实现(后续在锁相关的文章中详细说明)
  • 根据业务的特点,操作本身就是幂等的,例如:删除一个资源、增加一个资源、获得一个资源等

posted on 2019-01-09 15:53  NWNS-无风无影  阅读(400)  评论(0)    收藏  举报