首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多总线实例

多总线实例
EN

Stack Overflow用户
提问于 2015-07-30 11:16:38
回答 2查看 3.4K关注 0票数 3

根据MT文档,每个总线实例应该有不同的队列名。

我认为以下是正确的配置是正确的吗?

什么将WebApi和后端队列连接在一起?

考虑更高级的场景

当我设计我的后端管道来使用消息处理时,我以后可以分割它,让它很容易地在有线传输上使用。问题是,我能否以某种方式配置MT,以便Azure配置的总线将消息中继到配置了本地传输的总线上?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-30 15:13:27

我将在MassTransit v3的上下文中回答这个问题,它既支持Azure服务总线,也支持RabbitMQ。如果您要使用Azure,我强烈建议使用v3而不是v2的传输。

首先,关于请求。他们应该被发送,而不是出版。它们通常是天生的命令,而不是事件。我看到人们发布请求的唯一原因是他们没有服务的端点地址。因此,了解端点非常有帮助。

其次,在您的示例中,每个WebAPI实例都应该有自己的队列来接收响应,因为它们被发送回请求者。使用MT3,每个IBus实例都有一个唯一的自动删除队列,该队列就是为此目的而设置的,用于处理来自请求的响应。

在MassTransit存储库GitHub上有一个示例样例-RequestResponse,它展示了如何使用RabbitMQ进行设置。Azure服务巴士也是一样的。

将其整合在一起的"fabric“是虚拟主机(在RabbitMQ中)或名称空间(在ASB中)。主题和队列之间的连接决定了它们是如何一起工作以形成逻辑总线的。

票数 3
EN

Stack Overflow用户

发布于 2020-05-04 09:50:13

如果有人试图让我们注册.NET Core + DI来注册多个总线:

  • 不要在AddBus调用中使用构建
    • 无论你做什么,都不会注册超过一辆公共汽车。
    • 这是因为它在内部调用TryAddSingleton调用
    • 只有在还没有为接口注册实例的情况下,TryAddSingleton才向DI容器添加一个新实例。
    • 注:
      • 没有异常或错误引发

我们使用的解决方案

由于所需的各种接口不是通用的:

  • 在内置接口周围创建通用包装器
  • 创建唯一标识每个RegisteredBus的接口(使用泛型参数)
  • 创建新包装器实例时,我们将内置接口的实例传递给它的构造函数。
  • 然后包装器在公共属性Instance中保存内置内部接口的实例。
  • 而不是注射。IBus,我们现在注入IBus<MyRegisteredBus>
    • 然后,我们使用包装器的Instance属性来访问内置接口实例,并将其存储起来供以后使用(包装器在此之后不起任何作用)

我们希望不必使用带有奇怪的Instance属性的某种包装器,但是如果没有内置的接口变得通用,或者使用类似于DynamicProxies的东西,我们就无法想出一个更优雅的解决方案。

想法/反馈非常受欢迎。

代码

泛型AddBus调用(否则,100%的签名与内置的调用相同):

代码语言:javascript
复制
        public static void AddBus<TBusType>(this IServiceCollection services, Func<IServiceProvider, IBusControl> busFactory)
            where TBusType : class, IBusType
        {
            IBusControl<TBusType> BusFactory(IServiceProvider serviceProvider)
            {
                return new BusControl<TBusType>(busFactory(serviceProvider));
            }

            services.AddSingleton<IBusControl<TBusType>>(BusFactory);
            services.AddSingleton<IBus<TBusType>>(provider => new Bus<TBusType>(provider.GetRequiredService<IBusControl<TBusType>>().Instance));
        }

为了实现这一点,我们创建了各种接口/类:

代码语言:javascript
复制
    // the only purpose of the interfaces derived from `IBusType` is to uniquely idnetify a registered Bus
    public interface IBusType { }
    public interface IHosted : IBusType { }
    public interface ILocal : IBusType { }

    public interface IBusTypeWrapper<TBusType, TInterface>
        where TBusType : IBusType
    {
        public TInterface Instance { get; }
    }

    public class BusTypeWrapper<TBusType, TInterface> : IBusTypeWrapper<TBusType, TInterface>
        where TBusType : IBusType
    {
        public TInterface Instance { get; }

        public BusTypeWrapper(TInterface instance)
        {
            Instance = instance;
        }
    }

    public interface IBusControl<T> : IBusTypeWrapper<T, IBusControl> where T : IBusType { }
    public class BusControl<T> : BusTypeWrapper<T, IBusControl>, IBusControl<T> where T : IBusType
    {
        public BusControl(IBusControl instance) : base(instance) { }
    }

    public interface IBus<T> : IBusTypeWrapper<T, IBus> where T : IBusType { }
    public class Bus<T> : BusTypeWrapper<T, IBus>, IBus<T> where T : IBusType
    {
        public Bus(IBus instance) : base(instance) { }
    }

    public interface ISendEndpointProvider<T> : IBusTypeWrapper<T, ISendEndpointProvider> where T : IBusType { }
    public class SendEndpointProvider<T> : BusTypeWrapper<T, ISendEndpointProvider>, ISendEndpointProvider<T> where T : IBusType
    {
        public SendEndpointProvider(ISendEndpointProvider instance) : base(instance) { }
    }

如何注册通用ISendEndpointProvider

代码语言:javascript
复制
services.AddSingleton<ISendEndpointProvider<ILocal>>(provider => new SendEndpointProvider<ILocal>(provider.GetRequiredService<IBusControl<ILocal>>().Instance));

更新

为每个总线类型创建一个IHosted服务:-创建一个通用HostedService<BusType>服务-在构造函数中注入IBusControl<BusType> -并使用注入的实例启动特定的总线。

之后,为每种总线类型注册一个IHostedService

代码语言:javascript
复制
services.AddSingleton<IHostedService, HostedService<ILocal>>(); services.AddSingleton<IHostedService, HostedService<IHosted>>();`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31722301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档