【发布时间】: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