如何将AmazonMQ的消息事件日志同步到CloudWatch?
AmazonMQ获取消息入队时间及关联参数的可行解决方案
AmazonMQ作为AWS托管的消息队列服务,会对自定义Broker插件配置做校验限制,loggingBrokerPlugin确实不在允许的配置项范围内,无法直接启用。可通过以下合规的替代方案实现需求:
- 使用ActiveMQ原生Advisory通知机制
该功能是ActiveMQ官方原生支持,且AmazonMQ未做限制,默认处于开启状态。你可以订阅专门的系统通知主题获取消息全生命周期事件:- 消息入队事件对应主题:
ActiveMQ.Advisory.MessageAdded.Queue(队列场景)、ActiveMQ.Advisory.MessageAdded.Topic(主题场景) - 消息出队事件对应主题:
ActiveMQ.Advisory.MessageDelivered.Queue、ActiveMQ.Advisory.MessageDelivered.Topic
通知事件中默认携带消息ID、入队时间戳、目标队列/主题名称、消息自定义属性等你需要的全部参数。你只需要部署一个轻量的专属消费者服务,订阅上述Advisory主题,将收到的事件字段解析后直接输出到CloudWatch Logs或自有日志系统即可,全程不需要修改Broker的核心配置。如果你的实例默认关闭了Advisory支持,可在AmazonMQ允许修改的配置项中把advisorySupport设置为true即可生效。
- 消息入队事件对应主题:
- 业务侧埋点上报日志
如果可以调整生产者、消费者的业务代码,可直接在业务侧做日志埋点:生产者发送消息时,给消息添加x_send_timestamp这类自定义属性记录发送时间,同时上报包含消息ID、队列名、业务参数、发送时间的日志到CloudWatch;消费者消费消息时也同步上报消费时间、处理状态等关联日志,通过消息ID做匹配即可关联出入队全链路信息。该方案不需要调整Broker任何配置,灵活度更高,还可以按需添加业务自定义字段。 - 自定义托管ActiveMQ实例
如果以上两种方案都无法满足需求,必须使用Broker侧的全量日志功能,可以将ActiveMQ部署在EC2上自行托管,即可自由配置loggingBrokerPlugin等所有原生ActiveMQ插件,不过该方案需要自行承担实例运维、容灾、监控等工作,会增加运维成本。
注意:如果你的Broker消息吞吐量极高,使用Advisory机制前需要做性能评估,可按需只开启你需要的Advisory事件类型,减少额外性能消耗。
内容的提问来源于stack exchange,提问作者Nícolas Iensen
相关产品推荐
相关产品推荐

