2

我在多实例 Web 应用程序中需要的一个非常常见的模式是在所有实例上使 MemoryCaches 无效 - 并等待确认这已经完成。(因为用户可能会在刷新后突然看到另一个实例上的旧数据)

我们可以通过以下组合来实现:

  • Azure服务总线,
  • 向主题发送消息
  • 其他实例将带有回复的消息发送回原始实例
  • 有一个等待循环来等待消息返回,
  • 首先要知道还有多少其他实例。
  • 可能有一些超时,因为如果实例在两者之间崩溃会发生什么?

我认为解决所有这些小边缘情况可能需要做很多工作——所以在我们重新发明轮子之前——是否已经有一个通用的模式或库来解决这个问题?

(当然,一种解决方案是使用像 Redis 这样的共享缓存,但在某些情况下,内存缓存要快得多)

4

3 回答 3

2

查看 Azure Durable Functions,例如Fan-In/Fan-Out 场景。它们在底层使用 Azure 存储队列,但提供更高级别的抽象。

请注意,Durable Functions 仍处于早期预览阶段(截至 2017 年 8 月),因此尚不适合生产使用。

于 2017-08-23T11:36:27.793 回答
2

我认为解决所有这些小的边缘情况可能需要做很多工作——所以在我们重新发明轮子之前——是否已经有一个通用的模式或库来解决这个问题?

的确。这听起来像是NServiceBusMassTransit等中间件框架的候选者。

Azure服务总线

NServiceBus和MassTransit都支持将 Azure 服务总线作为传输。

向主题发送消息

NServiceBus和MassTransit可以向主题Publish发送消息(事件)。

其他实例将带有回复的消息发送回原始实例

NServiceBus和MassTransit可以将消息发送到特定目的地。NServiceBus 也可以Reply使用请求/回复模式到传入消息的发起者。

有一个等待循环来等待消息返回

NServiceBus和MassTransit支持Sagas,也称为Process Coordinator 模式

首先要知道还有多少其他实例。

不确定这个要求。当您向外扩展时,您正在与竞争消费者一起运行,并且不应该关心端点实例的数量。

可能有一些超时,因为如果实例在两者之间崩溃会发生什么?

如果您提到重试和恢复,那么NServiceBusMassTransit都支持重试。

于 2017-08-23T15:49:09.757 回答
0

您可以使用 Azure Redis 缓存发布/订阅模型来执行此操作。1) 订阅 Redis 多路复用器

connectionMultiplexer.GetSubscriber().Subscribe(
                        "SubscribeChannelName",
                        (channel, message) => { 

invalidate cache here and publish the confirmation using below publish method
connectionMultiplexer.GetSubscriber().PublishAsync("PublishChannelName", "Cache invalidated for instance").Wait();
});

2) 发布缓存失效并订阅实例的确认

var connection = ConnectionMultiplexer.Connect("redis connection string");
var redisSubscriber = connection.GetSubscriber();
redisSubscriber.Subscribe(
                        "PublishChannelName",
                        (channel, message) => {

// write logic to verify if all instances notified about cache invalidation.
});
redisSubscriber.PublishAsync("SubscribeChannelName","invalidate cache")).Wait();
于 2017-09-02T06:38:00.713 回答