【问题标题】:GO lang NATS Queueing with multiple Queue SubscribeGO lang NATS 队列与多个队列订阅
【发布时间】:2017-04-05 07:12:15
【问题描述】:

我正在创建 NATS go lang Queue Subscriber 客户端,如下所示,

nc.QueueSubscribe("foo", "my_queue", func(msg *nats.Msg) {
        log.Printf("Message :%s", string(msg.Data))
})

所以每当我向“foo”主题发布任何消息时,它会在某些时候收到,而在某些时候不会。

例如,假设我向上面的“foo”主题发送了 10 条消息,那么它最多会收到 2 或 3 条消息。

我的要求如下,

  • 应该有队列订阅。
  • 应处理所有输入事件。
  • 如何在并发模式下实现队列订阅。

任何帮助表示赞赏。

【问题讨论】:

    标签: go concurrency queue subscription nats.io


    【解决方案1】:

    如果您启动多个具有相同名称的队列订阅者(在您的示例中为 my_queue),则在“foo”上发布的消息只会发送给其中一个队列订阅者。

    我不确定您的陈述是否暗示队列订阅者有时会丢失消息。请记住一件事:NATS 中没有持久性(NATS Streaming 中有)。因此,如果您在订阅者创建之前发布消息,并且如果该主题没有其他订阅者,则消息将丢失。

    如果您正在试验并从一个连接启动队列订阅者,然后在同一个应用程序中从另一个连接发送消息,则服务器可能在它开始接收消息之前没有注册队列订阅(同样,如果您正在使用 2 个连接)。如果是这种情况,您需要在创建订阅后和开始发送之前刷新连接:nc.Flush()

    最后,在并发模式下使用队列订阅者并没有什么特别之处。这就是它们的用途:为属于同一组的订阅者对同一主题上的消息进行负载平衡处理。如果您在同一个应用程序中创建多个队列订阅者,您唯一需要注意的是不共享消息处理程序,或者如果这样做,您需要使用锁定,因为如果消息快速到达,消息处理程序将被同时调用够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      相关资源
      最近更新 更多