消费端出问题之后,消息队列可能出现的问题
- 消息队列满了以后该怎么处理? - 如何解决消息队列的延时以及过期失效问题? - 有几百万消息持续积压几小时,说说怎么解决?
一 有几百万消息持续积压几小时,怎么解决?
方法一 :如果是常规方法修复消费者继续消费,一个消费者一秒是1000条,3个消费者是3000条,一分钟是18万条,如果你积压了几百万到上千万的数据,即使消费者恢复了,也需要大概1小时的时间才能恢复过来.效率极低
方法二 : 扩容消费端的实例数,具体操作步骤和思路如下: 1)先修复consumer的问题,确保其恢复消费速度,然后将现有cnosumer都停掉 2)新建一个topic,partition是原来的10倍,临时建立好原先10倍或者20倍的queue数量 3)然后写一个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的10倍数量的queue 4)接着临时征用10倍的机器来部署consumer,每一批consumer消费一个临时queue的数据 5)这种做法相当于是临时将queue资源和consumer资源扩大10倍,以正常的10倍速度来消费数据 6)等快速消费完积压数据之后,得恢复原先部署架构,重新用原先的consumer机器来消费消息 如果有必要,短时间内没有足够的服务器资源进行扩容,没办法的办法是,将系统降级,通过关闭一些不重要的业务,减少发送方发送的数据量,最低限度让系统还能正常运转,服务一些重要业务。
二 如何解决消息队列的延时以及过期失效问题?
如果我们用的是rabbitmq,rabbitmq是可以设置过期时间的,就是TTL 如果消息在queue中积压超过一定的时间就会被rabbitmq给清理掉,这个数据就没了,可能导致大量的数据丢失。 一般不建议设置过期时间自动失效
如果消息真的没处理就 失效没了 解决方法 : 写程序重导丢失的那批数据,写个临时程序,一点一点的查出来,然后重新灌入mq里面去,把白天丢的数据补回来。
三 消息队列满了以后该怎么处理?
同积压消息处理思路,将消息进行快速处理和清空.