使用RabbitMQ发布/订阅微服务事件总线时如何对事件进行重复数据删除

创新深渊

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

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

本书没有明确说明如何确保只有一个实例可以处理请求。

我已经研究了复制部分,但是它描述了一种模式,该模式说明了如何在服务实例中进行重复数据删除,但不一定要针对它们进行重复...

每个微服务实例将使用类似于以下内容的订阅:

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>();
    }

我需要了解如果服务在处理过程中发生故障,相同“类型”的微服务的多个微服务实例如何进行重复数据删除而不会丢失消息。

伊姆兰·阿尔沙德(Imran Arshad)

据我了解,所有实例都将订阅该事件,因此都将收到该事件。

只有一个订户实例将处理消息/事件。当您有多个服务实例正在运行并且已订阅同一预订时,第一个选择该消息的实例将使该消息在预订中不可见(称为可见性超时)。如果服务实例能够在给定的时间内处理该消息,它将告诉队列删除该消息,如果它不能及时处理该消息,则该消息将重新出现在队列中,以便任何实例可以再次接收它。

所有标准服务总线(rabbitMQ,SQS,Azure Serivce总线等)均立即提供此功能。

顺便说一下,我已经阅读了本书,并使用了eShotContainers中的上述代码,并且按我描述的方式工作。

您还应该研究以下模式以及“竞争消费者”模式

希望有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章