0

在使用 azure sdk for python 从 azure 服务总线主题订阅接收消息后,我正在使用AutoLockRenew类注册方法。

即使您使用AutoLockRenew.register()python 中的方法自动为您更新锁 -renewable.renew_lock()如果消息锁过期引发异常,它会静默失败!

仍在执行业务逻辑的父线程继续执行(直到它message.complete()实际上知道这一点时调用),但同时,相同的消息出现在队列中,第二个实例占用它进行处理!这意味着同一条消息现在正在由 2 个不同的接收者同时处理!

解决此问题的推荐方法是什么?

代码如下所示 -

auto_renewer = AutoLockRenew()
with sub_client.get_receiver() as receiver:
    for message in receiver:
        auto_renewer.register(message)
        ....
4

1 回答 1

0

(对于介绍,我是 python ServiceBus SDK 的开发人员之一。本来会将此作为评论,但显然我在这里没有足够的声誉。)

一些想法:

  1. 在 0.50.2 及之前的版本中存在一个已知错误,如果消息处理时间超过 10 分钟,服务将终止关联的链接并且消息无法解决。(事实上​​,正如你所描述的那样,它会被另一个接收器接收。)只需更新到 0.50.3(本周早些时候发布)就可以解决这个问题,因为你似乎正确地使用了 autorenew,它已得到支持以保留相关链接活。
  2. autorenew 失败有点安静,因为它在一个单独的线程中执行它的工作,但它确实通过inner_exception属性报告了这一点,当你尝试complete(). 如果您想早点观察到这一点,可以检查auto_renew_error消息上的字段。如果您看到的内容是由于上面的第 1 点或其他原因,我很想知道这个值被设置为更好地进行三角测量。
  3. 如果以上内容没有帮助,那么在这种情况下,查看更深入的日志记录输出会非常有用。这可以通过首先为“azure”和“uamqp”名称设置记录器(以查看堆栈中两个 python 组件的日志)并debug=True在创建 ServiceBusClient 时设置(以查看来自底层 C 消息传递库的日志,假设您使用的是 0.50.3 或更早版本,该属性的名称已随版本 7.0.0b1 更改)。

关于未来的说明,如果您想与我们联系,请随时利用 github.com/Azure/azure-sdk-for-python 提出问题,因为这些问题对我们来说非常重要。

于 2020-05-22T16:43:16.977 回答