Architecture Azure函数ServiceBustigger消息处理器设计

Architecture Azure函数ServiceBustigger消息处理器设计,architecture,azure-functions,azureservicebus,Architecture,Azure Functions,Azureservicebus,背景和当前设计 我有一些服务(ASP.Net Core)可以将消息发送到Azure服务总线队列。Azure函数使用以队列为目标的ServiceBustigger处理消息,即仅使用单个队列&ServiceBustigger。MessageUserProperties属性(IDictionary)由一个“类型”条目填充,该条目标识消息正文以及如何将其反序列化(转换为已知类型)并对其进行处理。目前的设计似乎有点粗糙。扩展它本质上意味着扩展case语句以包含新的消息类型和进程。或者添加更多队列,每个队列

背景和当前设计

我有一些服务(ASP.Net Core)可以将消息发送到Azure服务总线队列。Azure函数使用以队列为目标的ServiceBustigger处理消息,即仅使用单个队列&ServiceBustigger。MessageUserProperties属性(IDictionary)由一个“类型”条目填充,该条目标识消息正文以及如何将其反序列化(转换为已知类型)并对其进行处理。目前的设计似乎有点粗糙。扩展它本质上意味着扩展case语句以包含新的消息类型和进程。或者添加更多队列,每个队列专用于特定的消息类型,并且每个队列都有一个专用处理器。i、 e.单个Azure函数,具有多个针对每个队列\消息类型的ServiceBustigger


问题是:有没有更好的方法?以及成功使用了哪些其他设计\体系结构?

如果希望处理来自不同客户端(功能)的消息,可以使用服务总线主题订阅。建议多个订阅服务器使用主题


您可以为每个订阅创建规则,并根据用户属性和配置的规则,消息将自动归入相应的订阅,从中可以触发功能。有关主题订阅的更多详细信息,请查看此处。

我想用@arnumprabhu来扩展答案。如果您想使用不同的消息类型,那么您应该寻找主题订阅模型。通过这种方式,您可以在主题中发布消息,订阅该消息的服务可以获取消息。每个主题可以有许多订阅,并且每个订阅只能侦听特定类型的消息或所有消息。e、 你发布了3条消息。预订确认、付款处理、订单交付。您有3个订阅,可以收听上述任何消息或全部消息。假设您的订阅(假设订阅名称正在跟踪)决定收听两条消息BookingConfirmation,PaymentProcessed。当消息发布到主题时,您的订阅将获得这些消息的副本

Azure功能

您的azure功能可以订阅订阅(跟踪)并仅侦听此订阅上到达的消息。从很高的层次来看,它可能看起来像这样

[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}");
    }
公共类事件存储
{
公共异步任务更新数据(消息消息)
{        
尝试
{
如果(msg.Label==“BookingAdd”)
{
BookingAddIntegrationEventMsg=JsonConvert.DeserializeObject(Encoding.UTF8.GetString(msg.Body));
string messageType=“BookingCreated”;
BookingCreated BookingCreated=新建
BookingCreated(eventMsg.BookingId,string.Empty,eventMsg.Id
,messageType,eventMsg.CreationDate,eventMsg.Origin,eventMsg.Destination);
bookingId=eventMsg.bookingId;
跟踪.记账添加(记账已创建);
}
else if(msg.Label==“OrderPicked”)
{
OrderPickedIntegrationEventMsg=JsonConvert.DeserializeObject(Encoding.UTF8.GetString(msg.Body));
字符串messageType=“OrderPicked”;
OrderPicked OrderPicked=new
OrderPicked(eventMsg.BookingId、eventMsg.Description、eventMsg.Id
,messageType,eventMsg.CreationDate);
bookingId=eventMsg.bookingId;
跟踪.OrderPicked(OrderPicked);
}
}
捕获(例外情况除外)
{
掷骰子;
}
}
}

}

这个问题可能会得到一些主要基于观点的答案。请参阅。关于主题:根据设计,队列用于特定的消息类型。不同类型的处理意味着不同的过程。创建一个新的队列可以完全自动化。固执己见的回答(对我来说)是可以的。我知道他们被堆栈霸主气馁了。。。但我希望在不可避免的“标记为…”的问题出现之前能有一些想法。我已经阅读了,谢谢你的宝石。@Arunprabhu谢谢你的回答,Imrans的回答有更多的细节,所以我会将其标记为正确,但两者都有帮助。谢谢你们两位。主题\订阅似乎是一条必经之路,我不确定我怎么会错过它。
public class EventStore
{
    public async Task UpdateData(Message msg)
    {        

        try
        {
            if (msg.Label == "BookingAdd")
            {
                BookingAddIntegrationEvent eventMsg = JsonConvert.DeserializeObject<BookingAddIntegrationEvent>(Encoding.UTF8.GetString(msg.Body));

                string messageType = "BookingCreated";

                BookingCreated bookingCreated = new
                   BookingCreated(eventMsg.BookingId, string.Empty, eventMsg.Id
                   , messageType, eventMsg.CreationDate, eventMsg.Origin, eventMsg.Destination);

                bookingId = eventMsg.BookingId;
                tracking.BookingAdd(bookingCreated);

            }
            else if (msg.Label == "OrderPicked")
            {
                OrderPickedIntegrationEvent eventMsg = JsonConvert.DeserializeObject<OrderPickedIntegrationEvent>(Encoding.UTF8.GetString(msg.Body));

                string messageType = "OrderPicked";

                OrderPicked orderPicked = new
                    OrderPicked(eventMsg.BookingId, eventMsg.Description, eventMsg.Id
                    , messageType, eventMsg.CreationDate);

                bookingId = eventMsg.BookingId;
                tracking.OrderPicked(orderPicked);

            }


        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}