如何在Django应用程序中用Azure Service Bus替换celery任务?

问题描述

我被要求在Django应用程序中使用Azure服务总线而不是芹菜。

阅读提供的文档,但没有清楚地了解使用服务总线而不是执行芹菜任务。提供的任何建议都会有很大帮助。

解决方法

在开始讨论之前,我想强调一下Azure Service Bus和Celery之间的区别。

Azure服务总线:

Microsoft Azure Service Bus是完全托管的企业集成消息代理。

您可以参考this来了解有关服务总线的更多信息

芹菜:

分布式任务队列。 Celery是基于分布式消息传递的异步任务队列/作业队列。

在您的情况下,我可能会想到两种可能性:

  1. 您想与芹菜一起使用Service Bus来代替其他 邮件经纪人。
  2. 用服务总线替换芹菜

1:您希望将Service Bus与Celery一起使用,以代替其他消息代理。

您可以将其称为understand why celery needs a message broker。 我不确定您当前正在使用哪个消息传递代理,但是可以使用Kombu library来满足您的要求。

Azure服务总线参考: https://docs.celeryproject.org/projects/kombu/en/stable/reference/kombu.transport.azureservicebus.html

对他人的引用: https://docs.celeryproject.org/projects/kombu/en/stable/reference/index.html

2:用服务总线完全代替芹菜 满足您的要求:

考虑

  • 消息发件人是生产者
  • 消息接收者是消费者

这是您必须处理的两个不同的应用程序。

您可以参考以下内容以获取更多示例代码。

https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/servicebus/azure-servicebus/samples

说明:

  • 每次您要执行操作时,都可以发送 生产者客户端发送到主题的邮件。
  • 消费者客户端-正在监听的应用程序将接收到消息并对其进行处理。您可以在其上附加自定义流程-这样,只要在客户客户端收到消息,您的自定义流程就会执行。

以下是接收客户端的示例:

from azure.servicebus.aio import SubscriptionClient
import asyncio
import nest_asyncio
nest_asyncio.apply()

        
Receiving = True

#Topic 1 receiver : 
conn_str= "<>"
name="Allmessages1"
SubsClient = SubscriptionClient.from_connection_string(conn_str,name)
receiver =  SubsClient.get_receiver()

async def receive_message_from1():
    await receiver.open()
    print("Opening the Receiver for Topic1")
    async with receiver:
      while(Receiving):
        msgs =  await receiver.fetch_next()
        for m in msgs:
            print("Received the message from topic 1.....")
            ##### - Your code to execute when a message is received - ########
            print(str(m))
            ##### - Your code to execute when a message is received - ########
            await m.complete()
            
            
loop = asyncio.get_event_loop()
topic1receiver = loop.create_task(receive_message_from1())

下一行之间的部分是每次收到消息时都会执行的指令。

##### - Your code to execute when a message is received - ########

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...