慢速网络中的大RabbitMQ消息

Lee*_*iam 2 rabbitmq spring-amqp spring-rabbitmq

我在Spring AMQP上使用RabbitMQ

  • 大邮件(> 100MB,102400KB)
  • 小带宽(<512Kbps)
  • 低心跳间隔(10秒)
  • 单一经纪人

使用该消息将花费> = 200 * 8秒,这超过了我的心跳间隔。从/sf/answers/2965457981/

如果节点之间的消息传输时间(60秒?)>节点之间的心跳时间,将导致群集断开连接并松动消息

  1. 即使我使用单一经纪人,我也会面临断开连接的问题吗?
  2. 心跳和使用者是否使用同一线程,如果使用者正在使用,则无法执行心跳?
  3. 如果是这样,在不增加心跳间隔或减小消息大小的情况下,如何使用该消息?

更新

发布自己的答案后,我还收到了另一个答案和评论。感谢您的反馈。只是为了澄清,我不使用AMQP进行文件传输。实际上,数据是在JSON消息中,一些简单而又小,但有些包含复杂的信息,包括一些手绘图。除了在Data Center中保存数据外,我们还通过AMQP在分支级别保存消息副本,以防无法连接到Data Center的情况。

the*_*yer 5

因此,这里的实际问题更为根本,它们是:(1)通过AMQP执行大型文件传输是否合适,以及(2)心跳有什么作用?

心跳

首先,让我们解决心跳问题。正如RabbitMQ文档明确指出的那样,心跳的目的是“确保应用程序层迅速发现中断的连接”。

这样做的原因是简单的。在普通的AMQP用法中,连续消息到达之间可能有几秒钟甚至几分钟。在没有通过TCP会话交换数据的情况下,许多防火墙和其他网络设备会自动关闭端口,以降低暴露于企业网络的风险。心跳进一步有助于减轻TCP的一个基本弱点,即检测到断开连接的困难。网络遇到故障,TCP并不总是能够自行检测到故障。

因此,这里的底线是,当您传输大型邮件时,连接处于活动状态,并且心跳功能没有任何用处,并可能导致麻烦。在这种情况下,最好将其关闭。

AMQP用于移动大文件吗?

第二个问题,我相信更重要的问题是,应该如何处理大文件。为了回答这个问题,让我们首先考虑一个消息队列的作用:发送消息-少量的数据,它们将某种东西传达给另一个计算机系统。这里的有效词很小。消息通常包含以下三项之一:1.命令(执行某项操作),2.事件(发生某件事),3.请求(给我一些数据)和4.响应(这是您的数据))。关于这些的完整讨论超出了范围,但可以说,这些通常都可以由小于100kB的小消息组成。

确实,RabbitMQ的AMQP协议是一个相当健谈的协议。它要求将大型消息分为不超过131kB的多个段。这会给大型文件传输增加大量开销,尤其是与其他文件传输机制(例如FTP)相比时。其次,在使消息在队列中可用之前,消息必须由代理完全处理,并且在完成此操作时,它将占用代理上的宝贵资源。首先,由于其体系结构,整个消息必须适合代理的RAM。该解决方案可能适用于一个客户和一个经纪人,但是在尝试扩展时会很快中断。

最后,在传输文件时通常需要压缩-HTTP自动支持gzip压缩。AMQP没有。在面向消息的应用程序中,发送包含指向较大数据文件的资源定位符(例如URL)的消息非常普遍,然后可以通过适当的方式对其进行访问。

这个故事的主旨

正如谚语所说:“对于用锤子敲打的人,一切看上去都像钉子。” AMQP不是一把锤子,而是一把精密手术刀。它具有非常特定的目的,并且在该目的内适用范围很窄。将其用于除其预期用途以外的其他用途将导致稳定性和可靠性问题,无论您要设计的是什么,以及对最终产品的总体不满意。