2013-07-23 16 views
14

die Situation vor:Integration RabbitMQ mit Datenbank-Transaktionen

var txn = new DatabaseTransaction(); 

var entry = txn.Database.Load<Entry>(id); 
entry.Token = "123"; 
txn.Database.Update(entry); 

PublishRabbitMqMessage(new EntryUpdatedMessage { ID = entry.ID }); 

// A bit more of processing 

txn.Commit(); 

nun ein Verbraucher von EntryUpdatedMessage kann möglicherweise diese Meldung vor die Transaktion txn verpflichtet ist und daher nicht in der Lage sein, um das Update zu sehen. Jetzt weiß ich, dass RabbitMQ Transaktionen selbst unterstützt, aber wir können sie nicht wirklich verwenden, weil wir für jedes Publish ein neues IModel erstellen und ein per-thread-Modell in unserem Szenario wirklich umständlich ist (ASP.NET-Webanwendung)).

Ich dachte an eine Liste von Nachrichten, die veröffentlicht werden sollen, wenn eine DB-Transaktion festgeschrieben wird, aber das ist eine wirklich übel riechende Lösung.

Wie ist der richtige Umgang damit?

Antwort

28

RabbitMQ fordert Sie auf, die Bestätigungen des Herausgebers anstelle von Transaktionen zu verwenden. Transaktionen funktionieren nicht gut.

In jedem Fall arbeiten Transaktionen normalerweise nicht sehr gut mit einer serviceorientierten Architektur. Es ist besser, einen "möglicherweise konsistenten" Ansatz zu wählen, bei dem ein Fehler zu einem späteren Zeitpunkt erneut versucht werden kann und doppelte idempotente Nachrichten ignoriert werden.

In Ihrem Beispiel würde ich die Datenbank aktualisieren und es vor dem Veröffentlichen der Nachricht festschreiben. Wenn der Herausgeber die Rückgabe bestätigt, würde ich ein Feld im Datenbankeintrag aktualisieren, um anzuzeigen, dass die Nachricht gesendet wurde. Sie können dann später einen Kehrvorgang durchführen lassen, nach ungesendeten Nachrichten suchen und sie auf den Weg schicken. Wenn die Nachricht durchgelaufen ist, aber aus irgendeinem Grund die Bestätigung oder der nachfolgende Datenbankschreibvorgang fehlgeschlagen ist, erhalten Sie eine doppelte Nachricht. Aber das macht nichts, denn Sie haben Ihre Nachrichten so gestaltet, dass sie idempotent sind.

Verwandte Themen