2
  1. ELB 将自动关闭连接 60 秒空闲,TCP 连接切换到 CLOSE_WAIT 状态
  2. 但是,celery 不会被注意到并保持发布任务消息
  3. 消息将保存在发送缓冲区中
  4. 当缓冲区已满时,celery 发布调用将被阻塞。

可能的损坏:

  • 发送缓冲区中的消息将丢失
  • 阻塞发布调用对单线程 ioloop 框架是非常有害的。例如龙卷风
4

1 回答 1

2

解决方案

  • BROKER_TRANSPORT_OPTIONS = {'confirm_publish': True}让 celery 等待每个发布消息的 ack,如果 ack 没有收到,它将重新建立连接并再次发送。仅适用于 py-amqp ( ref ),性能降级。
  • Celery-RabbitMQ Heartbeat保持连接活跃并避免 ELB 的自动关闭连接。添加额外的网络开销,在糟糕的网络环境下,心跳可能无法传递到两端,导致此解决方案无法正常工作。
于 2014-10-08T18:52:14.990 回答