项目中的Agent分网段订阅ActiveMQ集群中VLAN.开头的Topic,但是一直会出现有agent无法收到消息的情况。针对这个现象,最近几天都在研究测试,今天有了点眉目,记录一下进展。
消息的发送有三个要素,生产者,MQ,消费者。消费者保持与MQ的长连接,使用consumer.receive方法拉取消息。目前的现象是生产者日志里记录了已经将消息发送至MQ了,但是消费者端没收到。
排查问题思路
检查消息是否真的发送至mq。
方法:通过一个订阅所有Topic(VLAN.>)的消费者,检查MQ是否真的收到了消息。同时检查agent是否收到消息。
结果:消费者显示MQ的确收到了,但是Agent没有收到。由于Agent使用了消息选择器接收Topic消息,所以需要测试消息选择器是否可用。
方法:通过下发十几个agent,检查消息选择器是否可用。
结果:消息选择器没有问题。Agent连接是否正常
方法:找网络的同事一起查
结果:通过tcpdump,检查发现consumer.receive()并不会与服务器产生交互。真是见了鬼了。由于前期我关了MQ上的inactivity monitor,所以agent和mq之间出现了僵死的连接。Agent端判断连接正常,mq上又认为连接断开了。所以failover机制没生效,数据无法通信。
解决方案:开启broker端的inactivity monitor功能。
此外,还发现了Agent在从blobmessage读取数据流的时候,读取一半就卡住了。这个问题还要再看看。。。
写这个文章的时候,生产同事又打了个电话给我,现在看到生产的电话就吓死了啊!!幸好只是问个问题。。。