У меня есть ReplicaSet общей микрослужбы Java («служба БД»), которая может взаимодействовать с любой базой данных JDBC на основе метаданных. Когда вышестоящая микрослужба вызывает эту микрослужбу БД, она выделяет пул соединений JDBC. Допустим, администратор базы данных предоставил мне 50 подключений для работы с конкретным вариантом использования (некоторая единица развертывания метаданных, которую моя система может «выполнить»).
Я хотел бы иметь две реплики БД, каждая из которых создает 25 подключений (MAX / 2) в локальном пуле подключений. Отныне вышестоящая микрослужба теперь должна направлять свои вызовы только этим двум репликам, которые теперь содержат эти 2 пула соединений, минуя другие реплики X DB, которые не создавали никаких соединений.
Если вышестоящая микрослужба добавляет заголовок HTTP, уникальный для этого варианта использования («StatefulRoute = ConnectionName»), можно ли обмануть K8s и / или Istio, чтобы направить запрос к подмножеству реплик БД, которые создали эти локальные пулы соединений JDBC для этот вариант использования?
Обратите внимание, что многие другие варианты использования могут быть развернуты пользователем с течением времени, каждый вариант использования потенциально также требует подключения JDBC. Эти варианты использования следует распространить на другие реплики БД на основе проверок готовности уже занятых реплик БД.
Я представляю себе дополнительную микрослужбу Resource Manager (проводник), с которой каждая реплика БД будет взаимодействовать, чтобы спрашивать: 1) могу ли я выделить пул соединений для этого запроса, 2) сколько соединений я могу выделить.
Когда самая первая (неинициализированная) реплика БД получает новый запрос (маршрут еще не установлен), она взаимодействует с диспетчером ресурсов. Этот менеджер, в свою очередь, должен затем динамически настроить K8s / Istio (вызов REST?) Для маршрутизации запросов (для конкретного варианта использования) к этой реплике.
Resource Manager будет Singleton или, если он станет узким местом, ReplicaSet, использующим распределенный кеш для отслеживания «грантов пула соединений». Если у него заканчиваются соединения, он будет пинговать реплики БД, которые долгое время не отправляли сердцебиение (мог быть перезапущен K8s). Если он обнаружит, что одна реплика не отвечает, он позволит новой реплике выделить пул соединений на основе оставшихся доступных соединений (на стороне базы данных).
Если все ранее инициализированные реплики все еще активны и обслуживают запрос (и, таким образом, максимальное количество физических подключений к базе данных используется), менеджер отклонит запрос на подключение, и запрашивающая реплика базы данных вернет ошибку («больше подключений для запрос на обслуживание ") к вышестоящему микросервису.
Кто нибудь сталкивался с этим требованием?
Это не привязка к сеансу пользователя, которая обычно включает вход. Это включает в себя схожесть между двумя микросервисами внутри кластера.
Спасибо.
StatefulRoute=ConnectionName
, скажем, для версии 1 вашего модуля? - person Jakub   schedule 18.05.2020