Azure Service Bus – Bestimmte Nachricht löschenC#

Ein Treffpunkt für C#-Programmierer
Guest
 Azure Service Bus – Bestimmte Nachricht löschen

Post by Guest »

Ich entwickle ein System, das viele Datensynchronisationen umfasst, die in kleine Aufgaben unterteilt sind. Ich füge jede kleine Aufgabe als Job/Nachricht zur Azure Service Bus-Warteschlange hinzu.

Ich habe X Worker-Rollen, überprüfe dann die Warteschlangen und verarbeite die Daten.< /p>

Ich erwarte nicht, dass sich viele Nachrichten in der Warteschlange befinden, da das Ziel darin besteht, eine Nachricht zu verarbeiten, sie zu vervollständigen und dann dieselbe Nachricht erneut hinzuzufügen, aber geplant für X Minuten Zeit. Dies gibt mir eine Schleife, um diese Aufgaben weiter zu verarbeiten.

Das Tolle an der Azure-Funktionalität ist, dass sie alle serverseitigen Aufgaben für Sie erledigen, aber die Der Nachteil ist, dass es manchmal schwierig sein kann, die Daten zu debuggen oder zu manipulieren.

Ich möchte in der Lage sein, eine Liste der Nachrichten in der Warteschlange anzuzeigen (was ich habe es mit PeekBatch gemacht) in einer Weboberfläche. Ich möchte dann in der Lage sein, einige/alle Nachrichten auszuwählen und zu löschen.

Ich möchte dies möglicherweise tun, wenn es einen Fehler im Code gibt und ich möchte um Nachrichten eines bestimmten Typs zu stoppen.

Danach werde ich auch die Möglichkeit haben, Nachrichten von der Webseite erneut hinzuzufügen. Vielleicht möchte ich meine Arbeitsrollen und Nachrichten erweitern, um eine Aufgabe schneller auszuführen (oder sie zu verlangsamen), oder gelöschte Nachrichten erneut hinzufügen.

Die Frage ist also: Wie kann ich eigentlich eine bestimmte Nachricht aus der Warteschlange auswählen und sie dann löschen? Soweit ich weiß, gibt es keine offensichtliche Möglichkeit, dies zu tun, und wenn es möglich ist, ist eine Problemumgehung erforderlich. Das klingt für mich etwas bizarr.

Bearbeiten:

Ich habe etwas, das funktioniert, aber es Scheint wirklich keine gute Lösung zu sein:

Code: Select all

    public void DeleteMessages(List messageIds)
{
foreach (var msg in Client.ReceiveBatch(100))
{
if (messageIds.Contains(msg.SequenceNumber))
msg.Complete(); // Deletes the message
else
msg.Abandon(); // Puts it back in the queue
}
}
Dies wird immer weniger effizient, je größer die Warteschlange ist, aber es stoppt zumindest alle Aktivitäten, während der Löschaufruf läuft, und löscht die angegebenen Nachrichten.

Außerdem werden nur Nachrichten gelöscht, die zur Verarbeitung bereit sind. Zukünftige Nachrichten werden ignoriert, daher habe ich derzeit die Möglichkeit hinzugefügt, „Ruhezustands“-Nachrichten hinzuzufügen, um die Verarbeitung der Warteschlange anzuhalten, bis meine Nachrichten „bereit“ sind und ich sie löschen kann.

Ich wurde von Microsoft darüber informiert, dass sie derzeit an der API arbeiten, um bestimmte Nachrichten zu löschen, die in einigen Monaten verfügbar sein sollten. Bis dahin dreht sich alles um Problemumgehungen.

Juni-Update:

Immer noch kein Update von Microsoft zu diesem Problem und die oben beschriebene Methode war nicht ideal. Ich habe jetzt meinen Code so geändert, dass:

Das Objekt, das ich in die Nachricht eingefügt habe, eine neue Eigenschaft hat:

Code: Select all

Guid? MessageId { get; set; }
Beachten Sie, dass Guid NULL-Werte zulässt, nur um abwärtskompatibel zu sein

Wenn ich Wenn ich eine Nachricht löschen möchte, füge ich meine MessageId in eine Datenbanktabelle „DeletedMessage“ ein.

Wenn es um die Verarbeitung einer Nachricht geht, suche ich in der Tabelle „DeletedMessage“ nach einer Übereinstimmung Guid und wenn es eine findet, vervollständige() ich einfach die Nachricht, ohne das Normale zu tun Verarbeitung.

Das funktioniert gut, verursacht aber einen leichten Mehraufwand. Wenn Sie nicht mit einer großen Anzahl von Nachrichten zu tun haben, ist das kein großes Problem.

Beachten Sie auch, dass ich dies ursprünglich mit der SequenceNumber gemacht habe, aber (bizarrerweise) ändert sich die SequenceNumber zwischen Spähen und Abrufen der Nachricht! Dies verhindert, dass die Idee funktioniert, es sei denn, Sie verwenden wie oben Ihre eigene ID.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post