如何基于Azure中的Service Bus队列自动缩放Python webjob?

时间:2019-06-13 12:30:25

标签: python azure azure-webjobs autoscaling azure-servicebus-queues

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

我有一个python webjob,它以服务总线队列为食。该队列每天的午夜填充,并且可以添加0至40万条消息。

当前处理的瓶颈是需要下载一些数据的地方,这意味着扩大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类似的事情。

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

1 个答案:

答案 0 :(得分:0)

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

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