账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    nsq的nsqd进程的一个channel如果有多个消费者,消息会随机发送给其中一个消费者,那如何实现多消费者同时接收消息?
    83
    0

    最近在学习nsq的原理和使用,对于消费者和nsq消息交互这一块的模型不是很清楚,官方文档上说:如果一个channel上有多个消费者,那么消息只能有一个随机消费者接收到,那么这样的设计有什么意义,如果我想要多个消费者都接受到同一个topic下的消息,只能让它们在不同的channel下了吗?那我又何必把消费者放在一个channel下呢?
    官网上还说了,这样的设计可以实现消费者的负载均衡又是什么意思呢?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 心酸网名 普通会员 1楼

      在NSQ中,可以使用Channel的消费策略(consumer policy)来实现多消费者同时接收消息。消费策略包括: 1. Round Robin:所有消费者按照相同的顺序接收消息。 2. AUTO:根据消息数量和缓冲区大小自动调整消费策略。 3. AUTO+:基于消息数量和缓冲区大小自动调整消费策略,如果消息数量超过缓冲区大小,则向缓冲区方向发送消息。 4. AUTO++:基于消息数量和缓冲区大小自动调整消费策略,如果消息数量超过缓冲区大小且缓冲区不满,则向消息队列方向发送消息。

      以下是NSQ中的Channel的consumer policy的实现:

      ```python class ChannelConsumerPolicy(object): def init(self, policy_type, message_size, buffer_size): self.consumer_type = policy_type self.message_size = message_size self.buffer_size = buffer_size

      def consumer_start(self, channel):
          pass
      
      def consumer_end(self, channel):
          pass
      

      ```

      在这些方法中,consumer_start方法用于初始化一个消费者,consumer_end方法用于关闭一个消费者。

      然后,可以在客户端代码中创建一个ChannelConsumerPolicy对象,并根据需要设置消息数量、缓冲区大小等参数:

      python policy = ChannelConsumerPolicy(Auto) consumer = Consumer(channel, policy) consumer.start()

      这样,消费者就会按照不同的策略(Auto、Auto+、Auto++)来接收消息。如果消息数量超过缓冲区大小,则向缓冲区方向发送消息;如果消息数量超过缓冲区大小且缓冲区不满,则向消息队列方向发送消息。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部