RocketMQ 只能收到一部分消息解决

之前连接测试机使用MQ的时候,发现MQ有时候只能消费一半的消息,困扰了好几天,最后找到原因:


进入MQ操作后台,点进Consumer,发现 Quantity=2(有2个监听消费者)
在这里插入图片描述

在进入Client,看到2个IP,一个是测试机的,一个是我本机的。由于MQ负载均衡,测试机那边只能给我返回一半的消息
在这里插入图片描述

解决:把我本机配置MQ的项目停掉,就ok了
在这里插入图片描述
在这里插入图片描述

### 解决 RocketMQ 接收消息不完整的问题 #### 原因分析 RocketMQ 只接收到部分消息的情况可能由多种因素引起: 1. **网络波动** 如果生产者与 Broker 或者 Consumer 与 Broker 之间的网络连接不稳定,可能会导致消息传输中断或延迟。这会影响消息的完整性和及时性[^2]。 2. **Broker 存储问题** 当 RocketMQ 的 Broker 节点存储压力过大时,可能导致写入磁盘失败或是未能及时持久化消息至磁盘,在这种情况下即使 Broker 收到消息也可能因为未保存而丢失。 3. **Consumer 处理能力不足** 若消费者的处理速度跟不上生产者的发送速率,则可能出现积压现象;一旦消费者崩溃重启后无法继续之前的工作状态,从而造成某些已拉取但尚未确认的消息被丢弃[^4]。 4. **ACK 确认机制失效** 在正常工作状态下,消费者成功处理一条消息后需向服务器返回 ACK(即 COMSUME_SUCCESS)。如果此时发生异常情况比如进程意外终止、超时等问题,RocketMQ 将认为该条目已被消费并删除它,实际上却并未真正完成业务逻辑操作。 5. **系统繁忙 (System Busy)** 遇到 `SYSTEM_BUSY` 错误表示当前服务负载过高暂时拒绝请求。这类状况通常发生在高并发环境下资源争抢激烈之时,使得部分事务得不到妥善处置进而引发数据残缺不全的现象[^3]。 #### 解决策略 针对上述原因可以采取以下措施来提高系统的稳定性和可靠性: - **优化网络环境** - 使用心跳检测保持长链接活跃; - 实施重试策略确保每次通信都能顺利完成; - 对于重要的金融类应用建议采用专线等方式保障链路质量。 - **增强 Broker 容量规划** - 合理配置硬件参数如内存大小、硬盘读写性能等; - 设置合适的刷盘频率以平衡效率和安全性需求; - 开启同步双写模式保证至少两个副本都记录下来再反馈给客户端。 - **提升 Consumer 并发度** - 根据实际吞吐量调整线程池规模; - 利用批量提交减少单次交互开销; - 设定合理的预取数量防止过度占用缓存空间影响后续任务执行。 - **完善 ACK 流程管理** - 编码层面加入必要的异常捕获环节; - 控制好每批次的最大等待时间避免长时间悬置; - 结合死信队列功能捕捉那些始终无法投递成功的实例以便进一步排查根本症结所在。 - **应对 System Busy 场景** - 记录日志文件便于事后追溯具体哪个阶段出现了瓶颈制约整体表现。 ```python def consume_message(msg): try: process_business_logic(msg) send_ack_to_broker() # Ensure this is done only after successful processing. except Exception as e: handle_exception(e, msg) # Log error and possibly retry or move to DLQ. def main(): while True: messages = pull_messages_from_broker() for message in messages: threading.Thread(target=consume_message, args=(message,)).start() if __name__ == "__main__": main() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值