
Alexander
15.02.2017
09:06:02
https://github.com/phoenixframework/phoenix/blob/master/lib/phoenix/transports/websocket.ex транспорт для Socket'а, как и https://github.com/phoenixframework/phoenix/blob/master/lib/phoenix/transports/long_poll.ex

Aldar
15.02.2017
09:06:11

Ivan
15.02.2017
09:06:33
ok.. а что использовать для работы с сокетом оси?

Aldar
15.02.2017
09:06:53

Google

Ivan
15.02.2017
09:07:10
elixir

Alexander
15.02.2017
09:07:21
afunix например
гуглится ещё какая-то альтернатива, я забыл какая

Alexander
15.02.2017
09:08:16
@che_onza для какой задачи?

Ivan
15.02.2017
09:09:11
куча пакетов сыпятся на сокет .. обработка этих пакетов и запись в бд данных

Alexey
15.02.2017
09:09:26
gen_tcp

Alexander
15.02.2017
09:09:30
сокет - unix сокет?

Ivan
15.02.2017
09:09:44
да unix soket

Aldar
15.02.2017
09:10:27

Alexander
15.02.2017
09:10:57
https://github.com/tonyrog/afunix ну и обработчик пакетов пиши поверх него, интерфейс как у gen_tcp вроде
о, а gen_tcp вроде бы тоже умеет в unix socket'ы

Ivan
15.02.2017
09:14:16
спасибо)

Евгений
15.02.2017
09:14:16
почему тогда долбаный экто не может подключиться на постгрес? :)

Google

Yaroslav
15.02.2017
09:14:56
Долбаный экто может
Новая версия не умеет в эскулайт, а в постгрес может

Alexander
15.02.2017
09:17:09
кстати оно вроде как experimental появилось только в 19, какой сейчас статус - непонятно, пометки что оно experimental нет

Евгений
15.02.2017
09:17:38
https://www.erlang.org/news/tag/%20OTP-19.0

Капитан
15.02.2017
10:23:20
Коллеги как приложение на phoenixframework запустить как службу в UBUNTU, так чтобы после перезапуска или падения приложение запускалось?
ок буду пробовать благодарю!
$ cat /etc/systemd/system/myapp.service
[Unit]
Description=my app
[Service]
User=erl
WorkingDirectory=/home/erl
ExecStart=/home/erl/bin/myapp foreground

Max
15.02.2017
11:55:36
ето, а в еликсире пулы по-прежнему через пулбой принято делать, или что-то лучше придумали?

Alexander
15.02.2017
11:58:18
пулбой, альтернатив нет
если только poolgirl :D

Max
15.02.2017
12:01:17
а как в пулбой засунуть уникальные идентификаторы для каждого воркера?
допустим я хочу их 500 штук, и чтобы у каждого было 1, 2, 3, 4, ..., 500
и потом при работе какой дёрнется, такой и использует работу с таким ID
или я где-то туплю и не вижу очевидного?

Mikhail
15.02.2017
12:02:55
ПУСТЬ КАЖДЫЙ ВОРКЕР ПРИ ИНИЦИЛИЗАЦИИ ДЁРГАЕТ НЕКИЙ ГЕНСЕРВЕР И ПОЛУЧАЕТ ОТ НЕГО ИДЕНТИФИКАТОР

Max
15.02.2017
12:03:32
СУПЕРВАЙЗОР ДЛЯ ПРОЦЕССА РАЗДАЮЩЕГО НАТУРАЛЬНЫЕ ЧИСЛА

Alexander
15.02.2017
12:03:33
можно же зарегать воркер в Registry при старте и всо

Max
15.02.2017
12:03:47
а что это даст?
я Registry ещё не использовал ни разу

Alexander
15.02.2017
12:05:48
вообще не очень понял, что ты хочешь получить... сливать задачи по ID на определенный воркер в пуле?

Google

Max
15.02.2017
12:07:50
не
я хочу, чтобы у каждого воркера был какой-то свой уникальный числовой ID

Dmitry
15.02.2017
12:09:10

Alexander
15.02.2017
12:09:18
Registry - замена для gproc'а прост... рандомный? что при рестарте процесса? он должен сохранить этот ID?

Max
15.02.2017
12:09:59
и когда он делает работу — делает её с этим ID
т.е. есть 5000..5500 порты
я дёргаю воркер из пула, узнаю его порт и работаю с ним
одна сессия работает с одним воркером
они запускаются и гасятся
воркер начал делать работу — запустился на этом порту
перестал — погас

Dmitry
15.02.2017
12:12:43
Вообще то такое можно сделать с помощью registry, но смысла я не вижу
Если ты делаешь stateless сервер, то тебе без разницы какой из воркеров обрабатывает запрос
А если делаешь stateful - то state определятся должен уж точно не портом
Что возвращает нас к тому что ты можешь узнать state в любом воркере, и тебе без разницы каким именно обрабатывать
А для этого ставится poolboy, а стейт выносится из воркера

Max
15.02.2017
12:16:49
чтобы порты были в заданном диапазоне и каждый использовался только одним воркером
или запустить 500 simple_one_for_one?

Google

Max
15.02.2017
12:18:06
т.е. мне нужен пул целых чисел

Alexander
15.02.2017
12:20:15
можно хранить список портов в Agent'е, при старте воркера брать из него порт, после завершения возвращать его обратно в список

Max
15.02.2017
12:25:21
что за агент?

Alexander
15.02.2017
12:26:47
абстракция для хранения стейта, почти GenServer, только проще

Dmitry
15.02.2017
12:28:49
Используй ets

Max
15.02.2017
12:31:20
целые числа хранить

Alexander
15.02.2017
12:31:39
:D

Admin
ERROR: S client not available

Alexander
15.02.2017
12:31:51
MapSet и Agent - норм варик

Dmitry
15.02.2017
12:32:21
А в чем проблема ets?

Max
15.02.2017
12:33:06
да, Agent похоже то, что нужно
спасибо!

Dmitry
15.02.2017
12:35:30
Ets не создаёт отдельных процессов, хорошо масштабируется, очень быстрая, хранится в оперативке.
И ещё не теряет данные если supervision tree упадёт.
Запись чтение одной командой.
Для пула где надо set pop/push идеально.

Alexey
15.02.2017
12:36:17
да. чем ets не нравится - тож не понимаю. а Agent где-то видел, что их вообще не рекомендуют к применению. изобретение эликсирщиков.

Max
15.02.2017
12:36:31
хм

Dmitry
15.02.2017
12:38:27
Агент туповат потому что его отдельным модулем не импортировать, и получается что для его изменения надо писать лямбду, а это выглядит не очень - как callback hell в js.
Я во всяком случае всегда использую gen server вместо агента

Alexey
15.02.2017
12:39:04
не смогу найти ссыль на обсуждение, но это точно было
даже валима туда приплетали, что идея с агентами плохая
это как идея с оберткой над gen_fsm. сначала ее вроде бы сделали. а потом выпилили насовсем. и оставили либо пользуй стандартным ерланговым путем. или сторонней либой, не входящей в состав эликсир

Google

Alexey
15.02.2017
12:41:38
ets и dets самый что нинаесть стандартный функционал, входящий прям в состав ерланга. его даже как библиотеку тянуть и доставлять не нужно. пользуйте его наздоровье
и если его пользовать только на чтение, то он будет даже быстрее, чем свой генсервер, который запросы в очередь выстроит. потому что умеет параллельное чтение

Max
15.02.2017
12:44:16
так мне же надо и помечать тогда в ETS, какой порт занят

Dmitry
15.02.2017
12:45:04
Делаешь set и смотришь есть там порт или нет.
Если есть - удаляешь, если нету - значит занято

Max
15.02.2017
12:48:19
два процесса смотрят один порт — есть, удаляют, начинают использовать

Alexey
15.02.2017
12:48:21
я делал, у меня супервизор отлавылиывал смерть воркеров (нормальную или ненормальную) и убирал

Max
15.02.2017
12:48:23
один падает

Alexey
15.02.2017
12:54:30
упадет - и норм.
у вас и первый может упасть по неведомой причине

Max
15.02.2017
12:54:53
по какой? порт нельзя слушать?

Alexey
15.02.2017
12:55:31
либо работу с выдачей номеров - етс кладете в генсервер. тогда он один порт двоим не выдаст

Max
15.02.2017
12:56:08
так-то да, но если генсервер, то зачем в нём етс, и чем это отличается от Agent?

Alexey
15.02.2017
12:56:12
это как раз тот случай, когда параллельное чтение не нужно
можно и не етс. я бы мап использовал
агенты не пользую. так что не подскажу

Alexander
15.02.2017
13:05:55
зачем с ets оверинжинирить непонятно, объемы небольшие и стейта процесса для этого заглаза хватит
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/agent.ex реализация агента, там видно что это и зачем это
@mtreskin щас ещё модно на GenStage всё перепиливать, с ним можно и без poolboy обойтись поидее

Alexey
15.02.2017
13:12:30
про него писали даже недавно. https://habrahabr.ru/post/317724/

Max
15.02.2017
13:23:17

Alexander
15.02.2017
13:24:07
https://github.com/elixir-lang/gen_stage