2014-02-27 15 views
8

Ich habe gerade ein Design angegeben, das RabbitMQ als Nachrichtenwarteschlange verwendet. Die Nachricht wird einen JSON-Text enthalten, und für eine bestimmte Nachricht möchte ich eine kleine Binärdatei hinzufügen.Senden einer Binärdatei über RabbitMQ

Was ich gerne wissen würde, ob die Daten der Binärdatei Teil der JSON-Nachricht sein sollen, oder kann sie separat an die Nachricht angehängt werden?

Antwort

11

Die Nachricht ist ein Single-Byte-Stream, es enthält auch einen Header, aber das ist weniger relevant. Ich schlage vor, dass Sie einen von zwei Ansätzen nehmen. Ihr JSON-Objekt enthält ein Feld, das der Byte-Stream der Binärdatei ist. Alternativ gibt es die Adresse, unter der die Datei heruntergeladen werden kann. Wenn die Binärdatei klein ist, sollte die erste gut funktionieren. Andernfalls bevorzugen Sie vielleicht Letzteres.

+0

Das waren meine Gedanken genau, es ist beruhigend zu hören, dass sie von jemand anderem kommen. Vielen Dank! – riqitang

+1

Binärdaten müssen maskiert werden, bevor sie in JSON serialisiert werden können. Siehe http://stackoverflow.com/q/1443158/1196816. Es ist wahrscheinlich besser, die Binärdaten einfach als den Körper des RabbitMQ-Veröffentlichungsaufrufs zu übergeben. – FactualHarmony

10

Da RabbitMQ Nachrichtennutzlast nur ein binäres Array ist, sollten Sie Ihren Nachrichtentext mit 3 Felder kodieren:

  1. Dateigröße
  2. Binärdaten einer Datei
  3. Json

I stimme einer vorherigen Antwort zum Einbetten einer Datei in json nicht zu. Wenn Sie Dateidaten innerhalb von JSON codieren, werden Sie verschwendetem Speicherplatz wegen JSON - Escaping und unnötiger CPU - Nutzung aufgrund von JSON - Kodierung/Dekodierung der Dateidaten + Sie müssen Dateidaten zweimal lesen (einmal für JSON - Deserialisierung und noch einmal Kopieren Sie es, wo es gehen muss)

3

Wir verwenden RabbitMQ und Dateiübertragung. Es funktioniert ein wenig langsam, aber für die Aktualisierung von weit entfernten Kunden ist es duable. Ich würde Ihnen folgende Richtlinien empfehlen: Erstellen Sie eine Nachrichtenstruktur für jeden Block, den Sie senden mit Befehl, Offset und CRC32, Datenlänge, maximal 60kByte pro Block von Daten, geben Sie einen Zähler, am Ende ein sha256, um sicherzustellen, dass die Daten korrekt sind , make tar optional, so dass die Daten können viel kleiner und die Übertragung ist schneller .. machen eine Verzeichnis Sache, um zu sehen, welche Dateien zu aktualisieren ... Verwenden Sie eine Broadcast-Ereignis, um zu sehen, wer verfügbar ist und 1 Kunde zu einem Zeitpunkt mit Client zu aktualisieren. company.update orso, wo ein Kunde auf .Commany hört. viel Spaß! p.s. Dazu haben wir einen Linux-Service eingerichtet, der beim Kunden automatisch startet.

Verwandte Themen