2015-01-13 3 views
4

Я разрабатываю многопоточное приложение и использую Cassandra для внешнего сервера.Безопасен ли сеанс сеанса cassandra? (с использованием драйвера cpp)

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

Вопрос: Я просто хочу знать, является ли это правильным способом или существует лучший способ сделать это? Я знаю, что объединение пулов является вариантом, но действительно ли это необходимо в этом сценарии?

ответ

5

Это действительно потокобезопасно в Java-драйвере, поэтому я предполагаю, что C++-драйвер тот же.

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

Если вы создаете несколько сеансов на одной клиентской машине или продолжаете открывать и закрывать сеансы, вы вынуждаете драйвер продолжать создавать и удалять соединения с кластером, что является расточительством ресурсов.

Цитирование this Datastax blog post около 4 простых правил при использовании драйверов DataStax для Кассандры:

экземпляр
  1. Используйте один кластер в (физическом) кластера (в приложении пожизненной)
  2. Использование более одной сессии на keypace или использовать одиночный сеанс и явно указать пространство ключей в ваших запросах
  3. Если вы выполняете инструкцию более одного раза, рассмотрите возможность использования PreparedStatement
  4. Вы можете уменьшить количество сетевых туда и обратно, а также атомарные операции с использованием ПАРТИЙ
+0

Так вы имеете в виду, что пул соединений осуществляется самим водителем ?! – Sudershan

+1

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

3

драйвер C/C++, безусловно, поточно на сессии и будущих уровнях.

Объект CassSession используется для выполнения запроса. Внутри объект сеанса также управляет пулом клиентских подключений к Cassandra и использует политику балансировки нагрузки для распределения запросов по этим соединениям. Приложение должно создать один сеанс объект на каждое место в качестве объекта сеанса, который должен быть создан один раз, повторно использован и , разделяемый несколькими потоками в приложении.

Они на самом деле есть раздел под названием Потокобезопасность:

CassSession предназначен для использования одновременно из нескольких потоков. CassFuture также защищен потоком. Помимо этих исключений, в общем, функции, которые могут изменять состояние объекта, НЕ являются потокобезопасными. Объекты, которые являются неизменяемыми (помечены как «const»), можно безопасно читать несколькими потоками.

У них также есть заметка об освобождении объектов. Это не потокобезопасно. Таким образом, вы должны убедиться, что все нити сделаны перед вами свободными объектами:

ПРИМЕЧАНИЯ: Объект/ресурс свободными ИНГ функций (например, cass_cluster_free, cass_session_free, ... Касс _ * _ бесплатно) не может быть назван одновременно на том же экземпляр объекта.

Источник:

http://datastax.github.io/cpp-driver/topics/

Смежные вопросы