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

时间:2017-08-23 10:40:18

标签: azure caching cloud azureservicebus cache-invalidation

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

我们可以结合使用:

  • AzureServicebus,
  • 向主题发送消息
  • 其他实例使用ReplyTo将消息发送回原始实例
  • 有等待消息的等待循环,
  • 首先要知道有多少其他实例。
  • 可能是一些超时,因为如果实例在两者之间发生崩溃会发生什么?

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

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

3 个答案:

答案 0 :(得分:2)

查看Azure耐用功能,例如Fan-In/Fan-Out scenario。他们使用下面的Azure存储队列,但提供更高级别的抽象。

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

答案 1 :(得分:2)

  

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

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

  

AzureServicebus

NServiceBus和MassTransit都支持Azure Service Bus作为传输。

  

向主题发送消息

NServiceBusMassTransit {{}}}条消息(events}都可以发布主题。

  

其他实例使用ReplyTo将消息发送回原始实例

NServiceBusMassTransit都可以向特定目的地发送消息。 NServiceBus也可以使用Reply request/reply pattern到传入消息的发起者。

  

有等待消息的等待循环

NServiceBusMassTransit都支持Sagas,也称为Process Coordinator pattern

  

首先要注意有多少其他实例。

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

  

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

如果您参考重试和恢复,则NServiceBusMassTransit都支持重试。

答案 2 :(得分:0)

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

SELECT [Order Date] , sum([Profit]) 
FROM [sample].[dbo].[superstore]
WHERE [Order Date] >=  '2012-06-21' AND
      [Order Date] < '2012-09-22'
GROUP BY [Order Date]
ORDER BY [Order Date];

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

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();
});