老婆出轨 发表于 2025-4-9 13:09:58

rabbitMQ 消息次序性、消息幂等性、消息不丢失、终极同等性、赔偿机制、消息队列计划?

一、消息次序性
消息队列中的多少消息假如是对同一个数据进行操纵,这些操纵具有前后的关系,必须要按前后的次序实行,否则就会造成数据非常。
举例:
  比如通过mysql binlog进行两个数据库的数据同步,由于对数据库的数据操纵是具有次序性的,假如操纵次序搞反,就会造成不可估量的错误。比如数据库对一条数据依次进行了 插入->更新->删除操纵,这个次序必须是这样,假如在同步过程中,消息的次序酿成了删除->插入->更新,那么原本应该被删除的数据,就没有被删除,造成数据的不同等标题。
RabbitMQ的消息次序标题,需要分三个环节看待,发送消息的次序、队列中消息的次序、消耗消息的次序。
发送消息的次序
消息发送端的次序,大部分业务不做要求,谁先发消息无所谓,假如遇到业务一定要发送消息也确保次序,那意味着,只能全局加锁一个个的操纵,一个个的发消息,不能并发发送消息。
队列中消息的次序
RabbitMQ中,消息终极会生存在队列中,在同一个队列中,消息是次序的,先进先出原则,这个由Rabbitmq包管,通常也不需要开发关心。
提示:差异队列中的消息次序,是没有包管的,比方:进地铁站的时间,排了三个队伍,差异队伍之间的,不能确保谁先进站。
消耗消息的次序
我们说怎样包管消息次序性,通常说的就是消耗者消耗消息的次序,在多个消耗者消耗同一个消息队列的场景,通常是无法包管消息次序的,开篇的示意图已经说明,虽然消息队列的消息是次序的,但是多个消耗者并发消耗消息,获取的消息的速度、实行业务逻辑的速度快慢、实行非常等等原因都会导致消息次序不同等。
比方:消息A、B、C按次序进入队列,消耗者A1拿到消息A、消耗者B1拿到消息B, 结果消耗者B实行速度快,就跑完了,又大概消耗者A1挂了,都会导致消息次序不同等。
生产者 通过 channel 把消息 通过 exchange 路由到对一个的quque 的 过程中,MQ 本身包管消息的有序性,quque 是有序的,在业务上只要包管生产者发送到mq上的消息是有序的,那么MQ ,quque 就能包管生产者发送到消息的有序性;但是生产者包管了消息的有序性并不能包管消耗者消耗到的消息就是有序的这紧张表现在以下两点:
1.一个quque 上有多个consumer,由于每个消耗者处理消息的快慢不一样,因此并不能包管每个consumer都次序消耗消息,包管消息被消耗者次序消耗入库;
2.一个quque上只有一个consumer,但是这个consumer 是多线程异步处理,因此并不能包管这个consumer消耗消息的处理是次序处理;

出现次序错乱的场景
错乱场景一
①一个queue,有多个consumer去消耗,这样就会造成次序的错误,consumer从MQ内里读取数据是有序的,但是每个consumer的实行时间是不固定的,无法包管先读到消息的consumer一定先完成操纵,这样就会出现消息并没有按照次序实行,造成数据次序错误。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: rabbitMQ 消息次序性、消息幂等性、消息不丢失、终极同等性、赔偿机制、消息队列计划?