我一直在读This Book在第 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>();
}
我需要了解如果服务在处理过程中出现故障,相同“类型”微服务的多个微服务实例如何在不丢失消息的情况下进行重复数据删除。
最佳答案
From what I understand all instances will subscribe to the event and therefore would all receive it.
只有一个订阅者实例会处理消息/事件。当您有多个服务实例正在运行并订阅同一个订阅时,第一个选择消息的实例会将消息设置为从订阅中不可见(称为可见性超时)。如果服务实例能够在给定时间内处理该消息,它将通知队列删除该消息,如果它不能及时处理该消息,该消息将重新出现在队列中以供任何实例再次拾取它.
所有标准服务总线(rabbitMQ、SQS、Azure 服务总线等)都提供开箱即用的此功能。
顺便说一下,我已经阅读了这本书并使用了来自 eShotContainers 的上述代码,它按照我描述的方式工作。
你也应该看看下面的模式 Competing Consumers pattern
希望对您有所帮助!
关于.net-core - 使用 RabbitMQ 发布/订阅微服务事件总线时如何去重事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57497607/