У нас есть настройка архитектуры, в которой у нас есть клиентское приложение, работающее на сервере, и мы хотели бы иметь микросервис, отвечающий за предоставление функций распределенной блокировки/карты/кэша. Эта служба Micro внутри использует Redisson, клиент на основе Java, который может взаимодействовать с Redis. Теперь мы хотели бы обеспечить блокировку API, разблокировку, получение, установку из службы Micro, которую может использовать клиентское приложение. Для связи между приложением и микрослужбой мы будем использовать протокол gRPC.
Как правильно предлагать API блокировки/разблокировки от Microservice клиенту? В настоящее время мы используем Redisson Semap на основе RedissonMap RMap.getLock(..)) и следует спецификации java Lock, поэтому поток, который получает распределенную блокировку, может только разблокироваться. Одна из проблем заключается в том, что поскольку блокировка обрабатывается микрослужбой, клиент должен делать отдельные запросы на блокировку и разблокировку, которые могут обслуживаться или не обслуживаться одним и тем же узлом (микрослужбой) и одним и тем же потоком. это можно обойти с помощью семафора (с 1 разрешением). Итак, по сути, мы используем Rsemaphore redisson для сервера варианта использования взаимного исключения.
Меня больше интересует, какие факторы следует учитывать, когда мы придумываем спецификацию API для получения/выпуска, например, должен ли вызов для получения/выпуска разрешений в микросервисе быть синхронным или асинхронным.