2014-02-27 150 views
8

我正在设计一个使用RabbitMQ作为消息队列的设计。该消息将具有JSON正文,对于特别的一条消息,我想添加一个小的二进制文件。通过RabbitMQ发送二进制文件

我想知道的是,二进制文件的数据应该是JSON消息的一部分,还是可以单独附加到消息中?

回答

11

该消息是一个单字节流,它也包含一个头,但不太相关。我建议你采取两种方法之一。您的JSON对象包含一个字段,该字段是二进制文件的字节流。或者它给出了可以下载文件的地址。如果二进制文件很小,那么前者应该可以正常工作。否则,你可能会喜欢后者。

+0

这些完全是我的想法,听到他们来自别人是令人欣慰的。谢谢! – riqitang

+1

在将二进制数据序列化为JSON之前,需要将其转义。请参阅http://stackoverflow.com/q/1443158/1196816。作为RabbitMQ发布调用的主体传递二进制数据可能会更好。 – FactualHarmony

10

由于RabbitMQ的消息有效载荷仅仅是一个二进制数组,你应该有3个字段编码您的邮件正文:

  1. 文件大小
  2. 文件
  3. 的二进制数据的Json

我不同意以前关于在json中嵌入文件的回答。 如果你在json里面编码文件数据,你会因为json转义而获得浪费的空间+因为json编码/解码文件数据导致不必要的CPU使用率+你需要两次读取文件数据(一次用于json反序列化,将其复制到需要去的地方)

3

我们使用RabbitMQ和文件传输。它的工作速度有点慢,但为了更新远端客户,它是可行的。我建议你遵循以下指导原则:使用命令,偏移量和CRC32,数据长度,每块数据最大60kByte为每个块创建一个消息结构,给块一个计数器,在末尾做一个sha256以确保数据正确,使tar可选,以便数据可以小得多,传输速度更快..做一个目录的事情,看看哪些文件需要更新...使用广播事件来查看谁可用,并与客户端一次更新1个客户。 company.update orso,客户收听。公司。玩得开心!附:我们也为此创建了一个linux服务,该服务从客户端自动启动。

相关问题