2016-05-11 4 views
0

Ich habe einen Webjob, die die Nachricht nur einmal verarbeiten, indem Sie die Bedingung (DevliverCount = 1). Weil ich nicht möchte, dass andere Instanz es verarbeitet, wenn die Sperrzeit vom ersten Webjob abgelaufen ist. Da andere Webjobs versuchen, die Nachricht nach Ablauf der Sperrzeit zu verarbeiten, wird die Bedingung (DevliverCount = 1) nicht erfüllt und kommt aus der Methode, die die Nachricht automatisch aus der Warteschlange löscht. Das Problem hier ist, wenn der Nachrichtenstatus ging zu nie fertig (anders als Erfolg) Ich habe keine Nachricht in der Warteschlange zu verarbeiten. Wie geht man mit dieser Situation um?Status wie nie von einem meiner Webjob während der Verarbeitung der Nachricht

Antwort

0

Ich denke, ein Teil des Problems ist, dass Sie die MaxDeliveryCount Eigenschaft zu verwenden sind versucht Verarbeitung gleichzeitige Nachricht zu verhindern:

MaxDeliveryCount

Die maximale Lieferzahleinstellung verwendet wird, nicht von der Verarbeitung mehrerer Verbraucher zu verhindern Gleichzeitig wird eine Nachricht verwendet, um "poison messages" zu verhindern, bei denen jeder Verbraucher versucht, eine Nachricht zu verarbeiten, deren Inhalt eine erfolgreiche Verarbeitung verhindert, und daher würde die Nachricht ansonsten für immer verarbeitet werden.

Ich empfehle Ihnen, genau zu bestimmen, was Sie versuchen, zu erreichen. Wenn Sie einen einfachen konkurrierenden Verbraucher Szenario möchten, wo mehrere webjobs Nachrichten aus einer einzigen Warteschlange verbrauchen, dann gibt es Standard-Möglichkeiten, um das zu erreichen:

good description of competing consumers

competing consumers with Service Bus queues

Sie MaxDeliveryCount in Verbindung mit konkurrierenden Kunden nutzen können, ... Wenn Sie keine giftigen Nachrichten senden möchten, können Sie MaxDeliveryCount auf einen Wert größer als 1 festlegen und anderen Benutzern die Möglichkeit geben, Nachrichten zu verarbeiten, deren Sperren ablaufen.

Der Azure Service Bus unterstützt das Dead-Lettering von Giftnachrichten, die die maximale Anzahl von Zustellungen überschreiten, sodass Sie solche Nachrichten offline untersuchen können ... sie werden nicht einfach für immer gelöscht.

Möglicherweise müssen Sie auch Code in Ihren Webjobs hinzufügen, um Sperren vor deren Ablauf zu erneuern ... andernfalls kann der Servicebus nicht zwischen "gültigen Nachrichten, die eine lange Verarbeitungszeit benötigen" und "giftigen Nachrichten, die nicht bearbeitet werden ". Ohne Sperrenverlängerung werden Ihre lang laufenden gültigen Nachrichten genauso wie giftige Nachrichten mit dem Tod versehen, was fast sicher nicht das ist, was Sie wollen.

Viel Glück!

+0

DeliveryCount ist eine BrokeredMessage-Objekteigenschaft, die bei der Verarbeitung durch mehrere Webjobs inkrementiert wird. –

+0

Ja, aber warum bestehen Sie auf einem DeliveryCount von nicht mehr als 1? Was ist Ihr Ziel bei der Festlegung dieses Limits? – JoshL

+0

Die Nachrichten, die im Webjob verarbeitet werden, können für jede Nachricht mehr als 10-15 Minuten dauern. Die maximale Sperrzeit für eine Nachricht beträgt nur 5 Minuten. Danach läuft es ab und andere Web-Job-Instanzen können die Nachricht lesen und versuchen, die Daten erneut zu verarbeiten, die ich nicht möchte. Ich beschränke mich also grundsätzlich darauf, dass die gleiche Nachricht nicht mehrfach von verschiedenen Instanzen des gleichen Webjobs bearbeitet wird. –