Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 添加耗电元件时,将MassTransit置于发动机罩下_.net_Rabbitmq_Masstransit - Fatal编程技术网

.net 添加耗电元件时,将MassTransit置于发动机罩下

.net 添加耗电元件时,将MassTransit置于发动机罩下,.net,rabbitmq,masstransit,.net,Rabbitmq,Masstransit,我试图理解使用MassTransit时会发生什么,不是完全依赖于这个抽象层库,而是真正了解和理解引擎盖下正在创建的内容及其背后的原因 在我的应用程序中,我以以下方式注册消费者: container.AddMassTransit(x => { x.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg => { var host = cfg.Host(configurationProvider.R

我试图理解使用MassTransit时会发生什么,不是完全依赖于这个抽象层库,而是真正了解和理解引擎盖下正在创建的内容及其背后的原因

在我的应用程序中,我以以下方式注册消费者:

container.AddMassTransit(x =>
{
    x.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(configurationProvider.RabbitHostName);

        x.AddConsumer<FactAddedHandler>();
        x.AddConsumer<FactAddedOrderHandler>();
        x.AddConsumer<FactCategoryHandler>();

        cfg.ConfigureEndpoints(container);
    }));

});
这让我相信每个特定的消费者都有一个队列。 所以我们有这样一个场景:

让我们看看这些处理程序是如何定义的:

internal class FactAddedHandler : IConsumer<FactAddedIntegrationEvent>
{
    //
}


internal class FactAddedOrderHandler : IConsumer<FactAddedIntegrationEvent>
{
    //
}


internal class FactCategoryHandler : IConsumer<FactCategoryIntegrationEvent>
{
    //
}
所以。。我所期望的是,IntegrationEvents:FactAddedIntegrationEvent是广播FactAddedIntegrationEvent的扇出交换

我还认为,masstransit默认创建其他exchangeIntegrationEvents:FactCategoryIntegrationEvent,这样就很容易将其他消费者添加到同一事件中,即使在我的案例中只有一个消费者

因此,我们最终会出现这种情况,这种情况仍然有意义:


我不理解并希望得到解释的是创建其余3家交易所的原因。他们的角色是什么?他们为什么在那里?提前谢谢

对于接收端点,MassTransit将创建一个队列和一个同名的匹配交换。队列已绑定到匹配的exchange

接收端点上的使用者使用的消息类型用于声明交换(如上所示),并且匹配的交换绑定到这些消息类型交换。所有这些交换都是扇出交换

生成的拓扑通过匹配的交换路由所有消息类型,然后交换路由到队列

本文将通过中的一个示例对此进行说明

为什么要进行匹配交换?两个答案

首先,简单的回答是,它允许使用路由密钥将消息发送到exchange。使用RabbitMQ发送到队列需要一个以队列名称作为路由密钥的空交换


其次,它允许将其他队列绑定到匹配的exchange以进行故障排除。这包括设置窃听以保留发送到端点的所有消息的副本(直接或通过已发布的消息类型交换)。

对于接收端点,MassTransit将创建具有相同名称的队列和匹配交换。队列已绑定到匹配的exchange

接收端点上的使用者使用的消息类型用于声明交换(如上所示),并且匹配的交换绑定到这些消息类型交换。所有这些交换都是扇出交换

生成的拓扑通过匹配的交换路由所有消息类型,然后交换路由到队列

本文将通过中的一个示例对此进行说明

为什么要进行匹配交换?两个答案

首先,简单的回答是,它允许使用路由密钥将消息发送到exchange。使用RabbitMQ发送到队列需要一个以队列名称作为路由密钥的空交换


其次,它允许将其他队列绑定到匹配的exchange以进行故障排除。这包括设置一个窃听,以保留发送到端点的所有消息的副本(直接或通过已发布的消息类型交换)。

一如既往!非常感谢您的解释!一如既往的好!非常感谢您的解释!
internal class FactAddedHandler : IConsumer<FactAddedIntegrationEvent>
{
    //
}


internal class FactAddedOrderHandler : IConsumer<FactAddedIntegrationEvent>
{
    //
}


internal class FactCategoryHandler : IConsumer<FactCategoryIntegrationEvent>
{
    //
}
FactCategoryHandler     fanout
FactAddedOrderHandler      fanout
FactAddedHandler   fanout

IntegrationEvents:FactAddedIntegrationEvent  fanout
IntegrationEvents:FactCategoryIntegrationEvent    fanout