簡體   English   中英

使用 javascript 處理 azure function 中的服務總線錯誤消息

[英]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# 中的類型信息,應該是這樣發送的:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.brokeredmessage.deadleterasync?view=azure-dotnet

當我的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM