Size: a a a

2019 October 13

VI

Victor Ivanov in pro.elixir
Можно. Например, делаем процесс и подписываем его на presence_diff для всех процессов user. Считаем joins / leaves.

Минусы данного подхода:
• bottleneck в виде одного процесса
• возможно, будут баги про обработке presence_diff
источник

VI

Victor Ivanov in pro.elixir
Я сделал похожим образом, но у меня иногда «зависают» каналы, то есть по информации Presence.list канал пустой, а я почему-то считаю, что там есть один процесс.  Сколько локально не тестировал — никогда не воспроизводится, а на проде в первый же день такие зомби появляются.
источник

АГ

Артем Голубцов in pro.elixir
Victor Ivanov
Я сделал похожим образом, но у меня иногда «зависают» каналы, то есть по информации Presence.list канал пустой, а я почему-то считаю, что там есть один процесс.  Сколько локально не тестировал — никогда не воспроизводится, а на проде в первый же день такие зомби появляются.
Понял. Спасибо. А вариант из ссылки будет приемлемым?
источник

VI

Victor Ivanov in pro.elixir
Я лично от него отказался, не помню уже по какой причине
источник

АГ

Артем Голубцов in pro.elixir
Victor Ivanov
Я лично от него отказался, не помню уже по какой причине
А вариант дополнительно создать общий канал для всех пользователей и уже трекать через Presence.track?
источник

АГ

Артем Голубцов in pro.elixir
На сколько плохо сваливать большое количество людей в один котел?
источник

VP

Vladimir Potapev in pro.elixir
Артем Голубцов
На сколько плохо сваливать большое количество людей в один котел?
Вопрос с сайта "Hell Overflow" :)
источник

АГ

Артем Голубцов in pro.elixir
=)
источник

VI

Victor Ivanov in pro.elixir
Victor Ivanov
Ну вот Крис сам такое советовал:

It’s not entirely clear what your use case is, but you have a couple options:
1 On join, have another process monitor you, then when you disconnect, they will receive {:DOWN, ...} and you can handle whatever you need to do. This only works assuming you need to react to clients leaving the same way, regardless of how many are connected. For example, if I open 5 tabs, this setup will fire the callbacks as I close each one, rather than when my “last” tab is closed. This may or may not be what you’re wanting.
2 You can have another process call MyApp.Endpoint.subscribe("some:topic") where the topic is the channel topic(s) you’re wanting to watch over. This process will then receive presence_diff events and you can react accordingly. This setup let’s you know more, like how many tabs/devices are connected for the same user, and whether the “last” one has left, but then you also need to manage when to subscribe to new topics, and unsubscribe from ones that are no longer being tracked by active channels on the local node.
Вот нашёл, почему я отказался — мне нужно именно трекать, когда последний так закрыли
источник

VI

Victor Ivanov in pro.elixir
Артем Голубцов
На сколько плохо сваливать большое количество людей в один котел?
Я изначально и написал, что не вижу смыла для прототипа (а по вопросам мне кажется, что это прототип) делать что-то сложное.
источник

АГ

Артем Голубцов in pro.elixir
Victor Ivanov
Я изначально и написал, что не вижу смыла для прототипа (а по вопросам мне кажется, что это прототип) делать что-то сложное.
Почти готовый продукт)
источник

VI

Victor Ivanov in pro.elixir
Ну в таком случае вам так и так необходимо нагрузочное тестирование, с ним ясно будет, работает схема или нет
источник

АГ

Артем Голубцов in pro.elixir
Victor Ivanov
Ну в таком случае вам так и так необходимо нагрузочное тестирование, с ним ясно будет, работает схема или нет
Ок. Теперь есть из чего выбрать.
источник

AM

Alexander Malaev in pro.elixir
Артем Голубцов
Подскажите, пожалуйста, как решить проблему. Есть 3 канала. Один list(список чатов), второй chat (чат), третий user(канал пользователя). Нужно сделать, чтобы в списке чатов всегда был актуальное состояние человека (онлайн/офлайн). Но при этом люди почти не сидят в канале (list).
Можно трекать не канал, а процесс сокета юзера, например :)
источник

АГ

Артем Голубцов in pro.elixir
Alexander Malaev
Можно трекать не канал, а процесс сокета юзера, например :)
А как это реализовать?
источник

VI

Victor Ivanov in pro.elixir
Артем Голубцов
На сколько плохо сваливать большое количество людей в один котел?
Я вижу проблему в том, что презенс отправляется на клиента, то есть если у вас 10К users, то будет постоянный поток с диффами им всем. Не айс
источник

АГ

Артем Голубцов in pro.elixir
Victor Ivanov
Я вижу проблему в том, что презенс отправляется на клиента, то есть если у вас 10К users, то будет постоянный поток с диффами им всем. Не айс
Ну это первая причина почему я не делал так.
источник

AM

Alexander Malaev in pro.elixir
Из connect/3 коллбэка опекать transport_pid
источник

AM

Alexander Malaev in pro.elixir
*трекать
источник

VI

Victor Ivanov in pro.elixir
Но если презенс не нужен на клиенте — его можно не отправлять
источник