我对 RabbitMQ 比较陌生,发现它非常方便和快捷,我用它通过 ruby + bunny gem 来通信小对象。
现在我尝试传递每个大约 10~20MB 的对象进行交换,并将其扇出给其订阅者。
看起来工作正常,但是使用 RabbitMQ 作为发布者是一个好的做法吗?或者我应该对 RabbitMQ 使用一些猜想?
您不应该通过 AMQP 发送文件。
消息队列不是数据库。具体来说,RabbitMQ 并不是按照在队列中存储大对象的想法构建的,因为消息不应该很大。
想一想现实世界 - 多年来(不一定不再那么多)的邮政服务针对信件处理进行了优化。如果您的信件太厚(重),他们会收取相当高的额外邮资费用。大消息的传播和破坏系统的成本更高。此外,您的邮箱不会容纳大邮件 - 它们会被留在其他地方 - 要么在单独的包裹投递中,要么在您的前门(有时它们会丢失)。
消息队列也是同样的道理。消息通常包含一小段数据,描述应用程序中发生的事件或其他有意义的事情。通常一条消息传送的数据可以在100kB或更小的范围内传送。
正如我在这个答案中提到的,AMQP 协议(RabbitMQ 的基础)是一个相当健谈的协议。它要求将大消息分为多个不超过131kB的段。这可能会给大文件传输带来显着的开销,尤其是与其他文件传输机制(例如 FTP、HTTP)相比。
对于性能而言,更重要的是,消息必须由代理完全处理,然后才能在队列中可用,并且在完成此操作时会占用代理上的 RAM。将文件放入代理中可能适用于一个客户端和一个代理,但在尝试横向扩展时它会很快崩溃。最后,传输文件时通常需要压缩 - HTTP 自动支持 gzip 压缩,而 AMQP 不支持。
你该怎么办? 在面向消息的应用程序中,发送包含指向较大数据文件的资源定位符(例如 URL)的消息是很常见的,然后通过适当的方式访问该文件。
| 归档时间: |
|
| 查看次数: |
1336 次 |
| 最近记录: |