消息服务器如何保证有序消费消息,如何保证不被重复消费

有序消费消息

造成无序消费消息的情况有以下几种:

​ 第一种:消息的消费者采用多线程的方式进行消费消息,拿三个线程来说,消息服务器把生产者发送的消息按照一定的顺序存入队列中,消费者不同线程会将消息服务器中的消息取出顺序弄错从而造成无序消费.

​ 第二种:消息的消费方是多个的时候,同样队列中放着有序的消息,但不同的消费者之间会在取消息的过程中形成竞争的局面造成无序 消费

解决办法:

​ 第一种,在消费者端将消息的id取hash值对线程的数量进行取模运算,得到不同的值,同一消息的id进入到同一内存队列中,让同一线程对其进行处理

​ 第二种,在生产者方将消息的id取hash值对队列的数量进行取模运算,得到不同的值,同一商品进入到同一消息的队列,让同一个消费者进行处理.

重复消费的问题

造成重复消费的原因有:

​ 情况一:生产者在发送消息的时候,消息服务器发生网络延迟,此时,本该反馈给生产者消息时,生产者没接收到,因此会导致生产者再次发送消息,造成数据重复.

​ 情况二:生产者自身问题比如宕机,在给消息服务器发送消息后,消息服务器反馈给生产者消息时,生产者发生了宕机,等恢复后没有接收到服务器的反馈消息,因此会再次发送消息,从而造成消息重复.

对于以上情况消费者同样也会发生

解决办法:总体的思想是保证消息的幂等性,消息的幂等性就是无论重复操作多少次都只会执行一次,这是一个过程.

例如,把消息做redis操作,只需要用set方法,就可以保证消息的幂等性,因为,redis的set方法的key值不能重复

​ 其实就是给消息做一个唯一的主键,对生产者来说当重复操作同一个消息时,会只取一次操作的结果,消费者同样也是如此

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值