Azure功能ServiceBusTrigger消息处理器设计

时间:2019-05-13 06:54:21

标签: architecture azure-functions azureservicebus

背景和当前设计

我有一些将消息发送到Azure服务总线队列的服务(ASP.Net Core)。 Azure功能使用针对队列的ServiceBusTrigger(即仅单个队列和ServiceBusTrigger)处理消息。消息UserProperties属性(IDictionary)中填充了一个“类型”条目,该条目标识消息主体以及如何反序列化消息主体(使其成为已知类型)并进行处理。当前的设计似乎有点粗糙。扩展它实质上意味着扩展一个case语句以包括新的消息类型和过程。或添加更多队列,每个队列专用于一种特定的消息类型,并且每个队列都有一个专用处理器。即单个Azure函数具有针对每个队列\消息类型的多个ServiceBusTriggers。

问题:是否有更好的方法来做到这一点?还有哪些其他设计\体系结构已成功使用?

2 个答案:

答案 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}");
    }

}