计算机系统应用教程网站

网站首页 > 技术文章 正文

一分钟了解消息送达及幂等操作 信息送达通知怎么设置

btikc 2024-10-17 08:45:53 技术文章 6 ℃ 0 评论

一、背景

现在互联网公司内各个服务错综复杂,一般都会依赖别人的服务。一些核心服务实时性较高的会通过消息去订阅,不会影响其性能。非核心服务会通过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;

如果网络抖动或者下游服务重试即可避免重复消费问题

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表