如何基于 Azure 中的服务总线队列自动缩放 Python webjob?

Posted

技术标签:

【中文标题】如何基于 Azure 中的服务总线队列自动缩放 Python webjob?【英文标题】:How to autoscale Python webjob based on Service Bus Queues in Azure? 【发布时间】:2019-10-28 01:13:07 【问题描述】:

当服务总线队列包含任何消息时,我希望我的 python webjob 横向扩展,以便更快地处理消息。

我有一个从服务总线队列提供数据的 python webjob。该队列每天午夜填充,可以添加 0 到大约 400k 条消息。

当前处理的瓶颈在于需要下载一些数据,这意味着扩展 webjob 不会像并行化它那样有帮助。

我将它从 1 个实例扩展到 10 个实例,但这似乎不会影响从队列中消耗消息的速率,这表明这不是我预期的工作方式。当它在 1 个实例上时,它在一小时内处理了约 1.53k。自从扩展到 10 个实例后,它处理了大约 1.5k 条消息(所以基本上没有区别。)

我用来与队列交互的代码是这样的(如果在 Python 中有更好的方法,请告诉我!):

from azure.servicebus import ServiceBusService, Message, Queue

bus_service = ServiceBusService(
    service_namespace= <namespace>,
    shared_access_key_name='RootManageSharedAccessKey',
    shared_access_key_value=<key>)

while(1):

    msg = bus_service.receive_queue_message(<queue>, peek_lock=False, timeout=1)

    if msg.body is None:

        print("No messages in queue")
        time.sleep(5)
    else:

        number = int(msg.body.decode('utf-8'))
                print(number)

我知道在 C# 中有一个用于 webjobs 的 QueueTrigger 属性,但我不知道 Python 有什么类似的属性。

我希望应用服务中运行的实例越多,处理消息的速度就越快,那为什么不是我看到的那样?

【问题讨论】:

您没有展示对我们来说比较耗时的代码部分。 这是一个执行数据库调用和其他一些事情的函数。虽然这也可能是可优化的,但我不会想到 webjob 代码的实际内容会对应用服务的扩展产生影响? 我已经对数据库调用进行了一些优化/专业化,这加快了处理速度,但不确定这是否涉及多实例情况。将再次测试。 【参考方案1】:

程序的瓶颈是数据库,它是最大的。添加更多实例只会增加对数据库的调用次数,因此会减慢每个实例的速度。

扩展数据库并优化数据库调用提高了性能,现在还意味着可以启动多个实例以进一步提高吞吐量。

【讨论】:

以上是关于如何基于 Azure 中的服务总线队列自动缩放 Python webjob?的主要内容,如果未能解决你的问题,请参考以下文章

Windows Azure 服务总线队列重复检测如何工作?

如何查看 Azure 服务总线队列中的所有消息?

Windows Azure 自动缩放

Azure 服务总线中的死信队列中的消息是不是过期?

无法从 Azure 服务总线中的并发会话按顺序接收消息

逻辑应用中的 Azure 服务总线队列错误