#elixir #phoenix-framework
#elixir #phoenix-фреймворк
Вопрос:
Я готов использовать клиент для cassandra db, поэтому мне нужно инициализировать его как:
client = CQEx.Client.new!
Я создал два маршрута для чтения и записи, которые указывают на действия в контроллере.
Вопрос в том, как мне инициализировать клиент только один раз и использовать его каждый раз в действиях контроллера?
Должен ли я создать GenServer и отправлять ему сообщения из действий контроллера? чтобы я мог поддерживать клиент cassandra на генераторном сервере?
Должен ли я создавать клиента каждый раз, когда выполняю действие ?!
Какой совет здесь?
Комментарии:
1. GenServer против нового клиента каждый раз полностью зависит от ваших потребностей, например, от того, сколько одновременных запросов вы хотите обработать и насколько дорого стоит создание нового подключения к Cassandra. Возможно, вы также захотите изучить пул соединений с помощью poolboy, как это использует Ecto, см. github.com/elixir-ecto/db_connection и github.com/devinus/poolboy .
2. Мне нужно обрабатывать тысячи одновременных запросов, я думаю, я сам ответил? 🙂 Почему бы не создать
Task
для каждой операции чтения или записи? итак, каждая задача будет выполняться в отдельном процессе, это хороший способ сделать это (на случай, если я решил не использовать GenServer и каждый раз создавать соединение)?3. Зачем создавать задачу? Каждый запрос уже будет новым процессом и будет выполняться одновременно с другими запросами.. если вы не хотите выполнять тонны операций чтения / записи за запрос . В любом случае, @tkowal, похоже, прав —
cqerl
похоже, он уже создает пул подключений, чтобы вы могли просто звонитьClient.new!
напрямую.4. Вы имеете в виду, что phoenix сам создаст процесс для каждого запроса REST?
5. Да, Phoenix создает новый процесс для каждого запроса. Вы можете попробовать ввести
IO.inspect(self)
действие контроллера, отправить ему несколько запросов и посмотреть результат в консоли.
Ответ №1:
Мне пришлось бы еще немного покопаться, но, похоже CQEx.Client.new!
, на самом деле это не инициализация клиента, и это немного вводит в заблуждение.
Реализация https://github.com/matehat/cqex/blob/master/lib/cqex/client.ex#L7 показывает, что он вызывает внутренне :cqerl.get_client()
, и если вы посмотрите на cqerl
библиотеку, он порождает супервизоры с подключениями, так что, возможно, нет необходимости обрабатывать параллелизм и безопасно просто использовать get_client
и выполнять работу.
Комментарии:
1. Если библиотека имеет свое собственное дерево наблюдения и рабочие процессы, и вы выполняете только один или два запроса в своем действии, это было бы полностью избыточным и запутывало бы реальную бизнес-логику.
cqerl
зависит отpooler
, поэтому он, вероятно, управляет пулом рабочих, которые постоянно подключены. Если вы выполняете много одновременных запросов в одном действии контроллера, это может дать вам некоторое ускорение. Вы должны это измерить 🙂