2014-02-27 151 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服務,該服務從客戶端自動啓動。

相關問題