[英]Handling service bus error messages in azure function using javascript
我有一個 azure function 使用服務總線主題觸發器,我想優雅地處理錯誤消息,我希望能夠放棄該消息並將異常傳遞給它,這樣當我讀取死者時我可以在屬性中看到它信件隊列。
這是我的代碼:
const serviceBusTopicTrigger: AzureFunction = async function(context: Context, mySbMsg: any): Promise<void> {
// do something messy that may fail.
};
當我的 function 因異常而失敗時,消息按預期發送到 DLQ,但問題是,它沒有保存拋出的異常,它只告訴您它嘗試執行該方法 10 次,但它不能。
我希望它能夠捕獲異常並將其添加到消息屬性中,因此,當我處理 DLQ 隊列時,我將能夠知道錯誤的原因。 更重要的是,由於代碼因異常而失敗,我希望它從第一次運行消息時就放棄,因此不必重試 10 次。
我在想這樣的事情:
const serviceBusTopicTrigger: AzureFunction = async function(context: Context, mySbMsg: any): Promise<void> {
try{
// do something messy and that may fail
}
catch(error){
context.bindingData.userProperties['DeadLetterReason'] = 'Internal server error';
context.bindingData.userProperties['DeadLetterErrorDescription'] = JSON.stringify(error);
context.bindingData.abandonMsg();
}
};
我還沒有找到任何關於這樣的文件,所以有可能嗎? 或者我可以將消息強制發送到 DLQ? 像這樣:
const serviceBusTopicTrigger: AzureFunction = async function(context: Context, mySbMsg: any): Promise<void> {
try{
// do something messy and that may fail
}
catch(error){
context.bindings.deadLetterQueue.userProperties['DeadLetterReason'] = 'Internal server error';
context.bindings.deadLetterQueue.userProperties['DeadLetterErrorDescription'] = JSON.stringify(error);
context.bindings.deadLetterQueue = mySbMsg;
}
};
或者最后,可悲的是,我是否必須直接從該方法管理我的錯誤,並可能直接從那里將其發送到 azure 存儲表或隊列以通知錯誤?死信隊列,以及來自我在不同地方的功能。 這是唯一的方法嗎?
還有什么想法嗎?
謝謝。
首先,我認為nodejs不能做到這一點。 nodejs 丟失了 C# 中的類型信息,應該是這樣發送的:
當我的 function 因異常而失敗時,消息按預期發送到 DLQ,但問題是,它沒有保存拋出的異常,它只告訴您它嘗試執行該方法 10 次,但它不能。
創建服務總線主題訂閱時,Max Delivery Count 默認設置為 10。 默認值為 10,最小值可設置為 1。
開啟服務總線信息自動補全后,如下圖:
host.json
{
"version": "2.0",
"extensions": {
"serviceBus": {
"messageHandlerOptions": {
"autoComplete": true
}
}
},
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 3.1.0)"
}
}
當時出現錯誤,function運行失敗,調用放棄方法,Delivery Count +1,同時發回消息。
那么一旦你使用了try-catch,你根本不會重試10次。 function視為運行成功,function運行成功,消息消失,不回傳。(即try-catch執行一次)
我還沒有找到任何關於這樣的文件,所以有可能嗎? 或者我可以將消息強制發送到 DLQ?
不,這做不到。 相關類型缺失,無法通過 JavaScript 手動發送到死信。
或者最后,可悲的是,我是否必須直接從該方法管理我的錯誤,並可能直接從那里將其發送到 azure 存儲表或隊列以通知錯誤?死信隊列,以及來自我在不同地方的功能。 這是唯一的方法嗎?
為什么說死信里還出現錯誤呢? 使用 try-catch 在自動完成的情況下不應該發送死信。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.