Wer weiß von einer Nachrichtenbusimplementierung, die granulare Kontrolle über Konsistenzgarantien bietet? Volle ACID ist zu langsam und keine ACID ist zu falsch.Suchen Sie nach Nachrichtenbusimplementierungen, die etwas zwischen voller ACID und nichts bieten
Wir verwenden derzeit Rhino ESB um MSMQ für unsere Messaging. Wenn Sie dauerhaftes transaktionales Messaging mit verteilten Transaktionen verwenden, kann MSMQ das Commit für eine beträchtliche Zeit blockieren, während es auf die E/A-Beendigung wartet.
Unsere Nachrichten fallen in zwei allgemeine Kategorien: Geschäftslogik und Denormalisierung. Letztere machen einen erheblichen Prozentsatz des Nachrichtenbusverkehrs aus.
Business-Logik-Nachrichten erfordern die Garantien der vollen ACID und MSMQ hat sich als ausreichend erwiesen.
Entnormierung Nachrichten:
- muss dauerhaft sein.
- darf nicht verarbeitet werden, bis die ursprüngliche Transaktion abgeschlossen ist.
- kann mehrmals verarbeitet werden.
- KÖNNEN verarbeitet werden, auch wenn die ursprüngliche Transaktion zurückgesetzt wird, solange 2) eingehalten wird.
(In einigen speziellen Fällen die Haltbarkeit Anforderungen wahrscheinlich gelockert werden könnte, aber die Identifizierung und die Fälle als Ausnahmen von der Regel Komplexität fügt Handhabung.)
Alle Denormalisation Nachrichten-Prozess behandelt werden, so dass keine ist Notwendigkeit für IPC.
Wenn der Prozess neu gestartet wird, kann davon ausgegangen werden, dass alle Transaktionen abgeschlossen (Commit oder Rollback) und alle Denormierungsnachrichten, die noch nicht verarbeitet wurden, wiederhergestellt werden müssen. Es ist akzeptabel, Denormalisierungsnachrichten wiederzugeben, die bereits verarbeitet wurden.
Soweit ich sagen kann, tendieren Messaging-Systeme, die mit Transaktionen umgehen, in der Regel die Wahl zwischen voller ACID oder nichts, und ACID trägt eine Leistungseinbuße. Wir sehen Aufrufe von TransactionScope # Commit(), die abhängig von der Anzahl der gesendeten Nachrichten in manchen Fällen einige hundert Millisekunden dauern.
Die Verwendung einer nicht transaktionalen Nachrichtenwarteschlange führt dazu, dass Nachrichten verarbeitet werden, bevor ihre ursprüngliche Transaktion abgeschlossen wird, was zu Konsistenzproblemen führt. Ein anderer Teil unseres Systems, der ähnliche Konsistenzanforderungen aber eine geringere Komplexität aufweist, verwendet bereits eine benutzerdefinierte Implementierung von etwas, das einem Transaktionsprotokoll ähnelt, und eine Verallgemeinerung, dass für diesen Anwendungsfall eine Option ist, würde ich aber lieber nicht implementieren ein kurzlebiges, gleichmäßiges, dauerhaftes, transaktionales Nachrichtensystem selbst, wenn ich nicht muss: Wenn jemand sich wundern mag, ist der Grund für das Erfordernis der Dauerhaftigkeit von Denormalisierungsnachrichten, dass das Erkennen von Desyncs und das Fixieren von Desyncs extrem schwierig sein kann und extrem teuer. Menschen tun beachten Sie, wenn etwas leicht falsch ist und eine Seite aktualisieren es nicht beheben, so Ignorieren desyncs ist keine Option.
Beschlossen, Nachrichtenbus-Transaktionen von Datenbanktransaktionen zu trennen, indem eine dauerhafte In-Process-Warteschlange implementiert wird. Business-Logik-Nachrichten werden weiterhin nicht idempotent sein, aber die Transaktion, in der sie gesendet werden, betrifft nur die Nachrichtenwarteschlange und wird nur nach der auslösenden Datenbanktransaktion abgeschlossen. Dadurch wird die Konsistenz bei der ReadCommitted-Isolation sichergestellt. Die dauerhafte Warteschlange wird auch verwendet, um Denormalisierungsvorgänge auszulösen, statt sie über MSMQ zu senden. –