我一直在阅读第58页上的这本书,以了解如何在微服务之间进行异步事件集成。
使用RabbitMQ和发布/订阅模式有助于将事件推送给订阅者。但是,考虑到微服务体系结构和停靠器的使用,我希望一个微服务“类型”运行的实例不止一次。据我所知,所有实例都会订阅该事件,因此都会收到它。
这本书没有清楚地解释如何确保只有一个实例处理请求。
我研究了复制部分,但是描述了一种模式,该模式解释了如何在服务实例中去重复,但不一定针对它们.
每个微服务实例都将使用类似于以下内容的内容进行订阅:
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>();
}我需要理解一个相同类型的微服务的多个微服务实例是如何在处理过程中不丢失消息的情况下去复制的。
发布于 2019-08-14 21:51:11
据我所知,所有实例都会订阅该事件,因此都会收到它。
只有一个订阅者实例将处理消息/事件。当一个服务的多个实例运行并订阅相同的订阅时,第一个选择消息的实例将设置订阅中不可见的消息(称为可见性超时)。如果服务实例能够在给定的时间内处理消息,它将告诉队列删除消息,如果无法及时处理消息,则消息将重新出现在队列中,以便任何实例再次获取消息。
所有标准的服务总线(rabbitMQ、SQS、Azure Serivce总线等)都提供了开箱即用的功能。
顺便说一下,我读过这本书,并使用了来自eShotContainers的上述代码,它的工作方式与我所描述的一样。
您还应该查看以下模式( 竞争消费者模式 )
希望这能帮上忙!
https://stackoverflow.com/questions/57497607
复制相似问题