根据MT文档,每个总线实例应该有不同的队列名。
我认为以下是正确的配置是正确的吗?

什么将WebApi和后端队列连接在一起?
考虑更高级的场景

当我设计我的后端管道来使用消息处理时,我以后可以分割它,让它很容易地在有线传输上使用。问题是,我能否以某种方式配置MT,以便Azure配置的总线将消息中继到配置了本地传输的总线上?
发布于 2015-07-30 15:13:27
我将在MassTransit v3的上下文中回答这个问题,它既支持Azure服务总线,也支持RabbitMQ。如果您要使用Azure,我强烈建议使用v3而不是v2的传输。
首先,关于请求。他们应该被发送,而不是出版。它们通常是天生的命令,而不是事件。我看到人们发布请求的唯一原因是他们没有服务的端点地址。因此,了解端点非常有帮助。
其次,在您的示例中,每个WebAPI实例都应该有自己的队列来接收响应,因为它们被发送回请求者。使用MT3,每个IBus实例都有一个唯一的自动删除队列,该队列就是为此目的而设置的,用于处理来自请求的响应。
在MassTransit存储库GitHub上有一个示例样例-RequestResponse,它展示了如何使用RabbitMQ进行设置。Azure服务巴士也是一样的。
将其整合在一起的"fabric“是虚拟主机(在RabbitMQ中)或名称空间(在ASB中)。主题和队列之间的连接决定了它们是如何一起工作以形成逻辑总线的。
发布于 2020-05-04 09:50:13
如果有人试图让我们注册.NET Core + DI来注册多个总线:
AddBus调用中使用构建TryAddSingleton调用TryAddSingleton才向DI容器添加一个新实例。
我们使用的解决方案
由于所需的各种接口不是通用的:
Instance中保存内置内部接口的实例。IBus,我们现在注入IBus<MyRegisteredBus> Instance属性来访问内置接口实例,并将其存储起来供以后使用(包装器在此之后不起任何作用)
我们希望不必使用带有奇怪的Instance属性的某种包装器,但是如果没有内置的接口变得通用,或者使用类似于DynamicProxies的东西,我们就无法想出一个更优雅的解决方案。
想法/反馈非常受欢迎。
代码
泛型AddBus调用(否则,100%的签名与内置的调用相同):
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));
}为了实现这一点,我们创建了各种接口/类:
// 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
services.AddSingleton<ISendEndpointProvider<ILocal>>(provider => new SendEndpointProvider<ILocal>(provider.GetRequiredService<IBusControl<ILocal>>().Instance));更新
为每个总线类型创建一个IHosted服务:-创建一个通用HostedService<BusType>服务-在构造函数中注入IBusControl<BusType> -并使用注入的实例启动特定的总线。
之后,为每种总线类型注册一个IHostedService。
services.AddSingleton<IHostedService, HostedService<ILocal>>(); services.AddSingleton<IHostedService, HostedService<IHosted>>();`https://stackoverflow.com/questions/31722301
复制相似问题