Es ist ein Enterprise Integration Pattern aus dem Buch von Hohpe/Wolfe nannte die Claim Check Pattern, die diese Bedenken anspricht.
Im Wesentlichen wird der große Blob aus der Nachricht entfernt und irgendwo gespeichert, auf den sowohl Absender als auch Empfänger zugreifen können, sei es eine gemeinsame Dateifreigabe, FTP-Server, ein Amazon S3-Blob, was auch immer. Es hinterlässt eine "Claim Check": eine Art Adresse, die beschreibt, wie man den Blob zurück findet.
Die kleine Nachricht kann dann über Kafka/JMS oder ein anderes Nachrichtenwarteschlangensystem übertragen werden, von denen die meisten ziemlich schlecht im Umgang mit großen Datenblobs sind.
Natürlich ist eine sehr einfache Implementierung, die Dateien auf einer Dateifreigabe zu lassen und nur auf sie nach Dateipfad verweisen.
Es ist komplexer, wenn es vorzuziehen ist, den Blob mit dem Rest der Nachricht zu integrieren, was eine echte Claim Check-Implementierung erfordert. Dies kann auf einer Infrastrukturebene gehandhabt werden, so dass der Absender und der Empfänger der Nachricht keine Details darüber wissen müssen, wie die Daten übertragen werden.
Ich weiß, dass Sie in der Java-Landschaft sind, aber in NServiceBus (Ich arbeite für Particular Software, die Macher von NServiceBus) dieses Muster mit den Data Bus feature in einer Nachrichtenpipeline Schritt umgesetzt wird. Der Entwickler muss nur ermitteln, welche Art von Nachrichteneigenschaften auf den Datenbus angewendet werden, und (in der standardmäßigen Dateifreigabe-Implementierung) den Speicherort der Dateien konfigurieren. Entwickler können auch ihre eigene Datenbusimplementierung bereitstellen.
Eine Sache zu beachten ist, dass Sie mit den Blobs, die von den Nachrichten getrennt sind, für die Bereinigung sorgen müssen. Wenn die Nachrichten in einer Richtung sind, können Sie sie bereinigen, sobald die Nachricht erfolgreich verarbeitet wurde. Mit Kafka (nicht besonders vertraut) gibt es eine Möglichkeit, Nachrichten aus einem Stream mehrmals zu verarbeiten, richtig? Wenn ja, möchten Sie warten, bis diese Nachricht nicht mehr verarbeitet werden konnte. Oder, wenn das Publish/Subscribe-Muster verwendet wird, möchten Sie die Dateien nicht bereinigen, bis Sie sicher waren, dass alle Abonnenten eine Chance hatten, verarbeitet zu werden. Um dies zu erreichen, müssen Sie für die Nachricht ein SLA (eine Zeitspanne, in der jede Nachricht verarbeitet werden muss) festlegen und den BLOB-Speicher nach Ablauf dieser Zeitspanne bereinigen.
In jedem Fall, viele Dinge zu beachten, die es viel nützlicher machen, auf einer Infrastrukturebene zu implementieren, anstatt zu versuchen, Ihre eigenen in jedem Fall zu rollen.
Dies gehört wahrscheinlich auf [Programmierer.se] –
@JimGarrison: Diese Frage scheint in ihrer gegenwärtigen Form nicht zu beantworten. –
Ich stimme zu, dass es grenzwertig ist, aber ich sehe einen Kern einer nützlichen Frage (wie man mit großen Nachrichten in einer Microservices-Umgebung umgeht). –