为了账号安全,请及时绑定邮箱和手机立即绑定

Azure函数-写入表输出绑定时处理错误

Azure函数-写入表输出绑定时处理错误

胡说叔叔 2021-04-06 13:19:56
我有一个Azure功能设置。其触发器设置为服务总线队列消息。触发功能后,将以某种方式处理消息。如果在处理过程中遇到任何异常,我将处理该错误,并将消息保存在Azure表存储集中作为输出绑定,以进行记录。我想处理在向输出绑定中写入内容时引发的所有错误。我将如何去做?错误详情我在写入输出绑定(表存储)期间遇到的错误之一是某些键的值无法保存。例如,消息中的键之一是numbertime类型的值。在写入此数据时,我得到了一个例外,即键的值不能容纳Int32数字。我认为表存储尝试将数字转换为Int32默认值,但失败了。要解决此问题,我将所有键都转换为具有字符串值。现在我可以保存。但是我仍然想在写入表存储输出绑定时处理任何不可预见的错误。在这种情况下,处理错误很重要,因为如果未正确使用服务总线消息,则不会在服务总线队列中删除该消息,并且在完成Azure函数执行后,该消息再次触发函数,并且函数进入不确定循环。以下是Azure函数的示例module.exports = async function (context, mySbMsg) {    try{        // process service bus message        await processMsg(mySbMsg);    } catch(e) {        // if processing fails, save the message in Azure table        try{            // my own try to handle errors, but was unsuccessful            await new Promise(function (resolve, reject) {                context.bindings.tableBinding = [];                context.bindings.tableBinding.push({                    PartitionKey: mySbMsg.id|| "unknown",                    RowKey: time + "",                    errorMessage: e.message || "",                    ...mySbMsg                })                resolve();            });        } catch (e) {            // do something HERE;            // exception on output binding didn't brought me here        }    }    context.done();}
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

输入和输出绑定在函数范围之外执行,这就是为什么您不能在函数内输入catch块的原因。如果要捕获错误,则可以自己处理写入存储的操作,而不必使用输出绑定。

但是,如果您无法写入存储,则服务总线队列将不会在无限循环中触发该功能。服务总线限制了重试次数,一旦达到该限制,邮件就会移到单独的死信队列中,以避免无限循环。那里的消息不会过期-它们将一直坐在那里,直到您准备好处理或删除它们为止。

//img1.sycdn.imooc.com//6080df0000018eed06020446.jpg

默认的最大传递计数是10,您可以在队列的属性刀片上对其进行配置。

至于处理死信队列中的消息,我发现Service Bus Explorer非常有用。它使查看DLQ中的消息变得相当简单,然后将它们推回到主队列中或将其删除。

您还可以通过编程方式访问DLQ并构建自动系统来处理这些消息。但是,由于消息无处可去,因此如果您的DLQ处理程序无法解析消息,您可能会陷入循环。


查看完整回答
反对 回复 2021-04-22
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信