【问题标题】:Disconnect consumer while bus is connected连接总线时断开消费者
【发布时间】:2018-03-07 00:47:46
【问题描述】:

我们有以下用例:

我们有两条总线(内部和外部)。这个想法是我们自己的服务使用内部总线,而所有第三方服务都使用外部总线。我们创建了一个充当消息路由器的服务(恰当地命名为 MessageRouter)。

当消息在内部总线上发布时,MessageRouter 可以拾取该消息并将其放置在外部总线上,反之亦然。通过配置我们可以知道哪些消息被允许从内部传递到外部,或者从外部传递到内部。这本身就可以正常工作。

我们已经对消息进行了分组,我们有事件、命令和请求。每个服务都有三个 ReceiveEnpoints,每个消息类型一个。这意味着所有事件都在事件队列等中排队。服务“订阅”的每条消息都有自己的消费者。

var queues = new Dictionary<string, IEnumerable<Type>>
{
    // ReSharper disable once PossibleMultipleEnumeration
    { "Events", consumerTypes.Where(ct => ct.GetGenericArguments().Any(ga => typeof(IEvent).IsAssignableFrom(ga))) },
    // ReSharper disable once PossibleMultipleEnumeration
    { "Commands", consumerTypes.Where(ct => ct.GetGenericArguments().Any(ga => typeof(ICommand).IsAssignableFrom(ga))) },
    // ReSharper disable once PossibleMultipleEnumeration
    { "Queries", consumerTypes.Where(ct => ct.GetGenericArguments().Any(ga => typeof(IQuery).IsAssignableFrom(ga))) }
};

foreach (var queue in queues)
{
    config.ReceiveEndpoint(GetConsumerQueueName(queue.Key), cfg =>
    {
        foreach (var consumerType in queue.Value)
        {
            cfg.Consumer(consumerType, consumerContainer.Resolve);
        }
        configurator?.Invoke((T)cfg);
    });
}

其中configIBusFactoryConfigurator。该代码在服务启动时调用。

我们希望在 MessageRouter 中能够“动态”添加,更重要的是,从 ReceiveEndpoint 中删除消费者。

到目前为止,我们还没有运气。我们尝试通过在BusControl 实例上使用ConnectConsumer 方法来添加消费者。这给了我们一个ConnectHandle,它有一个Disconnect 方法。但是,当使用这种方法时,我们的消费者不会接收到消息。查看句柄告诉我们它是MultipleConnectHandle,但是,句柄没有“内部”句柄。

有没有什么方法可以使用Consumer方法注册不同的消费者并获取他们的ConnectHandles,这样我们可以在需要的时候Disconnect消费者?

如上所述,理想情况下,我们希望能够向 ReceiveEndpoint 动态添加和删除消费者。

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    总线启动时,您无法在接收端点上添加/删除消费者,这在任何方式、形状或形式上均不受支持。

    但是,您可以将不同队列上的新接收端点与一个或多个消费者连接起来。在上述情况下,您似乎没有在连接接收端点之前注册您的消费者,这就是您在句柄集合中看不到任何内容的原因。

    【讨论】:

    • 真可惜。如前所述,我们为每个服务创建三个端点。所有事件都放在同一个队列中。消费者是特定于事件消息类型的事物。能够在旅途中添加/删除消费者会很好。有什么不支持的理由吗?与消费者断开连接后交易所没有被“清理”有什么关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2019-09-19
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多