【问题标题】:Azure Service Bus Topic ArchitectureAzure 服务总线主题架构
【发布时间】:2018-10-20 20:35:03
【问题描述】:

我一直在研究 Microsoft 提供的 eShopOnContainers 项目,总体上磨练了我的微服务技能。其中一个重要概念是引入事件总线。我选择使用 Azure 服务总线进行尝试,但我对该平台的经验有限。

在手动创建主题、订阅等之后,我已经设法让项目运行,但这引发了一些问题:

在 Azure 中创建自己的订阅不是订阅应用程序的责任吗?例如启动时?

从概念上讲,主题代表不同的事件堆栈,对吗?例如。客户、订单等?或者它们是否旨在成为领域事件边界?例如。在此应用程序中,“eShop”将是主题。

Azure 部署是一个完全不同的主题,但与服务总线配置相关,是否有任何推荐的技术可以在源代码控制中管理它?

非常感谢任何见解。

【问题讨论】:

标签: c# azure microservices azureservicebus azure-servicebus-topics


【解决方案1】:

在 Azure 中创建自己的订阅不是订阅应用程序的责任吗?例如启动时?

没错。详细信息取决于您使用的基础消息传递服务。对于 Azure 服务总线,每个服务在启动时都会订阅它感兴趣的事件。例如,Ordering 将订阅subscribe during startup to the events it handles。该项目有一个IEventBusSubscriptionsManager contract 专门为每个消息传递服务实现。对于Azure Service Bus implementation,每个服务都有一个物理订阅,它感兴趣的每个事件都由一个规则表示,通过服务总线消息Label 的值过滤消息(Label 包含事件名称)。

从概念上讲,主题代表不同的事件堆栈,对吗?例如。客户、订单等?或者它们是否旨在成为领域事件边界?例如。在此应用程序中,“eShop”将是主题

主题是散播消息的要点。您可以为每个服务使用一个主题,但这意味着订阅者需要知道哪些服务正在发布这些事件。或者,可能更好的选择是让您的所有服务都知道一个主题,并将事件发布到该主题。暂时称它为“Events”。每个对各种事件感兴趣的服务都会创建一个订阅。订阅将能够获取发布到Events 主题的任何 消息(事件),但实际上应该只“捕获”并传递它需要的事件(阅读“订阅”)。这就是过滤的用武之地。通过创建过滤器 (RuleDescriptions),每个服务的给定订阅在代理上声明它将接收哪些消息。

Azure 部署是一个完全不同的主题,但与服务总线配置相关,是否有任何推荐的技术可以在源代码控制中进行管理?

几个选项。

  1. 在运行时基于代码创建实体(主题、带有规则的订阅、队列)。
  2. 使用 ARM 模板和版本捕获拓扑,就像版本控制系统中的代码一样。
  3. 使用Azure CLI 并对您的脚本进行版本控制。

【讨论】:

  • @jeremy-smith 这个项目的another variant 正在使用 NServiceBus 和特定平台。借助提供可视化和消息传递调试工具的平台,您可以查看消息流并轻松连接您选择的传输(消息传递服务)。您可以尝试一下,看看它是否让事情变得更容易一些。
  • 据我所知,Subscribe() (here) 实现只是将RuleDescription 添加到现有 Azure 订阅...我错过了什么?
  • 我总是试图向人们解释一个主题就像一个 webhook:你可以订阅特定的事件/消息。 EventGrid 做同样的事情,但使用 Http 而不是总线消息传递
  • @JeremySmith 正确,但是没有 ASB 的订阅管理器实现,这很奇怪(读不完整?)
【解决方案2】:

根据反馈,我能够根据 eShop Event Bus 提出一个粗略的解决方案,以便在启动时创建 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();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2013-10-10
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多