2016-10-06 5 views
1

Я готов использовать клиент для Кассандры дБ, так что мне нужно, чтобы инициализировать его как:Поддерживать состояние контроллера?

client = CQEx.Client.new! 

Я создал два пути, чтобы читать и писать, что указывает на действия в контроллере.

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

Должен ли я создать GenServer и отправлять ему сообщения из действий контроллера? так что я могу поддерживать клиент cassandra в GenServer?

Должен ли я создавать клиента каждый раз, когда выполняю действие ?!

Какой совет здесь?

+0

GenServer vs new client каждый раз зависит полностью от ваших потребностей, например, сколько одновременных запросов вы хотите обрабатывать и как дорогое создание нового соединения Cassandra. Вы также можете посмотреть в пул соединений с использованием пула, такого как Ecto, см. Https://github.com/elixir-ecto/db_connection и https://github.com/devinus/poolboy. – Dogbert

+0

Мне нужно обрабатывать тысячи одновременных запросов, я думаю, что я ответил сам? :) Почему бы не создать «Задачу» для каждой операции чтения или записи? поэтому каждая задача будет выполняться на отдельном процессе, это хороший способ сделать это (в случае, если я решил не использовать GenServer и создавать соединение каждый раз)? – simo

+1

Зачем создавать задачу? Каждый запрос уже будет новым процессом и будет выполняться одновременно с другими запросами. Если вы не хотите выполнять тонны операций чтения/записи _per request_. В любом случае, @tkowal кажется правильным - 'cqerl' уже, похоже, создает пул соединений, поэтому вы можете просто называть' Client.new! 'Напрямую. – Dogbert

ответ

1

Мне пришлось бы копать еще несколько, но похоже, что CQEx.Client.new! фактически не инициализирует клиента и немного вводит в заблуждение.

Реализация https://github.com/matehat/cqex/blob/master/lib/cqex/client.ex#L7 показывает, что он внутренне вызывает :cqerl.get_client(), и если вы посмотрите на cqerl библиотеки, она нерестится контролеров ти соединений, так что может быть не нужно, чтобы справиться с параллелизмом и безопасно использовать только get_client и сделать работу.

+0

ах, действительно .. спасибо за указание, что вне – simo

+0

Если в библиотеке есть собственное дерево наблюдения и рабочие процессы, и вы выполняете только один или два запроса в своем действии, это будет полностью избыточным и запутанным фактической бизнес-логикой. 'cqerl' зависит от' pooler', поэтому он, вероятно, управляет пулом работников, которые постоянно подключены. Если вы выполняете много одновременных запросов в действии контроллера * one *, это может привести к некоторому ускорению. Вы должны его измерить :) – tkowal

+0

Спасибо, на самом деле это только одна операция за каждый запрос. – simo