我可以使用消息队列坐在我的应用程序和外部系统之间来跟踪所有发出的信息吗?

Posted

技术标签:

【中文标题】我可以使用消息队列坐在我的应用程序和外部系统之间来跟踪所有发出的信息吗?【英文标题】:Can I use a Message queue to sit between my application and external system to track everything which goes out? 【发布时间】:2019-11-15 14:57:52 【问题描述】:

我有一个 spring-boot 应用程序可以进行一些处理。这个应用程序发出请求,与不同的应用程序通信。请求包括

HL7 消息发送到外部系统的 tcp/ip 套接字。 对其他 API 的 http 请求(不是每个 API 调用,而是选择一个) json 数据到文件系统

我需要一种机制来存储所有发出的信息并进行跟踪,这样如果我需要重新发送某些内容,我应该能够手动重新发送它们。并且还要确保发送出去的东西最终会发送到端点。

我查看了消息代理/消息队列 - RabbitMQ、Kafka、ActiveMQ。我没有与这些中的任何一个合作过。据我了解,这些排队框架提供了发布/订阅机制,直接交换模式。

我的问题

在消息传递环境中,我可以将消息发送到代理,然后让代理发送到外部端点吗? 消费者是连接到MQ还是订阅MQ接收消息?代理不能只向接收者推送消息吗? 如果receiver是一个restful API,它可以直接接收请求而不编写任何MQ特定的消费者代码吗?我不能要求外部系统编写一些消费者代码。

我最初认为我可以为此目的使用消息代理。但后来经过分析得出结论,Message broker 不适合我的情况。我的假设正确吗?

替代解决方案, 为从系统发出的每个请求/消息添加一个条目以及有效负载。构建可用于跟踪这些请求的 UI,并在 UI 中提供重新发送选项,可用于将这些消息重新发送到端点。查看每天发送的大约 200000 个请求/消息。

【问题讨论】:

【参考方案1】:

如果您唯一的要求是重新发送失败的消息,您可以使用像 RabbitMQ 这样的简单消息队列来对失败的消息进行排队。然后开发一个单独的服务来订阅上述队列并重新发送它收到的消息。

如果您希望通过更多需求来扩展您的服务,那么请选择 Kafka。 但无论您选择哪种消息代理,都应该这样设计。

    处理器服务(可以是您现有的 Spring Boot 应用)- 这将处理并将结果发布到消息代理。 Kafka/RabitMQ/ZeroMQ - 这只是一个保存消息的队列 集成服务 - 这将订阅上述消息队列并发送它收到的任何请求。失败的消息可以重新排队到 Kafka 以供以后处理。

这样,您不必要求第 3 方来实现您的逻辑,并且您将对集成有更多的控制权。

【讨论】:

以上是关于我可以使用消息队列坐在我的应用程序和外部系统之间来跟踪所有发出的信息吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在至少有一个队列可用的情况下缓冲消息?

为什么要使用消息队列?

什么是消息队列?

如何在Unix / Linux消息队列中设置基于ssl的通信?

PHP 中消息队列和工作系统的有效架构?

系统可扩展设计方法之消息队列