当前位置: 首页 > 知识库问答 >
问题:

如何确保消息平均发送到所有消费者

齐承泽
2023-03-14

我们公司在Go中建立了push服务,为了保证传输速度,我们在四台机器上安装了push服务,当我们需要发送通知时,我们将消息发送给rabbitMQ,然后push服务从队列中获取消息,但有时我们发现只有一台机器获取消息。

msgs, err := ch.Consume(
    q.Name,      // queue
    consumerTag, // consumer
    true,        // auto-ack
    false,       // exclusive
    false,       // no-local
    false,       // no-wait
    nil,         // args
)

我应该如何设置配置以确保每个消费者获得相同数量的消息?

共有1个答案

鲜于意
2023-03-14

RabbitMQ只是将消息发送给订阅者,而不检查未确认的消息。要获得公平循环分发,可以执行以下操作

>

  • 首先在消费者通道中设置QoS

        err = ch.Qos(
            1,     // prefetch count
            0,     // prefetch size
            false, // global
    )
    

    接下来,在使用者中将自动确认设置为false

        msgs, err := ch.Consume(
            q.Name, // queue
            "",     // consumer
            false,  // auto-ack
            false,  // exclusive
            false,  // no-local
            false,  // no-wait
            nil,    // args
    )
    

    msg.ack(false)

    这种模式被称为工作队列,这也避免了消息的丢失,如果使用者在发送ack之前出现故障,那么这些消息将被重新排队并交付给另一个使用者进行处理。更多信息,您可以查看此链接

  •  类似资料:
    • 有以下消费者代码: 然后我用脚本生成消息: 问题是,当我将消费者作为两个不同的进程启动时,我会在每个进程中收到新消息。但是,我希望它只发送给一个消费者,而不是广播。 在Kafka的文献中(https://kafka.apache.org/documentation.html)其中写道: 如果所有使用者实例都具有相同的使用者组,则其工作原理就像在使用者之间平衡负载的传统队列一样。 我发现这些消费者的

    • 我想向bot已加入的所有频道发送消息 当特定文件的散列结果与原始结果不同时,我希望将消息发送到bot加入的所有不协调通道。我知道如何向频道发送回复信息 用这个代码,对吗?但我想发送消息到所有的通道,机器人已加入当一些事件发生。

    • 我必须记录消费者在SpringKafka中花费的时间。由于kafkaListener方法对每条消息都执行,因此在那里放置一个记录器是行不通的。此外,有时一些信息会丢失,而不是被消费者消费掉。我应该把记录器放在哪里,以找出消费者启动后的弹性时间。使用者不会退出或关闭,其轮询将无限期进行

    • 面试题 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 面试官心理分析 其实这是很常见的一个问题,这俩问题基本可以连起来问。既然是消费消息,那肯定要考虑会不会重复消费?能不能避免重复消费?或者重复消费了也别造成系统异常可以吗?这个是 MQ 领域的基本问题,其实本质上还是问你使用消息队列如何保证幂等性,这个是你架构里要考虑的一个问题。 面试题剖析 回答这个问题,首先你别听到重复消息这个

    • 在Kafka文献中: Kafka的处理方式不同。我们的主题被划分为一组完全有序的分区,每个分区在任何给定时间都由一个使用者使用。这意味着消费者在每个分区中的位置只是一个整数,即要消费的下一条消息的偏移量。这使得消耗量的状态非常小,每个分区只有一个数字。这种状态可以定期检查。这使得消息确认的等价物非常便宜。 然而,按照同一份文件中的快速入门指南,我很容易就能: 使用单个分区创建主题 创建一个游戏机制

    • 我刚开始使用Firebase云消息。我建了一个IOS应用来接收推送通知。应用程序运行良好。我从Firebase控制台发送消息,它们会正确显示。 我的问题是:我可以向所有设备发送一条消息吗(就像我可以在控制台中做的那样)?我是的,怎么会这样? 提前道谢!