Azure-向所有其他角色发送消息并等待响应

Azure-向所有其他角色发送消息并等待响应,azure,caching,cloud,azureservicebus,cache-invalidation,Azure,Caching,Cloud,Azureservicebus,Cache Invalidation,我在多实例web应用程序中需要的一种非常常见的模式是使所有实例上的内存缓存无效,并等待已完成的确认。(因为用户可能在刷新后突然看到另一个实例上的旧数据) 我们可以通过以下组合实现这一点: AzureServicebus 向主题发送消息 其他实例将带有ReplyTo的消息发送回原始实例 有一个等待循环来等待消息返回 首先要知道还有多少其他实例 可能是超时,因为如果实例在这段时间内崩溃,会发生什么情况 我认为解决所有这些小的边缘案例可能需要很多工作——所以在我们重新发明轮子之前——是否已经有了一

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

我们可以通过以下组合实现这一点:

  • AzureServicebus
  • 向主题发送消息
  • 其他实例将带有ReplyTo的消息发送回原始实例
  • 有一个等待循环来等待消息返回
  • 首先要知道还有多少其他实例
  • 可能是超时,因为如果实例在这段时间内崩溃,会发生什么情况
我认为解决所有这些小的边缘案例可能需要很多工作——所以在我们重新发明轮子之前——是否已经有了一个通用的模式或库


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

看看Azure持久功能,例如。它们在下面使用Azure存储队列,但提供更高级别的抽象

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

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

的确如此。这听起来像是中间件框架的候选者,例如或

AzureServicebus

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

向主题发送消息

和都可以
消息()发布到主题

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

和都可以向特定目的地发送消息。NServiceBus还可以使用一个

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

两者兼有,又称支持

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

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

可能是超时,因为如果实例在这段时间内崩溃,会发生什么情况


如果您指的是重试和恢复,那么两者都支持重试。

您可以使用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();