有序消费消息
造成无序消费消息的情况有以下几种:
第一种:消息的消费者采用多线程的方式进行消费消息,拿三个线程来说,消息服务器把生产者发送的消息按照一定的顺序存入队列中,消费者不同线程会将消息服务器中的消息取出顺序弄错从而造成无序消费.
第二种:消息的消费方是多个的时候,同样队列中放着有序的消息,但不同的消费者之间会在取消息的过程中形成竞争的局面造成无序 消费
解决办法:
第一种,在消费者端将消息的id取hash值对线程的数量进行取模运算,得到不同的值,同一消息的id进入到同一内存队列中,让同一线程对其进行处理
第二种,在生产者方将消息的id取hash值对队列的数量进行取模运算,得到不同的值,同一商品进入到同一消息的队列,让同一个消费者进行处理.
重复消费的问题
造成重复消费的原因有:
情况一:生产者在发送消息的时候,消息服务器发生网络延迟,此时,本该反馈给生产者消息时,生产者没接收到,因此会导致生产者再次发送消息,造成数据重复.
情况二:生产者自身问题比如宕机,在给消息服务器发送消息后,消息服务器反馈给生产者消息时,生产者发生了宕机,等恢复后没有接收到服务器的反馈消息,因此会再次发送消息,从而造成消息重复.
对于以上情况消费者同样也会发生
解决办法:总体的思想是保证消息的幂等性,消息的幂等性就是无论重复操作多少次都只会执行一次,这是一个过程.
例如,把消息做redis操作,只需要用set方法,就可以保证消息的幂等性,因为,redis的set方法的key值不能重复
其实就是给消息做一个唯一的主键,对生产者来说当重复操作同一个消息时,会只取一次操作的结果,消费者同样也是如此