消息送达是什么意思(消息送达状态)
导语:一分钟了解消息送达及幂等操作
一、背景
现在互联网公司内各个服务错综复杂,一般都会依赖别人的服务。一些核心服务实时性较高的会通过消息去订阅,不会影响其性能。非核心服务会通过rpc去调用,一般Dubbo用地最多,还有thrift用地也比较多(美团),这个可以跨语言。那么消息如何确保可送达及幂等操作呢。
二、消息如何确保可送达
rabbitMq有confirm机制,即发送消息后会回调传送ack去确认消息。即可保证。但是消息一般是基于内存的,也会积攒一些消息批量持久化。内存到磁盘这个过程中也可能会丢消息。所以一般会发消息前提前持久化,比如持久话到redis,redis cluster可以保证其消息可送达。redis消息写完,再发消息即可。消息回调确认后从redis去ack。针对回调ack过程中丢消息,可以增加一个补偿定时的任务去确认消息。即隔一段时间去检查redis有发送中的消息积压。消息侧针对异常也可以做一些消息重试,比如三次,再失败后去catch异常后处理。如此一来即可确保消息可投递成功
上面换成kafka也可以。kafka没有ack,也是提前redis去处理,异常通过定时任务补偿去操作即可。
整体流程
互联网中重要服务一般都是多写,所以一般很少丢数据,丢了就是大bad case。
三、如何确保消息幂等操作
其实一般是加了一个版本号去做消息的update或者insert操作即可。
eg update order set sales_con = sales_con - 1 , version = version + 1
where id = XXX and version = 1;
如果网络抖动或者下游服务重试即可避免重复消费问题
免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请反馈,一经查实立刻删除内容。本文内容由快快网络小德创作整理编辑!