Меня интересует наилучший подход к разработке диспетчера соединений с БД для n-уровневой системы с балансировкой нагрузки.
Классический n-ярус выглядит так:
Client -> BusinessServer -> DBServer
Решение балансировки нагрузки, как я вижу, будет выглядеть так:
+--> ... +--+
+--> BusinessServer +--+--> SessionServer --+
Client -> Gateway --+--> BusinessServer +--| +--> DBServer
+--> BusinessServer +--+--------------------+
+--> ... +--+
Как показано, компонент бизнес-сервера балансируется нагрузкой через несколько экземпляров, а аппаратный шлюз распределяет нагрузку между ними.
Сервер сеансов, вероятно, должен находиться за пределами массива балансировки нагрузки, поскольку он управляет состоянием, которое не должно дублироваться.
За исключением каких-либо серьезных ошибок в проектировании, каков наилучший способ реализации управления подключением к БД?
Я предложил несколько вариантов, но могут быть и другие, о которых я не знаю:
Ввести новый компонент Broker между DBServer и другими компонентами и позволить ему обрабатывать соединения с БД.
- Положительным моментом является то, что все соединения могут управляться из одной точки, что очень удобно.
- Недостатком является то, что теперь в системе есть дополнительная «единая точка отказа». Другие компоненты должны проходить через него для каждого запроса, который каким-либо образом связан с БД, что также делает это узким местом.
Переместите управление соединениями с БД в компоненты BusinessServer и SessionServer и разрешите каждому обрабатывать свои собственные соединения с БД.
- Положительным моментом является то, что не существует дополнительных "единой точки отказа" или узких мест.
- Недостатком является то, что нет никакого контроля над возможными конфликтами и взаимоблокировками, кроме того, что может предоставить сам DBServer.
Что еще можно сделать?
FWIW: технология - это .NET, но не используются стеки, специфичные для поставщика (например, нет WCF, MSMQ и т. П.)