- ELB将在空闲60秒时自动关闭连接,TCP连接切换到close_WAIT状态
- 但是,芹菜并没有引起注意并保持发布任务消息
- 消息将保留在发送缓冲区中
- 当缓冲区已满时,芹菜发布调用将被阻止
可能的损坏:
- 发送缓冲区中的消息将丢失
- 阻塞发布调用将对单线程ioloop框架非常有害。例如龙卷风
解决方案
BROKER_TRANSPORT_OPTIONS = {'confirm_publish': True}
使celery为每个发布的消息等待ack,如果ack没有接收到,它将重新建立连接并再次发送。仅适用于py amqp(ref),性能降级- Celery RabbitMQ心跳以保持连接处于活动状态,并避免ELB的自动关闭连接。添加额外的网络开销,在糟糕的网络环境中,心跳可能无法传递到两端,并导致此解决方案无法工作