Azure - отправьте сообщение всем другим ролям и дождитесь ответа
Действительно распространенный шаблон, который мне нужен в веб-приложениях с несколькими экземплярами, - это аннулирование MemoryCache для всех экземпляров - и ожидание подтверждения того, что это было сделано. (В противном случае пользователь мог бы после обновления внезапно увидеть старые данные в другом экземпляре)
Мы можем сделать это с помощью комбинации:
- AzureServicebus,
- Отправка сообщения в тему
- другие экземпляры отправляют сообщение обратно с ReplyTo исходному экземпляру
- иметь цикл ожидания для ожидания сообщений назад,
- знать о том, сколько других экземпляров существует в первую очередь.
- вероятно, какое-то время ожидания, потому что что происходит, если экземпляр падает между ними?
Я думаю, что проработка всех этих небольших крайних случаев может быть большой работой - так что, прежде чем мы изобретем колесо - уже есть общий шаблон или библиотека для этого?
(конечно, одним из решений будет использование общего кэша, такого как Redis, но в некоторых ситуациях кэш памяти работает намного быстрее)
3 ответа
Посмотрите на долгосрочные функции Azure, например, сценарий Fan-In/Fan-Out. Они используют очереди хранилища Azure, но предоставляют абстракции более высокого уровня.
Обратите внимание, что долговременные функции все еще находятся на ранней стадии предварительного просмотра (по состоянию на август 2017 года), поэтому пока не подходят для производственного использования.
Я думаю, что проработка всех этих небольших крайних случаев может быть большой работой - так что, прежде чем мы изобретем колесо - уже есть общий шаблон или библиотека для этого?
В самом деле. Это звучит как кандидат на среду промежуточного программного обеспечения, такую как NServiceBus или MassTransit.
AzureServicebus
И NServiceBus, и MassTransit поддерживают служебную шину Azure в качестве транспорта.
Отправка сообщения в тему
И NServiceBus, и MassTransit могут Publish
сообщения ( события) к темам.
другие экземпляры отправляют сообщение обратно с ReplyTo исходному экземпляру
И NServiceBus, и MassTransit могут отправлять сообщения в конкретное место назначения. NServiceBus также может Reply
отправителю входящего сообщения, используя шаблон запроса / ответа.
иметь цикл ожидания для ожидания сообщений
И NServiceBus, и MassTransit поддерживают Sagas, также известный как шаблон Process Coordinator.
знать о том, сколько других экземпляров существует в первую очередь.
Не уверен насчет этого требования. Когда вы уменьшаете масштаб, вы работаете с конкурирующим потребителем и не должны заботиться о количестве экземпляров конечной точки.
вероятно, какое-то время ожидания, потому что что происходит, если экземпляр падает между ними?
Если вы ссылаетесь на попытки и восстановление, то и NServiceBus, и MassTransit поддерживают повторные попытки.
Для этого вы можете использовать модель паба / подчиненной модели кэша 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();