2016-08-09 3 views
1

Wir verwenden einen dauerhaften Akteur AtLeastOnceDelivery. Wir erhalten eine große Menge unbestätigter Nachrichten und dies verursacht einen OutOfMemoryError, wenn diese Zahl zu groß ist.Akka Persistence - AtLeastOnceDelivery: Wie man eine unbegrenzte Anzahl unbestätigter Nachrichten erhält, ohne den Speicher voll zu haben

Gibt es eine Möglichkeit, den AtLeastOnceDelivery-Actor so zu konfigurieren, dass die unbestätigten Nachrichten auf dem Datenträger verbleiben, anstatt sie alle im Speicher zu behalten, bis sie bestätigt werden?

Oder gibt es eine bessere Alternative zu AtLeastOnceDelivery, die diese Einschränkung umgeht?

+0

Ich möchte nur hinzufügen, wir haben herum mit der maximalen Anzahl von unbestätigten Nachrichten Einstellung gespielt. Obwohl das Reduzieren dieses Werts einen OutOfMemoryError verhindert, führt dies jedoch dazu, dass nachfolgende Nachrichten verworfen werden. Wir hätten gerne eine Lösung, bei der die unbestätigten Nachrichten nicht im Speicher gehalten werden, sondern ständig ohne Verlust von Nachrichten in die Datei gespült werden. –

Antwort

0

Es gibt keine Möglichkeit, die Eigenschaft AtLeastOnceDelivery einzustellen, die nur auf der Festplatte gespeichert wird und die Informationen nicht im Speicher hält. AtLeastOnceDelivery folgt ähnlichen Semantiken wie persistente Aktoren: Die zustellbaren Nachrichten werden in einem Akka-Persistenz-Backend gesichert und für schnellen Zugriff im Speicher gehalten. Der speicherinterne Speicher ist .

Wenn Sie Schwierigkeiten haben, die Speichernutzung in Grenzen zu halten, sollten Sie vielleicht untersuchen, warum das passiert und wie Sie es lösen können. Es scheint mir, dass der Akteur, der nicht mehr genügend Speicher hat, nicht schnell genug Antworten auf seine Nachrichtenlieferungen erhält, so dass sich die zu liefernde Arbeit immer weiter anhäuft.

Es gibt ein paar Tricks, mit denen Sie versuchen können, die Nachrichtenverarbeitung zu beschleunigen. Sie können versuchen, einzelne Komponenten in Ihrer Nachrichtenverarbeitung zu optimieren, um schneller zu sein, oder Sie können versuchen, die Nachrichtenverarbeitung mit Techniken wie der Router actor zu parallelisieren. Manchmal reichen diese Tricks jedoch möglicherweise nicht aus, um die Verarbeitung schnell genug zu erledigen. In diesem Fall müssen Sie überlegen, wie die Nachrichten zur Verarbeitung an den Aktor weitergeleitet werden.

Anstatt dass der Akteur alle ankommenden Nachrichten akzeptiert, können Sie stattdessen make the actor pull the work. Es gibt viele Möglichkeiten, wie Sie dieses Muster implementieren können, aber sie haben eine gemeinsame Prämisse: Statt alle Nachrichten direkt an Akteure zu senden, speichern Sie die Nachrichten in einer Datenbank (oder in einem System, das große Datenmengen verarbeiten kann) Akteure ziehen und bearbeiten die gespeicherten Nachrichten so schnell wie möglich. Ich denke nicht, dass es viele Standardlösungen für das Muster gibt, so dass Sie wahrscheinlich selbst ein wenig an der Implementierung der Lösung arbeiten müssen.

+0

@Jaako danke für deine Antwort. Sie sind bei vielen Punkten, die Sie gemacht haben, genau richtig. Sieht so aus, als müssten wir einen Mechanismus implementieren, um den Arbeits- oder Gegendruck irgendwie zu ziehen. –

Verwandte Themen