上一篇文章介绍了如何确保消息不丢失,本文简要介绍了如何确保消息不被重复使用。对于接收者来说,确认消息是需要时间的。如果有多个客户端在同一个队列中侦听,
那么存在多个客户端可以接收相同信息的一定概率。这时,消息重复的问题就出现了:
1.应对消息重复消费的几种方式:人们在网上说的两种主要方式:
方法一:Redis:使用setnx命令判断消息id。方法三:数据库:做唯一索引,消息id可以插入处理,重复消费会失败。优点和缺点:
方法一:Redis setnx分布式锁:不推荐:一种不靠谱的方式。如果项目允许数据出现错误,可以尝试使用。为什么不靠谱?
你可以参考https://zhuanlan.zhihu.com/p/418268774的文章
方法二:数据库锁:推荐:可以使用唯一索引,也可以使用事务锁,比较成熟,使用起来也比较简单。
模式三:专属档案和剪报。推荐场景:单机场景。
1.进程间的锁可以通过独占打开和释放文件来实现。2.进程间的锁可以通过读写剪报来实现。前面的方法都有一个元素,即需要消息的唯一ID。
2.如何生成消息的唯一ID:A:对消息进行哈希处理,将哈希值作为唯一ID(不可避免地存在生成相同哈希的一定概念)。b:对于发送的每条消息,都会生成一个GUID,这样当获得消息时,
您可以获得对应于该消息的唯一ID。让我们看看代码演示:
带唯一ID:使用(var频道=兔子。实例。默认连接。创建模型()){频道.BasicReturn=(sender,e)={ //通过交换机发送过去,
4. Receiving the message: Get the unique ID of the message: var channel=rabbit. instance . default connection . create model(); Var consumer=basic consumer (channel) of new event; Consumers. Received=(model, ea)={ var message=code. UTF8.GetString(ea。 body . to array()); Console. WriteLine ('received default message' {0}' message); Console. WriteLine ('received default message GUID {0}, ea. basic properties . MessageId); Try {channel. BasicAck(ea。 DeliveryTag,false); } catch (exception error) {//Handling the failure of confirmation.
标题:RabbitMQ 入门系列:7、保障消息不重复消费:产生消息的唯一ID
链接:https://www.52hkw.com/news/rj/56743.html
版权:文章转载自网络,如有侵权,请联系删除!