
Артем
12.03.2018
08:27:56
поскольку события к нам приходят извне, в случае с genstage придётся их где-то накапливать. а хотелось бы не накапливать, а пушить их пулу воркеров

Dmitry
12.03.2018
08:28:12
Они не будут накапливаться
Если ты разгребаешь быстрее чем генерируешь

Артем
12.03.2018
08:29:26
я не могу в handle_demand ходить куда-то за данными, потому что данные мне пушит сторонний сервис

Google

Артем
12.03.2018
08:30:14
точнее, могу, но это та же очередь, которую я пытаюсь не реализовывать, так как в данном случае это явно архитектурный костыль
сторонний сервис пушит мне событие, в момент пуша я должен передавать его пулу воркеров

Dmitry
12.03.2018
08:30:35
Что значит пушит сервис?

Артем
12.03.2018
08:30:48
а не пул воркеров должен ходить и спрашивать, нет ли чего нового
ну пускай для простоты мне приходят запросы в контроллер феникса

Dmitry
12.03.2018
08:31:40
Ну и либо кидаешь в стейт продюсера
А лучше - в етс

Артем
12.03.2018
08:34:44
по своей сути это похоже на ту же очередь, так как тут не мы из контроллера инициируем мгновенную обработку, а кто-то со стороны пула
проще тогда взять erlang queue да и всё

Dmitry
12.03.2018
08:36:21
Можно Задать пул воркеров и хешировать запрос
Единственный вариант
Без очереди
Но может неповезти

Google

Dmitry
12.03.2018
08:37:09
С хешом

Артем
12.03.2018
08:37:37
ну вот я изначально смотрел poolboy, но к нему нельзя cast, только call

Dmitry
12.03.2018
08:39:43
Ну наверное пулбой за счёт этого как раз и знает, какой из воркеров занят
Как иначе понять, какой нагружать то?

Andrey
12.03.2018
08:40:03
а что мешает из пулбоя получить pid процесса и к нему cast сделать самому

Артем
12.03.2018
08:42:45

Andrey
12.03.2018
08:44:19

Артем
12.03.2018
08:44:51

Andrey
12.03.2018
08:45:15
не я про то что так заочно верить всему что написано в каких то блогах
по факту всё так
но это не полная правда
https://github.com/devinus/poolboy/blob/master/src/poolboy.erl#L73
вот код транзакции

Артем
12.03.2018
08:46:04

Andrey
12.03.2018
08:46:36
берешь вручную делаешь checkout, отправляешь воркеру сообщение, и коллбек в котором предаешь checkin которую воркер сам сделает как закончит полезную работу
придется конечно учесть это в воркере
ну или сделать обертку над ним какую-то

Артем
12.03.2018
08:47:51
да это понятно что всю логику выбора воркеров и чекина-чекаута можно вынести к себе, один вопрос, зачем тогда пулбой))

Andrey
12.03.2018
08:48:28
он всё также будет контролировать пул

Google

Vladimir
12.03.2018
08:48:56
мне кажется тут вообще не избежать очереди никак

Артем
12.03.2018
08:50:57
но неверное архитектурно

Vladimir
12.03.2018
08:53:43
ну если у нас есть источник событий, и как много событий придёт заранее не известно, и нельзя быть уверенным что их можно выгрести по прибытии, значит они в любом случае где-то будут копиться
так ведь?
очередь либо в mailbox процесса, либо в явном виде в ets либо ещё где-нибудь

Артем
12.03.2018
08:54:52

Vladimir
12.03.2018
08:55:07
а, вот оно как

Артем
12.03.2018
08:55:36
поэтому я считаю очередь некоторым архитектурным оверхэдом
а обратное давление - неправильным механизмом
хотя я даже неправильно выразился. собыстия не просто допустимо терять, а недопустимо обрабатывать события старше чем 500-1000мс, то есть в этом уже нет ценности
а есть вред

Vladimir
12.03.2018
08:58:36
о, это интересно

Dmitry
12.03.2018
09:04:23
Если нужен cast - никак не узнать, насколько загружен worker, поэтому может быть имеет смысл сделать так, чтобы процессы сами выгребали события из какой-нибудь ets (можно хотя бы убедиться, что нагрузка планомернее распределяется по worker-ам, если они сами события эти достают), при том если туда писать timestamp когда событие пришло, чтобы игнорировать/удалять уже не нужные и не столкнутся с проблемой перегруженных mailbox-ов в случае того, когда нагрузка поднимется.

Vladimir
12.03.2018
09:06:28
ну так почему бы не использовать mailbox процесса,
который выгребает события, разрешает не более N сообщений в mailbox.
если собщение старое -- пропускаем
если есть свободный воркер -- отдаём ему сообщение
если воркера нет, проверяем длину очереди. Если больше N -- пропускаем сообщение.
если длина очереди меньше -- ждём свободного воркера

Артем
12.03.2018
09:06:38

Vladimir
12.03.2018
09:08:15
можно дёргать process_info(self(), message_queue_len)

Dmitry
12.03.2018
09:08:30
Вообще, sbroker умеет делать
init(_) ->
QueueSpec = {sbroker_timeout_queue, #{timeout => 200}},
{ok, {QueueSpec, QueueSpec, []}}.
sbroker_example:start_link/0 will start an sbroker with queues configured by QueueSpec. This configuration uses the sbroker_timeout_queue callback module which drops requests when they have been in the queue for longer than a time limit (200 milliseconds). To use this sbroker:
Выбрасывать запросы, которые уже лежат в queue дольше чем нужно
При перегрузке.

Google

Andrey
12.03.2018
09:17:27
Если вдруг порядок сообщений не важен то можно вообще использовать stack, а не очередь
и соответственно разом выбрасывать все протухшие переинициализировав стек

Alex
12.03.2018
09:22:18
а, уже написали
sbroker
но в случае с ним пул и какой-никакой менеджер пула придется делать самому

Dmitry
12.03.2018
09:28:20
По-моему в mailbox все копится
Поэтому каст - неверное решение
Тогда лучше запускать таск со временем жизни
На каждое событие
И из него пытаться пойти в пул
Если пулл успевает - таск отработает
А иначе - сдохнет
И все

Dmitry
12.03.2018
09:32:21
sbroker - короче, я бы взял однозначно sbroker, прежде чем что-то своё делать. Только в случае, если sbroker станет тем самым медленным элементом системы перешёл бы на какой-нибудь ets + процессы сами выгребают из неё.

Dmitriy
12.03.2018
09:52:25
Привет! Столкнулся с проблемой при разработке феникса. У меня есть другое приложение (рельсы) и бд PG. Я делаю феникс приложение, которое использует существующую БД. Задал необходимые модели для использования существующих таблиц, миграций естественно нет. В режиме разработки приложение стартует нормально и ecto работает по тем таблицам. Но когда пытаюсь запустить тесты, то ругается, что бд не найдена и предлагает создать через ecto.create.

Артем
12.03.2018
09:52:43

Marsel
12.03.2018
09:53:32

Dmitry
12.03.2018
09:53:34
@vkosmos26 А что стоит в test.exs?
Там в config.exs - обычно стоит import "#{Mix.exs}.exs" - и для каждого env-а сконфигурирована своя база данных.

Dmitriy
12.03.2018
09:55:07
настройки подключения идентичный, что и в рельсовом database.yml. Т.е. тестовая база

Google

Dmitriy
12.03.2018
09:58:09
если дропнуть тестовую бд, и создать ее под фениксом MIX_ENV=test mix ecto.create то база создается, и тесты начинают выполняться, но так как миграций нет и таблицы не созданы, то естестевнно не работает

Dmitry
12.03.2018
10:03:37
@vkosmos26 Так какая база в test.exs сконфигурирована?
База данных в phoenix-е через файлы конфигурации config.exs и test.exs(для test-а) сконфигурированы.

Dmitriy
12.03.2018
10:05:31
в test.exs сконфигурирована тестовая база. Та же что и используется в рельсах для тестаов

Dmitry
12.03.2018
10:05:56
Аааа, наверное рельсы создают базу данных и убивают её после тестов.
Поэтому её и не существует вне тестов приложения рельс.

Dmitriy
12.03.2018
10:06:45
не должно, но проверю на всякий случай )

Dmitry
12.03.2018
10:07:13
Если бы база данных существовала, то mix ecto.create - её бы не создал.

Nikolay
12.03.2018
10:07:24
У меня такая же нога и не болит (с)
Мигрировал базу из рейлс проекта
тесты гонял из феникс
всё было норм

Dmitriy
12.03.2018
10:08:08
может из-за докера конечно все

Никита
12.03.2018
10:11:03
Logger.info "Test base need to be clean as schoolgirl ass" я вот так везде пишу, в сидах например, чтобы кто-нить сиды в тестовую базу не загнал)

Dmitriy
12.03.2018
10:35:07

Nikolay
12.03.2018
10:36:03
это не одно и тоже? Оо или что ты подразумаешь под “тестовая рельсовая бд”?

Dmitriy
12.03.2018
10:37:23
под тестовой рельсовой бд я понимаю ту бд, конфиги которой заданы в database.yml для test окружения.

Dmitry
12.03.2018
10:44:21
В папке priv есть папка migrations?
Если база существует - и каждый раз при тестах ее нечем создавать, то в mix.exs из alias для теста можно удалить ecto.create
И ecto.migrate
Но думаю все согласятся, что это вообще не ок, что приложение зависит от какой-то тестовой бд рельс, и по хорошему фениксу надо сделать 1 миграцию, которая создаст всю бд. Если не ошибаюсь - pg_dump вернёт скл запрос, с помощью которого можно создать копию бд. Вот его можно в миграцию засунуть