开发者社区 > 云原生 > 云消息队列 > 正文

消息队列处理积压的消息如何处理?

已解决

消息队列处理积压的消息处理有什么思路么.

展开
收起
1780169608831412 2021-07-25 16:08:34 1176 0
1 条回答
写回答
取消 提交回答
  • 网络规划设计师、敏捷专家、CISP、ITSS服务经理、ACA全科目、ACP4项、ACE、CBP、CDSP、CZTP等。拥有 PRINCE2 Foundation/Practitioner、CCSK、ITIL、ISO27001、PMP等多项国际认证。 专利5+、期刊10+、知识产权师。核心期刊审稿人。
    采纳回答

    举一个栗子: 一个消费者一秒是 1000 条,一秒 3 个消费者是 3000 条,一分钟是 18W 条,1000 多 W 条需要一个小时恢复。

    步骤:

    1. 先修复 consumer 的问题,确保其恢复消费速度,然后将现有的 consumer 都停掉
    2. 新建一个topic,partition是原来的 10 倍,临时建立好原先 10 倍或者 20 倍的 queue 数量
    3. 然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue
    4. 接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据
    5. 这种做法相当 于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常 10 倍速度
    6. 等快速消费完积压数据之后,恢复原先部署架构 ,重新用原先的 consumer机器消费消息
    
    

    原来 3 个消费者需要 1 个小时可以搞定,现在 30 个临时消费者需要 10 分钟就可以搞定。

    如果用的 rabbitmq,并且设置了过期时间,如果此消费在 queue里积压超过一定的时间会被 rabbitmq清理掉,数据直接搞丢。这个时候开始写程序,将丢失的那批 数据查出来,然后重新灌入mq里面,把白天丢的数据补回来。

    如果消息积压mq,长时间没被处理掉,导致mq快写完满了,你临时写一个程序,接入数据来消费,写到一个临时的mq里,再让其他消费者慢慢消费 或者消费一个丢弃一个,都不要了,快速消费掉所有的消息,然后晚上补数据。

    2021-07-25 16:20:03
    赞同 2 展开评论 打赏

涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/

相关电子书

更多
企业互联网架构之消息队列 立即下载
基于消息队列RocketMQ的大型分布式应用上云最佳实践 立即下载
云原生消息队列Apache RocketMQ 立即下载