2020年2月10日 作者 zeroheart

消息队列基础

为什么用消息队列

随着业务的复杂,需要不同的工能共同完成一个事情,比如下单,有日志,优惠券,积分等的步骤。

需要使用异步,解耦的方式实现,于是有了消息队列

异步,很好理解,下单成功,只要发送消息即可,不同的事情,不同系统来处理。后面会引入分布式事务。

解耦,也可以用多线程,但是程序的耦合程度上升,维护不容易。

当然,使用消息队列,必要引入其他问题。数据的一致性,消息的丢失,重复消费,顺序消费等。

重复消费的例子

下游业务系统,如增加销售总额的接口,调用失败,要求重新发送消息。重发之后,其他业务系统,比如加积分可能会出现重复增加。

此时要做好幂等

强校验的例子:
比如,加销售总额的操作和写流水放到一个事务中,根据订单号和业务标示查询流水,查到了的话,直接返回。没有查到的话,写流水、增加销售总额。

流水表方便对账,方便定位问题。

弱校验的话:
比如使用redis,做个唯一标示放到redis,处理成功了,去掉缓存,下次消息再来,有缓存的处理下,没有缓存的场景就是处理过了。

或者用token等校验,消息带上token,同一个消息要保证token一样,处理前先检查这个请求是否处理了。

幂等有专门的一篇文章:

顺序消费的问题,一般由消息队列的FIFO机制来保证。后续探讨。

分布式事务

2pc

引入一个中间件,分布式系统上的两个操作,都准备好之后,通知中间件,然后再提交。提交过程无法保证都成功。

最终一致性

允许中间状态,下单之后,显示在已发送下单请求,但是还没真正下单,最终看下单结果,成功了之后会修改状态为下单成功,触发其他操作。这里是个人理解,不严谨,后面在学习分析一下。