Драйвер Cassandra Datastax - пул подключений

Я пытаюсь понять пул соединений в Datastax Cassandra Driver, чтобы лучше использовать его в своем веб-сервисе.

У меня версия 1.0 документации. Он говорит:

Драйвер Java использует соединения асинхронно, поэтому несколько запросов могут быть отправлены по одному и тому же соединению одновременно.

Что они понимают под связью? При подключении к кластеру у нас есть: Строитель, Кластер и Сессия. Какой из них связан?

Например, такой параметр:

maxSimplicousRequestsPerConnection - количество одновременных запросов на всех подключениях к узлу, после которых создаются дополнительные подключения.

Итак, эти соединения создаются автоматически в случае объединения в пул (чего я и ожидал). Но каковы именно связи? Кластерные объекты? Сессии?

Я пытаюсь решить, что оставить «статичным» в моем веб-сервисе. На данный момент я решил оставить Builder статичным, поэтому для каждого вызова я создаю новый кластер и новый сеанс. Это нормально? Если кластер является подключением, все должно быть в порядке. Но так ли это? Теперь регистратор сообщает для каждого вызова:

2013: 12: 06 12:05:50 DEBUG Cluster: 742 - Запуск нового кластера с контактными точками

2013: 12: 06 12:05:50 DEBUG ControlConnection: 216 - [Control connection] Обновление списка узлов и карты токенов

2013: 12: 06 12:05:50 DEBUG ControlConnection: 219 - [Управляющее соединение] Обновление схемы

2013: 12: 06 12:05:50 DEBUG ControlConnection: 147 - [Управляющее соединение] Успешно подключено к ...

Значит, он каждый раз подключается к кластеру? Это не то, что я хочу, я хочу повторно использовать соединения.

Итак, соединение на самом деле является Сессией? В этом случае я должен сохранять статическим кластер, а не Builder.

Какой метод мне следует вызвать, чтобы быть уверенным, что я повторно использую соединения, когда это возможно?


person Anakin001    schedule 06.12.2013    source источник


Ответы (3)


Вы правы, соединение на самом деле находится в сеансе, а сеанс - это объект, который вы должны передать своим DAO для записи в Cassandra.

Пока вы используете один и тот же объект сеанса, вы должны повторно использовать соединения (вы можете видеть сеанс как свой пул соединений).

Изменить (2017/4/10): я уточнил этот ответ после @William Price one. Имейте в виду, что этому ответу 4 года, и Кассандра за это время немного изменилась!

person C4stor    schedule 06.12.2013
comment
Спасибо за ваш ответ. Итак, сохраняется ли логика пула в сеансе на уровне выполнения запроса? Я ожидал, что он будет храниться в объекте Cluster на уровне создания сеанса. - person Anakin001; 06.12.2013
comment
Политика объединения передается через построитель и используется объектом Session для выбора узла для запроса. - person C4stor; 06.12.2013
comment
Я просто надеюсь, что когда несколько клиентов будут использовать один и тот же сеанс одновременно, они фактически будут использовать разные физические соединения. - person Anakin001; 06.12.2013
comment
@ C4stor, как сказал @ Anakin001 I'm just hoping that when multiple clients will use the same Session at the same time, they will actually use different physical connections. Это правда - person Prakash Pandey; 20.02.2017
comment
@PrakashPandey - вообще-то нет. В собственном протоколе C * v2 и v3 физические TCP-соединения мультиплексируются. В этих протоколах одиночное TCP-соединение может поддерживать до 128 и 32k + одновременных асинхронных запросов in-flight соответственно. - person William Price; 08.04.2017

принятый ответ (на момент написания) дать правильный совет:

Пока вы используете один и тот же объект Session, вы [будете] повторно использовать соединения.

Однако некоторые части изначально были упрощены. Я надеюсь, что нижеследующее дает представление о масштабах каждого типа объектов и их соответствующих целях.

Строитель ≠ Кластер ≠ Сессия ≠ Соединение ≠ Заявление

Cluster.Builder - это используется для настройки и создания кластера

Cluster представляет весь Кольцо кассандры

Кольцо состоит из нескольких узлов (хостов), и кольцо может поддерживать одно или несколько пространств ключей. Вы можете запросить объект Cluster о свойствах уровня кластера (кольца).

Я также думаю об этом как об объекте, который представляет для кольца вызывающее приложение. Вы сообщили о потребностях вашего приложения (например, о шифровании, сжатии и т. Д.) Сборщику, но именно этот объект первым реализует / взаимодействует с фактическим кольцом C *. Если ваше приложение использует несколько учетных данных аутентификации для разных пользователей / целей, у вас, вероятно, будут разные объекты Cluster, даже если они подключены к одному кольцу.

Session сам по себе не соединение, но он управляет ими

Сеансу может потребоваться поговорить со всеми узлами в кольце, что невозможно сделать с одним TCP-соединением, за исключением особого случая колец, которые содержат ровно один (1) узел. Сеанс управляет пул соединений, и этот пул обычно будет иметь по крайней мере одно соединение для каждого узла в кольце. Вот почему вам следует как можно чаще повторно использовать объекты Session. Приложение не управляет подключениями напрямую и не получает доступа к ним.

Доступ к сеансу осуществляется из объекта Cluster; обычно он привязан к одному ключевому пространству за раз, которое становится ключевым пространством по умолчанию для операторов, выполняемых из этого сеанса. Оператор может использовать полное имя таблицы (например, keyspacename.tablename) для доступа к таблицам в других пространствах ключей, поэтому не требуется использовать несколько сеансов для доступа к данным в разных пространствах ключей. Использование нескольких сеансов для связи с одним и тем же кольцом увеличивает общее количество требуемых TCP-соединений.

Statement выполняется в Сессия

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

Кроме того, версии 2 и 3 используемого драйвером двоичного протокола Cassandra используют мультиплексирование в соединениях. Таким образом, хотя для одного оператора требуется хотя бы одно TCP-соединение, это одно соединение потенциально может обслуживать до 128 или 32k + асинхронных запросов одновременно, в зависимости от версии протокола (соответственно).

person William Price    schedule 07.04.2017
comment
Спасибо, я обновил свой ответ (принятый в настоящее время), чтобы хотя бы немного отразить ваше письмо :-) - person C4stor; 10.04.2017

Просто обновление для сообщества. Вы можете настроить пул соединений следующим образом

private static Cluster cluster;

cluster.getConfiguration().getPoolingOptions().setMaxConnectionsPerHost(HostDistance.LOCAL,100);
person LynAs    schedule 17.02.2015