【问题标题】:Distributed Java system based on rabbitMQ基于rabbitMQ的分布式Java系统
【发布时间】:2015-04-18 17:29:18
【问题描述】:

假设我有 100 台物理服务器。他们每个人都运行一个java进程。我们有一个全局 rabbitMQ 队列。该队列在所有 100 个进程之间共享。换句话说,我需要 100 个 JVM 中的每一个都监听这个全局队列。 第一个问题是可以做到吗? 第二个问题是如果可能的话,如何将消息从全局队列分派到 100 个节点,并确保负载按比例分配,这样我们就不会出现一个节点加载到 100%,其他 99 个到0.0005%。

每个节点都有最小和最大容量。所以理想情况下,一个 JVM 应该询问队列它有多少项目。然后抓取所需数量的物品,直到它的最大容量。上面提到的 100 个中的每个 JVM 都应该这样做。那么如何同步队列呢?它如何让某些机器上的 spring amqp 知道该项目已准备好进行处理?如何平衡负载?谢谢

【问题讨论】:

    标签: java spring rabbitmq


    【解决方案1】:

    这对我来说听起来像是分片。我没用过,不过现在 RabbitMQ 上有一个分片插件。 https://github.com/rabbitmq/rabbitmq-sharding

    【讨论】:

    • 谢谢Jim,但是我觉得分片不好,因为它将消息从一个队列分片到X个队列,但我需要说我需要队列1上的2条消息,4条消息队列 2 等等。每个消费者都应该有最小和最大容量。此容量可能会在运行时更改。所以 JVM1 从队列中获取 3 条消息,然后 JVM2 获取 5 条消息,依此类推。我会考虑为每个节点设置临时队列,但需要考虑如何按比例加载所有节点。你怎么看?
    【解决方案2】:

    第一个问题是可以吗?

    是的,没有问题。

    如何将消息从全局队列分派到 100 个节点并制作 确保负载将按比例分配,所以我们不会 得到一个节点加载到 100% 和其他 99 到的情况 0.0005%。

    RabbitMQ 在同一队列上的消费者之间进行循环:RabbitMQ will send each message to the next consumer, in sequence。要限制发送给消费者的消息数量,可以使用consumer prefetch,并根据节点的最大容量设置QoS。因此,只要节点尚未达到其 QoS,RabbitMQ 就会将消息推送到节点。它的最大容量即。未确认消息的数量低于此阈值。

    所以节点不需要知道队列中包含消息,消息会被推送到节点:

    1. 只要未达到 QoS 阈值,消息就会被推送到节点。
    2. 消息被放入本地队列
    3. 一旦有 worker 可用,worker 就会接收消息并处理它
    4. Worker 完成进程后确认消息
    5. 由于消息已确认,当前未确认的消息低于 QoS 阈值,循环到 1)。

    见:

    【讨论】:

    • 谢谢尼古拉斯!不幸的是,这个想法似乎对我不起作用。我需要配置消费者,而不是 MQ。因此,当 MQ 向 comsumer1 发送消息时,如果它的缓冲区中的项目数少于最小数量,它应该从队列中读取剩余的项目。此外,如果消费者达到了它的最大项目数,它应该拒绝该消息,并且该消息应该发送给另一个消费者。在我的情况下,应该为每个队列设置预取,但即使这样也不能让我像我想要的那样控制消费者。请让我知道你的想法。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 2013-04-02
    相关资源
    最近更新 更多