如果发生异常,请向Azure函数死信队列添加其他信息

如果发生异常,请向Azure函数死信队列添加其他信息,azure,exception,azure-functions,servicebus,dead-letter,Azure,Exception,Azure Functions,Servicebus,Dead Letter,我正在编写一个带有服务总线触发器的Azure函数,同时我注意到,如果发生任何异常,在某些内置重试时间之后,它会将传入消息放入死信队列(或者称为毒药队列?但是,我无法从DLQ中获取或添加任何附加信息。例如,我试图转换1000条记录,但其中1条记录转换失败,原因是数据类型无效,然后异常抛出,我的函数结束工作,异常外观,why和它生成的时间,或者异常发生时我的数据是什么样子,都无法在DLQ消息中捕获 我试图自定义异常对象以添加更多信息,但似乎它不会影响消息发送到死信队列的方式。死信队列就是这样设计的,

我正在编写一个带有服务总线触发器的Azure函数,同时我注意到,如果发生任何异常,在某些内置重试时间之后,它会将传入消息放入死信队列(或者称为毒药队列?但是,我无法从DLQ中获取或添加任何附加信息。例如,我试图转换1000条记录,但其中1条记录转换失败,原因是数据类型无效,然后异常抛出,我的函数结束工作,异常外观,why和它生成的时间,或者异常发生时我的数据是什么样子,都无法在DLQ消息中捕获

我试图自定义异常对象以添加更多信息,但似乎它不会影响消息发送到死信队列的方式。死信队列就是这样设计的,它只会在发生异常时将消息从标准队列移动到DLQ?


我在azure函数中处理异常的最佳方法是什么?根据Microsoft的说法,我们建议您在函数代码中使用try-catch块来捕获任何错误。
,我是否应该将我的异常放入另一个队列,让另一个服务从另一方查看或处理?

我们遇到了这样的问题此问题也存在。我们通过将邮件放入包含出列计数和异常数组的信封中解决了此问题。当邮件出列时,我们会在Azure函数中增加出列计数。如果发生异常,我们会执行以下操作:

  • 在catch块中,我们增加出列计数,并将完整异常添加到异常数组中
  • 增加出列计数并将消息显式添加回队列
  • 这样,消息将携带出列计数和已发生的任何异常的历史记录

    当我们将一条消息出列时,我们会检查出列计数。如果它高于我们的阈值,我们会显式地死信消息


    这样,死信消息将包含完整的异常历史记录。您可以按照此模式将任何日志信息保存到消息中,以便在消息最终死信时可以看到所有信息。

    另一个选项是使用app insights将抛出的异常与中毒队列消息关联起来。可能需要您发出一些自定义指标或遥测数据可以提供帮助,但这样您就不必在队列消息本身中进行关联。@Rob Reagan,非常感谢您分享您的想法!我只是想了解更多详细信息,根据我的理解,最初您的输入消息将具有0的dequeueCount属性和一个空的异常列表,函数将有一个最大重试次数,如果在一个执行轮内发生任何异常,将增加出列次数并将当前异常添加到异常列表中,下一轮将使用最大重试次数检查当前出列次数,这就是它的工作方式吗?好奇的是,如果出现异常,您将如何显式显示死信消息d手动计算最大重试次数?@Rob Reagan,在这种情况下,只有出列次数超过最大重试次数的消息才会被视为死信消息,并将被插入DLQ,对吗?如果输入消息有一些异常,但在第三次自动重试时,它会通过函数,那么我们不必担心发生了什么或者之前第一次和第二次生成的异常,对吗?我们应该捕获什么样的异常信息并将其放入异常列表中?例如,如果我们放入stackTrace或其他内容,在某些重试次数后,消息是否会变得过大?正如我记得的,在服务总线fqueu中,每个消息大小有2 MB的限制e@KevDing您之前的两条评论都是正确的。至于要捕获哪些信息,我将从异常消息和堆栈跟踪开始。注意最大消息大小是正确的。但我确实相信最大消息大小至少是1 MB。如果您担心超过最大消息大小,您可以序列化e异常消息和堆栈跟踪到其他地方并存储查找信息。但我会检查服务总线消息大小的服务限制,看看这是否是一个问题,然后再求助于更耗时的选项。