@proelixir

Страница 904 из 1045
Артем
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 сделать самому

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 либо ещё где-нибудь

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 -- пропускаем сообщение. если длина очереди меньше -- ждём свободного воркера

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, а не очередь

и соответственно разом выбрасывать все протухшие переинициализировав стек

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.

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

В папке priv есть папка migrations?
Ecto.create & ecto.migrate без этой папки будут падать

Но думаю все согласятся, что это вообще не ок, что приложение зависит от какой-то тестовой бд рельс, и по хорошему фениксу надо сделать 1 миграцию, которая создаст всю бд. Если не ошибаюсь - pg_dump вернёт скл запрос, с помощью которого можно создать копию бд. Вот его можно в миграцию засунуть

Страница 904 из 1045