上一节列举了生产上消息队列产生大量的消息堆积会有哪些后果,那相对应的解决方法有哪些呢?
1、消息被丢弃情况
如果要实现防止消息过期问题,最好不要设置过期时间!那设置了过期时间导致消息丢失怎么补救呢?
答案:找个月黑风高(访问量低)的夜晚,辛苦一下程序员写个补偿代码喽。
2、磁盘不足情况
大多数的公司系统都是有监控的,我们公司是触发90%的阈值就会报警,这样运维同学就会马上处理了。
磁盘问题有预警,但是最终结果还是需要把堆积的消息进行消费掉。可以在其他机器上创建临时消息队列,重新写一个临时的Consumer 作为消息中转站,单独把积压队列中的消息取出来,放到临时队列里快速疏散积压的消息,让磁盘回复正常水平。
3、快速处理海量积压消息
积压了 100 万条,有 3 个 Consumer,每一个每秒能处理 200 条,3 个 Consumer 每秒一共能处理 600 条。那就需要1个多小时才能处理完,那么这个时间段又会重新积压数据。
还是可以使用临时队列的方式。
新建一个 Topic,设置为 20 个 Partition
Consumer 不再处理业务逻辑了,只负责搬运,把消息放到临时 Topic 中
这 20 个 Partition 可以有 20个 Consumer 了,它们来处理原来的业务逻辑。
这 20 个 Consumer 每秒一共能处理 4000 条了,这样几分钟就可以处理完积压的 100 万条。
这几分钟新来的消息也不会太多,所以很快就可以恢复正常水平,之后,再把整体结构恢复为原来的形式。
总结,消息积压还是比较麻烦的,最好是提前防范,做好硬件和消息系统的健康监控。如果出现消息丢失,就要人工查找丢失的消息,然后补上。在消费不过来的时候,可以考虑使用临时队列作为中转,提升处理能力。
注意:本文归作者所有,未经作者允许,不得转载