У меня есть задача реализовать механизм безопасности, который гарантирует, что одновременно может работать только одна версия фоновой службы. Я не могу изменить существующую архитектуру или ввести новые компоненты инфраструктуры, поэтому я ограничиваюсь тем, что у нас уже есть: Azure SQL Server, Azure Blob и Service Bus.
Проблема возникает, когда две версии приложения (старая и новая) запускаются одновременно во время развертывания, что является распространенной ситуацией при использовании замены слотов службы приложений Azure для развертываний с нулевым временем простоя.
Одно из самых простых предлагаемых решений (из Stack Overflow) — вручную разблокировать новую версию после замены. К сожалению, у этого решения есть серьезные недостатки: при ручном перезапуске или любом перезапуске, не вызванном развертыванием, приложение не разблокируется автоматически. Это может привести к простою фоновых служб, а поскольку наше приложение сильно зависит от этих служб, мы не можем позволить себе простоя более одной минуты.
Другое предложение заключалось в использовании распределенной блокировки, реализованной через Azure SQL Server. Первый подход заключался в использовании sp_getapplock, но он зависит от базового соединения с БД. Если соединение прерывается из-за проблем с сетью, блокировка может не быть снята должным образом, что может привести к нескольким часам простоя.
Второй подход заключался в использовании специальной таблицы с TTL. Однако это может привести к ситуации, когда две версии фоновой службы считают, что обе удерживают блокировку, хотя на самом деле это делает только одна.
Мы также рассмотрели возможность блокировки фоновых служб в рабочем слоте и разблокировки их по умолчанию при запуске приложения. Но если промежуточный слот по какой-либо причине не запустится, мы можем получить простои более чем на минуту; слишком сильно зависит от времени между блокировкой и запуском второй версии приложения.
Итак, мой вопрос: кто-нибудь уже решил проблему такого типа или есть ли у кого-нибудь предложения, как ее решить более надежно?
Подробнее здесь: https://stackoverflow.com/questions/798 ... job-to-run