Поддерживать состояние в контроллере?

#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 , поэтому он, вероятно, управляет пулом рабочих, которые постоянно подключены. Если вы выполняете много одновременных запросов в одном действии контроллера, это может дать вам некоторое ускорение. Вы должны это измерить 🙂