【问题标题】:How to deduplicate events when using RabbitMQ Publish/Subscribe Microservice Event Bus使用 RabbitMQ 发布/订阅微服务事件总线时如何去重事件
【发布时间】:2019-12-21 04:23:24
【问题描述】:

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

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

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

【问题讨论】:

  • 重复数据删除具体是什么意思,你想解决什么问题?您是指同一事件由多个订阅者处理,还是一个订阅者多次处理同一事件?
  • 我的意思是同一事件由同一类型微服务的多个订阅者处理。例如,如果我有两个“订单”微服务实例,如何确保订单微服务处理一次事件
  • 确实很有趣。我马上想到的唯一解决方案是只配置一个服务实例来订阅事件总线。如果有可能的话……
  • 基于拉取的队列在这里可能是更好的选择。如果所有订阅者都从同一个队列中拉取,这将确保只有 1 个订阅者将获取队列中的每个项目。
  • @CreativeAbyss 我建议您在softwareengineering.stackexchange.com 上发布这个问题,它可能会在那里获得更多关注。

标签: .net-core rabbitmq microservices integration event-bus


【解决方案1】:

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

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

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

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

您还应该研究以下模式 Competing Consumers pattern

希望有帮助!

【讨论】:

  • 谢谢,我认为这是最有意义的。我将继续研究代码并了解在该特定示例中如何设置问题。
  • 当然可以。我喜欢这本书。如果您有更多问题,请分享。
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多