【问题标题】:API design around RabbitMQ for publisher/subscriber围绕 RabbitMQ 为发布者/订阅者设计的 API
【发布时间】:2016-12-10 00:27:47
【问题描述】:

TL;DR - 通过 REST API 向消费者公开 RabbitMQ 的最佳方式是什么?

我正在创建一个 API 来发布和使用来自 RabbitMQ 的消息。在我目前的设计中,发布者将发出一个 POST 请求。我的 API 会将 POST 请求路由到交易所。这样,发布者在发布时不必知道服务器地址、交换名称等。

现在消费者部分是我不知道如何进行的地方。

一开始不会有排队。当一个新的消费者想要订阅一个 TOPIC 时,我将创建一个队列并将其绑定到交换。我需要帮助解答几个问题 -

  1. 为消费者创建队列后,让消费者从该队列获取消息的下一步是什么?
  2. 我让消费者​​从队列中请求一批消息(比如 50 条消息)。然后,一旦我收到来自消费者的确认,我将从队列中发送接下来的 50 条消息。如果我没有收到确认,我会将 50 条消息重新排入队列。就消费者和我的 API 之间的打开和关闭连接而言,这不是很昂贵吗?

如果有更好的方法,请提出建议

【问题讨论】:

  • 呃,在不知道真正需要的情况下很难回答。请添加您的目标语言,以便您获得更好的推荐。简而言之:1)要消费你需要开始消费,在 AMQP 协议级别它是一个 basic.consume 方法,在客户端库中,无论语言它都应该以类似的方式调用。 2)您基本上不会从队列向消费者发送任何消息,这是代理(RabbitMQ)的责任。您将消息发送到交换器,将队列绑定到交换器并从队列中消费。但是,如果它符合您的需求,您可以在消费者和发送者之间进行交互。应该衡量实际成本。

标签: rabbitmq api-design


【解决方案1】:

一般来说,您将 RMQ 置于 REST API 之后的想法是一个不错的想法。您不想直接向世界公开 RMQ。

具体问题:

为消费者创建队列后,下一步如何让消费者从该队列中获取消息?

你读过教程吗?对于您正在使用的语言,我将从那里开始:http://www.rabbitmq.com/getstarted.html

就消费者和我的 API 之间的打开和关闭连接而言,这不是很昂贵吗?

不要为每批消息打开和关闭连接。

您的应用程序实例(“消费者”应用程序)应该有一个连接。只要您需要,该连接就会保持打开状态 - 只要您愿意,就可以多次调用 RabbitMQ。

我通常会在应用启动后立即打开我的 RMQ 连接,并一直保持打开状态直到应用关闭。

在消费者应用程序中,使用单个连接,您将通过该连接创建多个通道。通道是完成实际工作的地方。

根据您的语言,每个线程都有一个频道;每个队列消耗一个通道;等等

与连接不同,您可以非常快速地创建和销毁通道。

更具体地说,根据您对批处理的想法,这将通过对您的消费者设置消费者预取限制来处理,然后要求在处理后确认消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2016-12-14
    相关资源
    最近更新 更多