背景和当前设计
我有一些将消息发送到Azure服务总线队列的服务(ASP.Net Core)。 Azure功能使用针对队列的ServiceBusTrigger(即仅单个队列和ServiceBusTrigger)处理消息。消息UserProperties属性(IDictionary)中填充了一个“类型”条目,该条目标识消息主体以及如何反序列化消息主体(使其成为已知类型)并进行处理。当前的设计似乎有点粗糙。扩展它实质上意味着扩展一个case语句以包括新的消息类型和过程。或添加更多队列,每个队列专用于一种特定的消息类型,并且每个队列都有一个专用处理器。即单个Azure函数具有针对每个队列\消息类型的多个ServiceBusTriggers。
问题:是否有更好的方法来做到这一点?还有哪些其他设计\体系结构已成功使用?
答案 0 :(得分:1)
如果希望从不同的客户端(功能)处理消息,则可以使用“服务总线主题订阅”。建议为多个订户提供主题。
您可以为每个订阅创建规则,并根据配置的用户属性和规则,消息将自动落入各自的订阅中,可以从中触发功能。在此处查看有关Topic Subscriptions的更多详细信息。
答案 1 :(得分:1)
主题订阅
我想通过@arnumprabhu扩展答案。如果要使用其他消息类型,则应寻找主题-订阅模型。这样,您可以在主题中发布消息,并可以订阅该消息的服务。每个主题可以具有多个订阅,并且每个订阅只能收听特定类型的消息或所有消息。例如您发布了3条消息。预订确认,付款处理,订单已交付。您有3个订阅,可以收听上述任何消息或全部消息。说您的订阅(说订阅名称为Tracking)决定收听2条消息BookingConfirmed,PaymentProcessed。每当消息发布到topic时,您的订阅都会获得这些消息的副本
天蓝色功能
您的天蓝色功能可以订阅该订阅(跟踪),并且仅侦听此订阅上到达的消息。从高度上看,它可能看起来像这样。
from datetime import datetime
def time_diff (a, b):
return a - b
dict = {
"results": [
{
"vendor_id": 1,
"client_id": 10,
"datetime": "2017-01-01 13:30:00"
},
{
"vendor_id": 1,
"client_id": 40,
"datetime": "2017-01-01 14:30:00"
}
]
}
for r in dict['results']:
r['datetime'] = datetime.strptime(r['datetime'], '%Y-%m-%d %H:%M:%S')
print (int(time_diff(dict['results'][1]['datetime'], dict['results'][0]['datetime']).seconds/60))
[FunctionName("myfunction")]
public static async void Run([ServiceBusTrigger("topicName", "Subscriptionname", Connection = "ServiceBus")]Message serviceBusMessage, ILogger log)
{
EventStore eS = new EventStore();
await eS.UpdateData(serviceBusMessage);
// log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
}
}