Also das Szenario ist, dass ich eine SB-Warteschlange verwenden, um ausgehende Rückrufe zu anderen Diensten zu drosseln. Eines der Standardprobleme beim Zurückrufen zu anderen Diensten besteht darin, dass sie für unkontrollierbare Zeitspannen heruntergefahren sein können. Wenn ich feststelle, dass das Ziel nicht erreichbar ist/antwortet, welches ist das beste Muster, um diese Nachricht aufzugeben, so dass sie nicht sofort wieder in der Warteschlange erscheint?Was ist der richtige Weg, um eine Azure SB-Nachricht aufzugeben, damit sie in Zukunft auf eine Weise sichtbar wird, die ich kontrollieren kann?
sind hier einige Ansätze, die ich bin entweder bewusst, versucht haben, oder bin am überlegen:
Natürlich, wenn ich
BrokeredMessage::Abandon()
nur die Meldung freigeschaltet werden und in die Warteschlange stellen. Dies ist offensichtlich unerwünscht für dieses Szenario und was ich versuche zu vermeiden.Wenn ich einfach die Tatsache ignoriere, dass ich in einen Fehler geriet und Abandon nie anrufe, wird es davon abhalten, sofort zu erscheinen, aber ich habe wirklich keine feinkörnige Kontrolle darüber, wie lange es wieder auftaucht und ich möchte eine verfallende Wiederholungsstrategie implementieren.
Ich dachte, vielleicht ich
BrokeredMessage::Abandon(IDictionary<string, object>)
nennen könnte und irgendwie dieScheduledEnqueueTimeUTC
Eigenschaft aktualisieren, aber ich habe schon versucht, diese und es scheint nicht ein Weg, um diese Eigenschaft über die anfängliche Senden der Nachricht zu beeinflussen. Macht Sinn, ist aber einen Versuch wert.habe ich als nur
BrokeredMessage::Complete()
in dieser Situation mit und eigentlich nur eine neue Kopie der Nachricht mit demScheduledEqueueTimeUTC
Eigenschaftssatz Einreihen.
Die letzte Kugel scheint fast zu plump, aber ich komme zu dem Schluss, es ist wahrscheinlich die richtige Antwort der inhärente Natur von Warteschlangen gegeben. Ich habe mir gedacht, dass es eine schönere Möglichkeit gibt, dies in Azure SB-Warteschlangen zu tun, die ich vermisse.
Ok, also, sagen Sie mir, ob das richtig klingt: Wir können die ursprüngliche Nachricht in der primären Warteschlange verzögern und eine "Wiederholungs" -Nachricht in die sekundäre Warteschlange stellen (wahrscheinlich mit ScheduledEnqueueTimeUTC), die dann die Sequenznummer der ursprünglichen Nachricht hat Den kann ich dann zurückgehen und über die spezielle Receive() Überladung greifen. –
Sie können das tun. –
Ich bin verwirrt, was die sekundäre Warteschlange fügt, die nicht durch Ihre "schwere Hand" -Lösung des Kopierens der Nachricht mit einer geplanten Lieferzeit erreicht wird. Das einzige Problem, das ich bei der Implementierung gesehen habe, ist, dass die Lieferzählung immer auf 1 zurückgesetzt wird, so dass es keine gute Quelle ist, um die Eingabe für die exponentielle Backoff-Berechnung zu bestimmen. –