我一直在阅读第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>();
}
我需要了解如果服务在处理过程中发生故障,相同“类型”的微服务的多个微服务实例如何进行重复数据删除而不会丢失消息。
据我了解,所有实例都将订阅该事件,因此都将收到该事件。
只有一个订户实例将处理消息/事件。当您有多个服务实例正在运行并且已订阅同一预订时,第一个选择该消息的实例将使该消息在预订中不可见(称为可见性超时)。如果服务实例能够在给定的时间内处理该消息,它将告诉队列删除该消息,如果它不能及时处理该消息,则该消息将重新出现在队列中,以便任何实例可以再次接收它。
所有标准服务总线(rabbitMQ,SQS,Azure Serivce总线等)均立即提供此功能。
顺便说一下,我已经阅读了本书,并使用了eShotContainers中的上述代码,并且按我描述的方式工作。
您还应该研究以下模式以及“竞争消费者”模式
希望有帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句