#ruby-on-rails #redis #actioncable
#ruby-on-rails #redis #actioncable
Вопрос:
Я рассматриваю возможность переноса развертывания моего приложения на Heroku, и я хотел бы определить, может ли оно корректно запускаться там на базовом плане, прежде чем предпринимать усилия по миграции. Базовый план ограничивает Redis до 20 подключений.
Я принципиально не понимаю архитектуру соединений Rails / Redis. Существует ли одно подключение к Actioncable, которое затем распределяет данные, или это подключение для каждого фактического клиента (т. Е. Одно подключение для каждой вкладки браузера)?
Комментарии:
1. Хороший вопрос. Пока недостаточно охвачено в Интернете, поскольку я пытаюсь определить назначение некоторых подключений Redis, помеченных как «Actioncable»
2. @Maxence, Actioncable — это реализация Rails websocket и (как правило?) использует redis как способ распространения данных в реальном времени, насколько я понимаю.
3. Привет @ElTea Ну, мне было интересно, сколько клиентов использовалось для нескольких подключений переменного тока. На самом деле я видел несколько разных подключений Actioncable в Redis после того, как я назвал их все (Sidekiq, Rails app Redis; ActionCable ..). Мне было интересно, сколько клиентов можно создать. Этот поток reddit.com/r/rails/comments/hz14wg /… и в ответе Mathew Oriordan четко указано, что Actioncable мультиплексирует только через 2 соединения redis. Затем я очистил свою базу данных Redis, и это кажется точным. Я снова проверю, создано ли более 2 клиентов Redis
4. Также у меня есть Redis с пространством имен, используя несколько баз данных Redis. Итак, я предполагаю, что некоторые соединения AC, которые я видел, принадлежали разным приложениям, которые я запускал в качестве разработки на своей машине. Теперь я все сделал чисто, я надеюсь, что моя точка доступа будет привязана к 2 клиентам для AC. Это не проблема при обслуживании локально или с обычной машины, но на Heroku доступно только 20 подключений или приходится тратить большие суммы денег на дополнительных клиентов redis.
Ответ №1:
Согласно документам,
Отдельный пользователь создаст одну пару подключений потребителя для каждой открытой вкладки браузера, окна или устройства.
ActionCable позволяет идентифицировать соединение, используя идентификатор соединения, обычно глобальный объект с именем current_user в большинстве случаев. При таком подходе вы можете позже получить все открытые соединения данным пользователем (и потенциально отключить их все, если пользователь удален, неавторизован или у него открыто слишком много соединений).
Также обратите внимание, что ActionCable использует рабочий пул для выполнения обратных вызовов соединения и действий канала в изоляции от основного потока вашего сервера.
Комментарии:
1.Привет @theterminalguy На данный момент, в разработке,
redis-cli
CLIENT LIST
возвращает 10 соединений Redis для Actioncable. Хотя у меня подключен один пользователь. Но идентификатор пользователя изменился. Есть ли вероятность, что 8 из этих подключений зависят от пользователя, которые были удалены несколько дней или недель назад? Или нормально иметь журнал подключений Redis, не связанный с количеством подключенных пользователей? Спасибо2. Хорошо после уничтожения Puma и перезапуска его. При входе в приложение с пользователем используются только 2 подключения Redis. Все 10 соединений были отключены. И все же я не слишком уверен, почему было создано 10 подключений, поскольку сегодня я играл с одним пользователем…
3. Используете ли вы Sidekiq?
CLIENT LIST
должен показать вам имена всех подключенных клиентов для ActionCable это ActionCable-PID-идентификатор процесса, для Sidekiq, один из способов, которым вы могли бы определить, — это поле cmd = brpop .4. Я действительно использую Sidekick. Но клиенты sidekiq имеют правильные имена. Никакой путаницы. Но также я транслирую от внутренних работников sidekiq на кабельные каналы Action. Тогда я подумал, что Sidekiq мог бы создавать клиенты Actioncable. Но я изменил параллелизм Sidekiq с 5 на 1, затем на 10. И у меня все еще есть около 3 клиентов Actioncable redis после того, как я перезапустил Puma и сбросил все ключи redis. Я не слишком уверен, почему эти 10 клиентов AC сегодня. Завтра я снова буду следить … спасибо за ваше возвращение в этом
5. Привет @theterminalguy. Я ценю ссылку, но одна пара подключений потребителя, похоже, ссылается на сервер приложений. Из 3.1: «Само соединение не имеет отношения к какой-либо конкретной логике приложения, кроме аутентификации и авторизации». Мне кажется, что это на сервере приложений Rails, а не в redis. Итак, я все еще не уверен, есть ли соотношение 1 к 1 между подключениями приложений и тем, что redis считает подключениями. (Я признаю, что я тыкаю в это палкой в темноте).