【问题标题】:Rabbitmq cluster crashing when creating queues创建队列时 Rabbitmq 集群崩溃
【发布时间】:2023-03-06 23:18:01
【问题描述】:

您好,我有一个问题,我找了大约 2 天后无法解决,所以我会在这里写出来,尽可能清楚,以便它也可以帮助其他人。

场景是:

  1. 我们有一个应用程序,可以使用 Rabbitmq 集群处理大约 200k 个采用 amqp 协议的设备。
  2. 我们曾考虑让 1 个 Exchange 具有 200k 队列,每个设备大约有 6 个“路由密钥”。
  3. 这些队列需要持久且惰性,因为我们不想丢失任何消息。
  4. 我们正在使用镜像节点,因为我们需要 HA。

测试:

  1. 我创建了一个有 5 个节点和复制 2 个的集群
    "definition": {
            "ha-mode": "exactly",
            "ha-params": 2,
            "ha-sync-mode": "automatic",
            "ha-sync-batch-size": 1
          }
  1. 我还使用路由键创建了 50k 持久、惰性、队列。
def create_one_queue(queue_name, threadName, channel):
    channel.queue_declare(queue=queue_name, durable=True, arguments={'x-queue-mode': 'lazy'})
    for bind in BINDINGS:
        channel.queue_bind(exchange=EXCHANGE, queue=queue_name, routing_key=bind.format(queue_name))
    print("[{}]Created Queue {}".format(threadName, queue_name))

def create_queues(threadName, base):
    channel = get_channel()
    for i in range(0, 1000):
        try:
            queue_name = str(i + base)
            create_one_queue(queue_name, threadName, channel)
        except Exception as e:
            print(e)

3. 当我试图继续增长并达到 200k 节点时开始崩溃而没有耗尽资源。

链接

我已经看过以下帖子:

https://www.rabbitmq.com/ha.html#ways-to-configure

https://www.cloudamqp.com/blog/2018-01-09-part3-rabbitmq-best-practice-for-high-availability.html

RabbitMQ - How many queues RabbitMQ can handle on a single server?

https://serverfault.com/questions/378165/rabbitmq-reasonable-performance-scale-expectations

http://rabbitmq.1065348.n5.nabble.com/How-many-queues-can-one-broker-support-td21539.html

https://www.quora.com/RabbitMQ/Can-rabbitMQ-or-zeroMQ-handle-1mil-queues

但我看到了矛盾(cloudamqp 建议使用少量队列,但在其他地方说您可能会到达 1M 队列)

问题

  1. 如果我没有耗尽资源,集群怎么可能开始崩溃?
  2. 我的方法错了吗?
  3. 有什么建议可以改进我的集群配置?

非常感谢

【问题讨论】:

  • 你应该在 rabbitmq-users 谷歌群里问这样的问题; RabbitMQ 工程师不会密切监控 Stack Overflow。
  • 感谢@GaryRussell 的提示,已经做到了。我看到你对 Rabbitmq 很有经验,你有没有工作过或见过有这么多队列的集群?我至少需要知道是可能的。谢谢
  • 我不知道;对不起。

标签: rabbitmq amqp messagebroker rabbitmq-exchange


【解决方案1】:

好的,我将用我目前的调查结果来回答我的问题:

1) 当我使用 Kubernetes 和 Helm 来部署集群时,我在 Pod 中施加了很大的内存压力,没有为垃圾收集器留下可用空间。 https://www.rabbitmq.com/memory-use.html#queue-memory-usage-gc

高内存水印阻止发布者并阻止新消息从 正在排队。由于垃圾收集可以使 一个队列,将内存高水位设置在 0.5 以上是不安全的。这 默认高内存水印设置为 0.4,因为这样更安全 所有内存都被队列使用。这完全是特定于工作负载的, 这在 RabbitMQ 部署中有所不同。

2) 看起来不错。

3) 为了创建 200k 持久和惰性队列,我必须使用一个由 10 个节点组成的集群,每个节点配备 8 个 vCPU 和 30 GB RAM。

注意:我会在调整集群时及时更新此答案。

【讨论】:

  • “我压力太大”是什么意思?比如,盯着队列看?
  • 已经更新了响应。我的意思是我几乎使用了所有的 pod 内存,我将值“rabbitmqMemoryHighWatermark”设置为 pod 内存的 0.5 并开始更好地工作(直到没有内存)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2015-12-17
  • 1970-01-01
相关资源
最近更新 更多