Извините, что даю вам ответ, который вы не хотите, но ...:
Вы не получаете список всех подписавшихся клиентов. Вы не должны быть в состоянии. Если вам нужна эта информация, возможно, вы испытываете недостаток дизайна.
Почему?
Парадигма pub / sub предназначена для отвода этих деталей, что позволяет осуществлять горизонтальное масштабирование таким образом, чтобы различные узлы управляли своими собственными списками подписок.
Конечно, когда вы запускаете одно приложение в одном процессе, вы можете извлечь эту информацию, но в тот момент, когда вы увеличиваете масштаб, используя больше процессов / машин, эта информация распространяется и становится недоступной. больше.
Пример
Например, при использовании механизма публикации / подсистемы йода (подробности см. на сервере Ruby iodine WebSocket / HTTP ):
Каждый процесс управляет собственным списком клиентов.
Каждый процесс является «клиентом» в главном / корневом процессе.
Каждый основной / корневой процесс является клиентом на сервере Redis (при условии, что Redis используется).
Допустим, вы запускаете два йодных "динамо" на Heroku, каждый с 16 рабочими, затем:
Redis видит максимум двух клиентов на канал.
Каждый из двух основных процессов видит максимум 16 клиентов на канал.
Каждый процесс видит только клиентов, подключенных к этому конкретному процессу.
Как видите, запрашиваемая вами информация нигде не доступна. Реализация pub / sub распространяется на разные машины. Каждый процесс / машина управляет только небольшой частью списка паба / суб-клиента.
РЕДАКТИРОВАТЬ (1) - ответ на обновленный вопрос
Существует три возможных подхода к решению этого вопроса:
клиентское решение;
решение на стороне сервера; и
ленивый (недействительный) подход.
В качестве решения на стороне клиента клиент может зарегистрироваться в глобальном "канале уведомлений сервера". Когда появляется сообщение «re-authenticate», клиент должен повторно пройти аутентификацию, инициируя генерацию уникального токена на своем уникальном соединении.
A решение на стороне сервера требует подключения на стороне сервера для прослушивания глобального "канала-уведомлений сервера". Затем объект подключения пересчитает токен аутентификации и передаст уникальное сообщение клиенту.
Подход lazy-invalidation состоит в том, чтобы просто аннулировать все токены. Подключенные клиенты будут оставаться на связи (пока они не закроют браузер, не закроют свой компьютер или не выйдут из приложения). Клиенты должны будут повторно пройти аутентификацию при установлении нового соединения.
Примечание (добавлено, как описано в комментариях):
Единственное решение, которое решает сценарий "гремящего стада", - это решение для ленивых / аннулирования.
Любое другое решение вызовет скачок сетевого трафика и загрузки ЦП, поскольку все подключенные клиенты будут обрабатывать событие в одно и то же время.
Осуществление
С ActionCable решение на стороне клиента может быть проще в реализации. Его дизайн и документация очень ориентированы на «толчок». Они часто используют подход обработки на стороне клиента.
На йод , подписки на стороне сервера просто требуют, чтобы block
был передан методу client.subscribe
. Это создает клиентскую подписку с событием, которое выполняется на сервере (вместо сообщения, отправленного клиенту).
Подход с отложенной проверкой работоспособности может ухудшить взаимодействие с пользователем, в зависимости от дизайна, поскольку им, возможно, придется повторно вводить учетные данные.
С другой стороны, ленивый аннулирование может быть самым безопасным, повысить безопасность и одновременно снизить нагрузку на серверы.