RocketMQ消息堆积的问题
1.发生的原因:
由于Consumer故障导致消费着节点全部宕机,生产者还在不停的投递消息到Broker,消息被挤压在Broker没有被消费;
2.消息堆积导致的问题:
过多的数据不仅占用磁盘空间,还会影响MQ性能;
3.解决方案:
分三种情况:
情况0,如果消息是可以被丢弃的,那么就修改代码直接将代码中获取的消息直接丢弃,不做任何处理;
情况1, Topic中MessageQueue的数量大于Consumer的实例数量,可以将Consumer扩容,MessageQueue 会进行Rebalance重新分配给Consumer实例,此时多个Consumer实例可以迅速消费掉堆积的消息,但是要考虑到的后续如果业务中有DB操作,DB是否支持这么高的读写操作;
情况2, Topic中MessageQueue的数量小于Consumer的实例数量,此时直接扩容Consumer的实例数量是没用的,扩容后的Consumer实例仍然无法消费MessageQueue里面的消息; 此时可以修改项目代码,新建一个临时的Topic,制定临时Topic的MessageQueue数量为多个,然后再启动多个临时消费实例;此时Consumer将堆积的Topic里面对应的消息,不处理,收到后直接丢到新的Topic里面去,让消费者去消费