#ruby-on-rails #actioncable #aws-application-load-balancer
#рубин на рельсах #способный к действию #aws-балансировщик нагрузки приложений
Вопрос:
Контекст: Приложение Rails, запускающее кабель действий для websockets с использованием Redis, на экземпляре EC2, которое должно быть обновлено для работы на нескольких экземплярах за балансировщиком нагрузки приложений AWS. Я прочитал несколько блогов, объясняющих настройки людей, но есть ключевая концепция, которую я не понимаю.
Вопрос: Насколько я понимаю, веб-сайты требуют фиксированного соединения между браузером и сервером. Балансировщик нагрузки приложений AWS (ALB) справляется с этим, устанавливая подключение websocket к определенному экземпляру за ALB. Но предположим, что кто-то подписан на канал и имеет соединение через ALB с сервером A, и на сервере B происходит событие, которое запускает трансляцию websocket для этого канала.
Как клиенты, подключенные к этому каналу на сервере А, когда-либо получают сообщение?
Комментарии:
1. насколько я знаю, Rails ActionCable использует Redis pub/sub для трансляции сообщений, поэтому это зависит от того, как вы настраиваете Redis для работы с балансировщиком нагрузки.
2. ДА. Я думал, что мне придется использовать AWS Elasticache с API Redis, чтобы был один единственный источник информации. Я предполагаю, что если оба сервера A и B используют один сервер Redis с серверами, доступными для действий, как на A, так и на B, то любое сообщение, помещенное в кэш сервера, будет обработано A и B, так что все подписчики получат сообщение. Но я не уверен, как сообщения удаляются из очереди. Если сервер А примет сообщение, сможет ли сервер В по-прежнему его видеть? Или у меня должен быть один кабельный сервер, и серверы Rails A и B могут отправлять на него сообщения для публикации?