我在同一可用区和安全组中有两个Ubuntu EC2实例。 Web服务器正在服务器A上运行,它使用php-amqplib通过RabbitMQ将长时间运行的作业请求传递回服务器B.
RabbitMQ服务器正在服务器A上运行。服务器B正在侦听服务器A上的队列。
大多数情况下,系统按预期工作。用户在Web服务器(服务器A)上执行操作,该操作将作业排入队列,服务器B接收消息并完成作业。在这些情况下,RabbitMQ日志显示在一秒内提供服务的请求:
=INFO REPORT==== 29-Nov-2016::00:07:11 ===
accepting AMQP connection <0.31632.2> (###.###.###.###:51968 -> ###.###.###.###:5672)
=INFO REPORT==== 29-Nov-2016::00:07:11 ===
closing AMQP connection <0.31632.2> (###.###.###.###:51968 -> ###.###.###.###:5672)
但是,在执行相同的请求时,我间歇性地出现etimedout
错误:
=ERROR REPORT==== 28-Nov-2016::21:56:51 ===
closing AMQP connection <0.21543.0> (###.###.###.###:56827 -> ###.###.###.###:5672):
{inet_error,etimedout}
如何调试此问题?我已经确认,在服务器B上运行nmap
时,服务器A的RabbitMQ端口似乎已打开,并且设置部分工作。关于如何调试失败案例的任何想法?
答案 0 :(得分:0)
亚马逊网络基础设施可能会强行关闭服务器之间的“空闲”连接。
尝试在连接配置中添加心跳。即使服务器之间没有消息移动,这也会强制连接保持活动状态。
https://www.rabbitmq.com/heartbeats.html
30秒的心跳可能就足够了。如果需要,你可以降低。我不确定EC2如何确定“空闲”连接。