首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RabbitMQ发布/订阅微服务事件总线时如何去重复事件

使用RabbitMQ发布/订阅微服务事件总线时如何去重复事件
EN

Stack Overflow用户
提问于 2019-08-14 15:18:12
回答 1查看 463关注 0票数 3

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

使用RabbitMQ和发布/订阅模式有助于将事件推送给订阅者。但是,考虑到微服务体系结构和停靠器的使用,我希望一个微服务“类型”运行的实例不止一次。据我所知,所有实例都会订阅该事件,因此都会收到它。

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

我研究了复制部分,但是描述了一种模式,该模式解释了如何在服务实例中去重复,但不一定针对它们.

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

代码语言:javascript
复制
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>();
    }

我需要理解一个相同类型的微服务的多个微服务实例是如何在处理过程中不丢失消息的情况下去复制的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-14 21:51:11

据我所知,所有实例都会订阅该事件,因此都会收到它。

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

所有标准的服务总线(rabbitMQ、SQS、Azure Serivce总线等)都提供了开箱即用的功能。

顺便说一下,我读过这本书,并使用了来自eShotContainers的上述代码,它的工作方式与我所描述的一样。

您还应该查看以下模式( 竞争消费者模式 )

希望这能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57497607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档