我在多实例Web应用程序中需要的一个非常常见的模式是使所有实例上的MemoryCache无效 - 并等待确认已完成此操作。 (因为用户可能会在刷新后突然看到另一个实例上的旧数据)
我们可以结合使用:
我认为解决所有这些小边缘情况可能需要做很多工作 - 所以在我们重新发明轮子之前 - 是否已有一个共同的模式或库?
(当然一个解决方案是使用像Redis这样的共享缓存,但在某些情况下,内存缓存要快得多)
答案 0 :(得分:2)
查看Azure耐用功能,例如Fan-In/Fan-Out scenario。他们使用下面的Azure存储队列,但提供更高级别的抽象。
请注意,Durable Functions仍处于早期预览状态(截至2017年8月),因此不适合生产使用。
答案 1 :(得分:2)
我认为解决所有这些小边缘情况可能需要做很多工作 - 所以在我们重新发明轮子之前 - 是否已有一个共同的模式或库?
事实上。这听起来像是NServiceBus或MassTransit等中间件框架的候选者。
AzureServicebus
NServiceBus和MassTransit都支持Azure Service Bus作为传输。
向主题发送消息
NServiceBus和MassTransit {{}}}条消息(events}都可以发布主题。
其他实例使用ReplyTo将消息发送回原始实例
NServiceBus和MassTransit都可以向特定目的地发送消息。 NServiceBus也可以使用Reply
request/reply pattern到传入消息的发起者。
有等待消息的等待循环
NServiceBus和MassTransit都支持Sagas,也称为Process Coordinator pattern。
首先要注意有多少其他实例。
不确定此要求。当您向外扩展时,您正在与竞争消费者一起运行,而不应关心端点的实例数。
可能是一些超时,因为如果实例在两者之间发生崩溃会发生什么?
如果您参考重试和恢复,则NServiceBus和MassTransit都支持重试。
答案 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();
});