liym 2020-06-14
当消息产生的速度长时间远远大于消费的速度的时候,就会产生消息的堆积。
新生产的消息转移到新的队列,增加新的服务器部署新的消费者来消费。
原来的消息队列的消息可以继续慢慢消费。
二、消息丢失怎么办?
消息流经过程 —>生产者—>队列—>消费者
场景:生产者在投递消息过程中,突遇断网可能丢失消息。
解决方案:生产者在消息投递环节开启消息确认机制(事物或者comfirm),发送失败时候重试。
场景:队列服务宕机、重启,消息丢失。
解决方案:投递消息的时候,交换机、队列、消息都设置为持久化durable=true
场景:消费者启用了自动应答,消费者服务挂掉。
解决方案:通道设置每次只处理一条消息,关闭消费者自动应答,消费完成手动应答。
三、有序消费
情形1:多条不幂等消息如消息1、消息2、消息3,采用worker模式投递,由于worker模式的消费者是竞争者关系,拿到的消息顺序是有问题的。
解决方案:将消息1、消息2、消息3分别投递进不同队列,每个队列对应一个消费者
情形2:消费者开启了多线程
解决方案:消息队列分配消息后,创建多个内存队列,每个线程消费者去消费内存队列里面的消息
四、消息重复消费
出现原因:消费者消息消息的时候,MQ没有收到消息的ack应答。
消息幂等性:消息无论怎么执行都是同样结果。
非幂等性案例:扣款、扣库存、添加数据。