2016-10-25 30 views
4

如果我丟失了序列號,是否有任何方法可以在Azure服務總線上恢復或刪除延期郵件?在沒有序列號的Azure服務總線上清除延期郵件

這種情況是:我想用BrokeredMessage.Defer()推遲一條消息。我打算記錄序列號,稍後再使用它來檢索消息。但是如果出現問題 - 假設部署了一些錯誤代碼 - 並且序列號沒有正確記錄,那麼消息就會以延遲狀態駐留在服務總線上,直到消息過期,這可能是永久的。

這主要是因爲該消息會佔用隊列或訂閱空間,而且我還沒有找到任何恢復該空間的方法,因爲沒有完全刪除隊列/訂閱。

是否有任何方式來接收或刪除「丟失」的延期消息?

回答

1

從隊列或訂閱窺視消息也會返回延期消息。 延期的消息將具有State =「Deferred」。

這樣你就可以得到推遲消息的序號,然後處理或刪除這些消息。

可以在資源管理器ServiceBus嘗試了這一點:

Deferred message in ServiceBus Explorer

+0

是的!實際上我在幾個月前就已經知道了。感謝您將此添加爲回覆。這正是我問這個問題時所尋找的。 這是一個特別有用的方法,因爲延遲不會改變隊列上消息的順序,所以延遲消息往往位於隊列的前端,這意味着它們通常是第一個返回的東西'.Peek()'或'.PeekBatch()'。 – dshpak

2

至於爲了防止由於丟失序列號而導致孤立的延期郵件,您應該在維護它們的存儲過程中構建恢復能力,可能需要使用另一個隊列。換句話說,當您推遲一條消息時,在另一個隊列或主題中創建一條消息來存儲延期序列號或整個消息(克隆)。

我通常將所有推遲的消息移動到我自己的「延遲主題」,並分別處理它們。換句話說,我自己的定製延期邏輯,完全避免了這個問題。如果自動超時邏輯在您的方案(BrokeredMessage.TimeToLive)中不起作用,這對您來說可能是更好的途徑。

本文執行的部分解釋你的情況下,使用Queue.Receive的特殊超負荷的工作:

http://markheath.net/post/defer-processing-azure-service-bus-message

既然你存儲的序列號(以彈性方式:-)) ,另一種選擇是存儲整個消息(JSON,物業包等),並且當你想再次處理它時(可能來自另一個隊列)重新提交它。

+0

感謝。我正在考慮的方法實際上是使用隊列來保存序列號,因此它應該是「安全的」。我正在考慮失敗場景,比如「我的代碼有bug」這樣的非常簡單的(而且不幸的)情況。我想知道是否有任何方法可以從推遲的500 MB郵件中恢復,並且序列號永遠丟失,而無需刪除生產代碼正在使用的隊列。 您的其他建議,重新提交整個消息,正是我正在考慮的另一種方法:-) – dshpak

+0

有趣的答案;-) – Thomas