Создание пула соединений в сервисе и использование их в других сервисах - PullRequest
0 голосов
/ 20 февраля 2019

В микросервисной архитектуре, построенной с использованием Spring-Boot и Eureka Service discovery, я создаю пулы соединений C3P0 для многих приложений в отдельном отдельном сервисе.Но когда я пытаюсь вернуть созданные пулы соединений их отдельным приложениям в качестве объекта и использовать соединение из этого объекта, оно не работает.

Например - когда мы напрямую создаем источник данных с помощью C3P0, мыwrite -

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(...);

Но когда мы хотим, чтобы источник данных использовал пул соединений, созданный в другом микро-сервисе, есть ли какой-нибудь пример / Github для его получения?

Ответы [ 2 ]

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

Соединение с БД - это, по сути, соединение TCP под капотом, которое однозначно идентифицируется парой сокетов в участвующих хостах.Здесь сокет означает комбинацию сетевого адреса (IP) и адреса хоста (порта).

Когда установлено соединение TCP, все эти данные сохраняются в обеих конечных точках в структуре данных, называемой TCB.Таким образом, вы не можете просто перенести TCP-соединение с одного хоста на другой.

Есть некоторые исследования миграции TCP-соединения, например this .Тем не менее, главная цель здесь - это производительность , а не (как в пуле подключений за счет экономии времени трехстороннего рукопожатия TCP во время установления соединения), но позволить существующим соединениям продолжаться и не разрываться из-за изменения IP-адреса.из-за мобильности или аварийного переключения.

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

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

Если вы каким-либо образом перенесете источник данных с одного хостадругому, а затем попытаться заимствовать у него соединение, проверка соединения, которую источник данных делает перед возвратом соединения, не будет выполнена, и это будет продолжаться до тех пор, пока все соединения не будут исчерпаны, а затем будет создано новое соединение для этого конкретного хоста.Таким образом, в конечном итоге вы ничего не получите от этого.

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

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

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

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

Это то, что существовало в Java годами, и как, например, серверы JNDI могут использоваться для поиска данных конфигурации для распределенного приложения или какПриложения JavaEE могут обмениваться данными конфигурации с клиентскими приложениями Java.Это практика, которая, по моему опыту, становится все менее распространенной в пользу использования таких вещей, как Spring Cloud Config и т. Д.

...