.net core 如何在使用RabbitMQ发布/订阅微服务事件总线时消除重复事件

.net core 如何在使用RabbitMQ发布/订阅微服务事件总线时消除重复事件,.net-core,rabbitmq,microservices,integration,event-bus,.net Core,Rabbitmq,Microservices,Integration,Event Bus,我一直在阅读第58页,以了解如何在微服务之间进行异步事件集成 使用RabbitMQ和发布/订阅模式有助于将事件推送到订阅者。然而,考虑到微服务架构和docker的使用情况,我希望一个微服务“类型”的实例可以运行不止一次。据我所知,所有实例都将订阅该事件,因此都将收到该事件 这本书没有清楚地解释如何确保只有一个实例处理请求 我已经研究了复制部分,但它描述了一种模式,该模式解释了如何在服务实例中消除重复数据,但不一定针对它们 每个microservice实例将使用类似于以下内容的方式进行订阅: pu

我一直在阅读第58页,以了解如何在微服务之间进行异步事件集成

使用RabbitMQ和发布/订阅模式有助于将事件推送到订阅者。然而,考虑到微服务架构和docker的使用情况,我希望一个微服务“类型”的实例可以运行不止一次。据我所知,所有实例都将订阅该事件,因此都将收到该事件

这本书没有清楚地解释如何确保只有一个实例处理请求

我已经研究了复制部分,但它描述了一种模式,该模式解释了如何在服务实例中消除重复数据,但不一定针对它们

每个microservice实例将使用类似于以下内容的方式进行订阅:

public void Subscribe<T, TH>()
        where T : IntegrationEvent
        where TH : IIntegrationEventHandler<T>
    {
        var eventName = _subsManager.GetEventKey<T>();

        var containsKey = _subsManager.HasSubscriptionsForEvent(eventName);
        if (!containsKey)
        {
            if (!_persistentConnection.IsConnected)
            {
                _persistentConnection.TryConnect();
            }

            using (var channel = _persistentConnection.CreateModel())
            {
                channel.QueueBind(queue: _queueName,
                                    exchange: BROKER_NAME,
                                    routingKey: eventName);
            }
        }

        _subsManager.AddSubscription<T, TH>();
    }
public void Subscribe()
其中T:IntegrationEvent
在哪里:集成文坦德勒
{
var eventName=_subsManager.GetEventKey();
var containsKey=_submanager.HasSubscriptionsForEvent(eventName);
如果(!containsKey)
{
如果(!\u persistentConnection.IsConnected)
{
_persistentConnection.TryConnect();
}
使用(var channel=\u persistentConnection.CreateModel())
{
channel.QueueBind(队列:\u queueName,
交易所:经纪商名称,
routingKey:eventName);
}
}
_subsManager.AddSubscription();
}
我需要了解同一“类型”的微服务的多个微服务实例如何在处理过程中服务停止时消除重复数据而不丢失消息

据我所知,所有实例都将订阅该活动,并且 因此,所有人都会收到它

只有订阅服务器的一个实例将处理消息/事件。当一个服务的多个实例正在运行并订阅了同一订阅时,第一个选择消息的实例将从订阅中将消息设置为不可见(称为可见性超时)。如果服务实例能够在给定的时间内处理该消息,它将通知队列删除该消息;如果服务实例不能及时处理该消息,则该消息将重新出现在队列中,以便任何实例再次提取该消息

所有标准服务总线(rabbitMQ、SQS、Azure Serivce总线等)都提供了这一现成的功能

顺便说一句,我已经阅读了这本书,并使用了来自eShotContainers的上述代码,它按照我描述的方式工作

您还应该研究以下模式


希望有帮助

重复数据消除的具体含义是什么?您想解决什么问题?你是说同一事件由多个订阅者处理,还是一个订阅者多次处理同一事件?我是说同一事件由同一类型微服务的多个订阅者处理。例如,如果我有两个“order”微服务实例,那么如何确保order微服务在真正感兴趣的问题上处理事件。我马上想到的唯一解决方案是只配置服务的一个实例来订阅事件总线。如果这是可能的话…基于拉的队列可能是一个更好的选择。如果所有订阅者都来自同一队列,这将确保只有一个订阅者将获得队列中的每一项。@creativeBys我建议您将此问题张贴在上面,它可能会在那里获得更多的关注。谢谢,我认为这是最有意义的。我将继续研究代码,并理解在特定示例中如何设置QUE。当然。我喜欢这本书。如果有问题,请分享更多问题。