Микросервисы - пул соединений при подключении к одной устаревшей базе данных - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю над созданием микроуслуг для монолитного приложения с использованием Spring Boot + Spring Cloud + Spring JDBC.В настоящее время приложение подключается к одной базе данных через пул соединений tomcat JNDI.

У нас есть узкое место, чтобы не менять архитектуру базы данных в данный момент из-за различных причин, таких как большое количество объектов БД,тесные зависимости с другими системами и т. д.

Итак, мы выделили микроуслуги на основе функций приложения.Меня беспокоит то, что если мы разрабатываем микросервисы, каждый из которых имеет свой собственный пул соединений, то количество подключений к базе данных может увеличиваться в геометрической прогрессии.

В настоящее время я думаю о двух решениях

  1. Чтобы вычислить количество соединений, которые в настоящее время используются каждой функцией приложения и достигают максимальных / минимальных параметров соединения на услугу, что является очень утомительным процессом, и у нас нет никакого механизма, чтобы получить количество соединений на приложениеfeature.

  2. Для разработки микросервиса данных с одним пулом соединений, который получает объект запроса от другой MS, инициирует запрос к базе данных и возвращает объект набора результатов вызывающей стороне.

Не уверен, является ли второй подход наилучшей практикой в ​​архитектуре микросервисов.

Не могли бы вы предложить какие-либо другие стандартные подходы, которые могут быть полезны в текущей ситуации?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Я сталкиваюсь с подобной дилеммой на работе и могу поделиться выводами, к которым мы пришли.

На данный момент серебряной пули нет, поэтому:

1 - Рассчитайте количество соединений, делящих общее желаемое количество соединений для экземпляров микросервисов, будет хорошо работать, если у вас возникнет ситуация, когда ваши микросервисы не нуждаются в резко упругой шкале.

2 - Отсутствие пула и возможность открытия соединений по требованию. Это то, что используется в функциональном программировании (например, Amazon лямбда). Это уменьшит общее количество открытых соединений, но недостатком является то, что вы теряете производительность, так как открытие соединений на лету дорого.

Вы могли бы реализовать какую-то тему, которая сообщит вашей службе, что количество экземпляров изменилось в слушателе, и обновит общее число соединений, но это сложное решение, которое идет вразрез с принципом микросервиса, согласно которому вы не должны изменять конфигурации службы после ее запуска.

Вывод: я бы вычислил число, если микросервис имеет тенденцию не расти в масштабе и без пула, если он действительно должен расти упруго и экспоненциально, в этом последнем случае убедитесь, что повтор выполняется, если он не получить соединение с первой попытки.

Здесь есть интересная серая область, ожидающая лучшего способа управления пулами соединений в микросервисах.

Со временем, и чтобы сделать проблему еще более интересной, я рекомендую прочитать
статья о размере бассейна от HikariCP: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing Идеальные параллельные соединения в базе данных на самом деле меньше, чем думает большинство людей.

0 голосов
/ 12 сентября 2018

Все дело в компромиссах.

  1. Для расчета количества соединений, которые в настоящее время используются каждой функцией приложения и достигают максимальных / минимальных параметров соединения для каждой услуги.

Минусы : Как вы сказали, для достижения определенного количества соединений на одну функцию приложения требуется некоторое профилирование и догадки.

Плюсы : в отличие от второго подхода, вы можете избежать снижения производительности

  1. Для разработки микросервиса данных с одним пулом соединений, который получает объект запроса от другой MS, запускает запрос к базе данных и возвращает объект набора результатов вызывающей стороне.

Плюсы : минимальная предварительная работа

Минусы : еще один слой, в свою очередь еще одна точка отказа. Производительность ухудшится, так как вам придется иметь дело с serialization -> Http(s) network latency -> deserialization->(jdbc fun stuff which is part of either approach) -> serialization -> Http(s) network latency -> deserialization. (В вашем случае эта стоимость производительности может быть незначительной. Но если в вашей службе учитывается каждая миллисекунда, то это решающий фактор)

По моему мнению, я бы не разделил прикладной уровень в одиночку, пока не проанализирую свои домены и хранилища данных.

Это хорошее прочтение: http://blog.christianposta.com/microservices/the-hardest-part-about-microservices-data/

...