问题描述
我被要求在Django应用程序中使用Azure服务总线而不是芹菜。
阅读提供的文档,但没有清楚地了解使用服务总线而不是执行芹菜任务。提供的任何建议都会有很大帮助。
解决方法
在开始讨论之前,我想强调一下Azure Service Bus和Celery之间的区别。
Azure服务总线:
Microsoft Azure Service Bus是完全托管的企业集成消息代理。
您可以参考this来了解有关服务总线的更多信息
芹菜:
分布式任务队列。 Celery是基于分布式消息传递的异步任务队列/作业队列。
在您的情况下,我可能会想到两种可能性:
- 您想与芹菜一起使用Service Bus来代替其他 邮件经纪人。
- 用服务总线替换芹菜
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 - ########