Azure服务总线主题架构

3
我一直在通过 Microsoft 提供的 eShopOnContainers 项目来提高自己的微服务技能。其中一个重要概念是引入事件总线。我选择使用 Azure Service Bus 尝试它,但我的平台经验有限。
我已经成功地运行了该项目,在手动创建主题、订阅等之后,但这引发了一些问题:
订阅应用程序不是应该在 Azure 中创建自己的订阅吗?例如,在启动时?
从概念上讲,主题代表不同的事件堆栈,对吗?例如,客户、订购等?还是它们旨在成为域事件边界?例如,在此应用程序中,“eShop”将是主题。
Azure 部署是另一个话题,但与服务总线配置相关的是,是否有任何推荐的技术来在源代码控制中管理它?
非常感谢您的任何见解。

我建议您查看Azure管理流畅API https://github.com/Azure/azure-libraries-for-net - Marcus Höglund
啊,一个可能的遗漏。我之前找不到这个的.NET Core版本。谢谢。 - Jeremy Smith
3个回答

3
“订阅应用程序在Azure中创建自己的订阅,这不是其责任吗?例如,在启动时?”
“没错。具体细节取决于您使用的基础消息服务。在Azure Service Bus的情况下,每个服务在启动时都会订阅其感兴趣的事件。例如,“订单”将在启动期间订阅它处理的事件。该项目有一个IEventBusSubscriptionsManager合同,需要为每个消息服务具体实现。对于Azure Service Bus实现,每个服务都有一个物理订阅,每个感兴趣的事件都由规则表示,通过Service Bus消息LabelLabel包含事件名称)过滤消息。”
“从概念上讲,主题代表不同的事件堆栈,对吗?例如,客户、订单等?还是它们旨在成为域事件边界?例如,在此应用程序中,“eShop”将是主题。”
“主题是消息扇出的点。您可以每个服务使用一个主题,但这意味着订阅者需要知道哪个服务发布了这些事件。或者,更好的选择是拥有一个主题,所有服务都知道,并发布事件到该主题。现在称之为“Events”。对各种事件感兴趣的每个服务都会创建一个订阅。订阅将能够获取发布到Events主题的任何消息(事件),但实际上只应“捕获”并传递其需要的事件(即已“订阅”的事件)。这就是过滤器的作用。通过创建过滤器(RuleDescription),每个服务的给定订阅在代理上声明它将接收哪些消息。”
“Azure部署是另一个话题,但与Service Bus配置相关的是,在源代码控制中管理它的推荐技术有哪些?”
“有几个选项。”
“1. 在运行时基于代码创建实体(主题、带规则的订阅、队列)。”
“2. 使用ARM模板捕获拓扑结构,并像版本控制系统中的代码一样进行版本控制。”
“3. 使用Azure CLI并将脚本版本化。”

@jeremy-smith,这个项目还有另一个变体,采用了NServiceBus和Particular Platform。使用该平台提供的可视化和消息调试工具,您可以查看消息流并轻松连接所选择的传输(消息服务)。您可以尝试使用该版本,看看是否会使事情变得更容易些。 - Sean Feldman
从我所了解的情况来看,Subscribe()此处)实现只是向现有的 Azure 订阅中添加了一个 RuleDescription...我错过了什么吗? - Jeremy Smith
我总是试图向人们解释一个主题就像一个Webhook:你可以订阅特定的事件/消息。EventGrid也是这样做的,但使用Http而不是总线消息。 - Thomas
@JeremySmith 正确,但 ASB 没有订阅管理器实现,这使得它变得奇怪(读作不完整?) - Sean Feldman

2

根据反馈,我能够基于eShop的事件总线快速地创建Azure订阅,并在启动时实现粗略的解决方案:

 public EventBusServiceBus(IServiceBusPersisterConnection serviceBusPersisterConnection,
        ILogger<EventBusServiceBus> logger, IEventBusSubscriptionsManager subsManager, string subscriptionClientName,
        ILifetimeScope autofac, AzureUserCredentials userCredentials, string subscriptionId, string resourceGroupName, string serviceBusName, string topicName)
    {
        _serviceBusPersisterConnection = serviceBusPersisterConnection;
        _logger = logger;
        _subsManager = subsManager ?? new InMemoryEventBusSubscriptionsManager();

        _subscriptionClient = new Microsoft.Azure.ServiceBus.SubscriptionClient(serviceBusPersisterConnection.ServiceBusConnectionStringBuilder,
            subscriptionClientName);
        _autofac = autofac;

        var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(
          userCredentials.ClientId, userCredentials.ClientSecret, userCredentials.TenantId, AzureEnvironment.FromName(userCredentials.EnvironmentName));

        var azure = Azure
                .Configure()
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                .Authenticate(credentials)
                .WithSubscription(subscriptionId);

        var nm = azure.ServiceBusNamespaces.GetByResourceGroup(resourceGroupName, serviceBusName);

        var topic = nm.Topics.GetByName(topicName);

        if (topic == null)
            throw new ArgumentException($"Topic {topic} does not exist.", nameof(topic));

        Microsoft.Azure.Management.ServiceBus.Fluent.ISubscription subscription = null;
        try
        { subscription = topic.Subscriptions.GetByName(subscriptionClientName); }
        catch { }

        if (subscription == null)
        {
            logger.LogInformation($"Creating Azure Subscription '{subscriptionClientName}'");
            topic.Subscriptions.Define(subscriptionClientName).WithDeleteOnIdleDurationInMinutes(5).Create();
        }
        else
        {
            logger.LogInformation($"Azure Subscription '{subscriptionClientName}' already exists. Reusing.");
        }

        RemoveDefaultRule();
        RegisterSubscriptionClientMessageHandler();
    }

0

正如 @Sean Feldman 所提到的,将一个单一的主题作为发布消息的中心渠道,如果您也关注于使用单一主题与多个主题的性能差异,请参考 Azure 文档提供的性能指南。我引用了其中最有趣的部分以帮助您。

从可扩展性的角度来看,实际上您不会注意到太大的区别,因为服务总线已经在内部跨多个日志分散了负载,所以如果使用六个队列或主题或两个队列或主题并不会产生实质性区别。

https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-performance-improvements?tabs=net-standard-sdk-2#multiple-queues-or-topics


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Nol4635

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接