Протокол HTTP не имеет состояния, основан наРежим запроса/ответа TCPЗапрос может быть инициирован только клиентом, а сервер может ответить. В большинстве сценариев этого шаблона запроса/ответа достаточно. Но в некоторых случаях, напримертолчок сообщения, уведомлениеВ других сценариях приложений данные должны быть синхронизированы с клиентом в режиме реального времени, для чего сервер должен поддерживать активные push-данные.
Технология push-уведомлений сервера имеет долгую историю и испыталакороткий опрос, длинный опросРазвитие системы может в определенной степени решить проблему, но есть и недостатки, такие какСвоевременность, пустая трата ресурсовЖдать.Стандарт HTML5принесСпецификация веб-сокетаЭта ситуация в основном закончилась, и это стало основным решением для технологии push-уведомлений на стороне сервера.
Интегрировать WebSocket в систему очень просто, а соответствующие обсуждения и материалы очень богаты. Однако не существует зрелого решения о том, как реализовать общий push-шлюз WebSocket. В настоящее время поставщики облачных услуг в основном сосредоточены на мобильных терминалах, таких как iOS и Android, а также не поддерживают WebSocket. В этой статье представлены наши основанные наNettyвыполнитьШлюз постоянного соединения WebSocketнекоторые мысли и переживания.
1 Статус использования WebSocket на iQIYI
iQIYI этоСоздание, распространение и монетизация контента iQIYIПлатформа iQIYI охватывает несколько видов бизнеса, таких как самомедиа, онлайн-университеты, онлайн-драмы, дети, знания, документальные фильмы и т. д. Это важная часть экологии контента iQIYI. Как интерфейсная система, iQIYI предъявляет высокие требования к пользовательскому опыту, что напрямую влияет на энтузиазм создателя к творчеству. В настоящее время iQIYI используется в нескольких бизнес-сценариях.Технология push-уведомлений WebSocket техника,включают:
- комментарий пользователя.Отправляйте сообщения с комментариями в браузер в режиме реального времени.
- Проверено.Перед подписанием контракта пользователю необходимо выполнить аутентификацию по реальному имени.Пользователь сканирует QR-код и переходит на страницу сторонней аутентификации.После завершения аутентификации браузер асинхронно уведомляется о статусе аутентификации.
- Идентификация живого тела.Подобно аутентификации по реальному имени, когда распознавание живого тела будет завершено, браузер будет уведомлен о результате асинхронно.
При реальном развитии бизнеса мы обнаружили, что при использовании технологии push-уведомлений WebSocket возникают следующие проблемы:Во-первых,Websocket Technology Stack не является однородным, оба основанные на основе Netty достигают, существует веб-судно для достижения, на разработку и обслуживание трудно;Второй,Реализация WebSocket разбросана по разным проектам и тесно связана с бизнес-системой.Если есть другие предприятия, которым необходимо интегрировать WebSocket, они столкнутся с дилеммой повторной разработки, пустой траты средств и низкой эффективности;третий,WebSocket — это протокол с отслеживанием состояния.Когда клиент подключается к серверу, он подключается только к одному узлу в кластере и взаимодействует только с этим узлом во время передачи данных.
Следовательно, необходимо решить проблему кластеризации WebSocket.совместное использование сеансаПроблема.如果只采用单节点部署,虽然可以避免这一问题,但无法水平扩展支撑更高负载,有单点的风险;最后,缺乏监控与报警,虽然可以通过Сокет для линуксаКоличество подключений примерно оценивает количество длинных WebSocket-подключений, но цифры не точны, и невозможно узнать количество пользователей и другие бизнес-значимые данные индикатора, его нельзя интегрировать с существующим микросервисным мониторингом для достижения унифицированного контроль и оповещение.
2 Проектирование и реализация шлюза долгосрочного подключения
Для решения вышеуказанных проблем мы внедрили единый шлюз длинных соединений WebSocket, который имеет следующие характеристики:
1. Централизованная реализация долгосрочного управления соединениями и возможностей push-уведомлений.Унифицируйте технологический стек и используйте долгосрочное подключение в качестве базовой возможности для облегчения итерации функций, обновления и обслуживания.
2. Разделение от бизнеса.Бизнес-логика разделила длинную связь, так что система не заботится о деталях делового общения, а также во избежание дублирования разработки, затрат на разработку.
3. Простой в использовании.Предоставляет push-канал HTTP для облегчения доступа к различным языкам разработки. Бизнес-системе нужен всего лишь простой вызов для передачи данных и повышения эффективности НИОКР.
4. Распределенная архитектура.Реализуйте многоузловые кластеры и поддерживайте горизонтальное расширение для решения задач, связанных с ростом бизнеса; простои узлов не влияют на общую доступность сервисов, обеспечивая высокую надежность.
5. Многотерминальная синхронизация сообщений.Разрешить пользователям использовать несколько браузеров или вкладок, чтобы войти в систему онлайн одновременно, гарантируя, что сообщения отправляются синхронно.
6. Многомерный мониторинг и сигнализация.Настраиваемые индикаторы мониторинга связаны с существующей системой мониторинга микросервисов, и в случае возникновения проблем можно своевременно выдавать сигналы тревоги для обеспечения стабильности сервисов.
2.1. Технический отбор
Среди многих реализаций WebSocket, отПроизводительность, масштабируемость, поддержка сообществаУчитывая другие аспекты, в конце концов была выбрана Нетти. Нетти - этоВысокопроизводительный, управляемый событиями, асинхронный, неблокирующийСетевая коммуникационная структура широко используется во многих известных программах с открытым исходным кодом.
WebSocket является stateful и не может достичь балансировки нагрузки в кластере, как прямой HTTP.После установления длительного соединения он поддерживает сеанс с узлом на стороне сервера.Поэтому, если вы хотите знать, какому узлу принадлежит сеанс в рамках кластера , Естьдва варианта,Один из них - использоватьПохоже на микросервисыРеестр для поддержания глобальных отношений сопоставления сеансов, один из нихИспользуйте событие трансляцииКаждый узел сам определяет, проводить ли сеанс.Сравнение двух схем показано в таблице 1.
| план | преимущество | недостаток |
|---|---|---|
| Регистрационный центр | Отношения сопоставления сеансов ясны, что больше подходит при большом масштабе кластера. | Реализовать сложный, надежный центр регистрации с дополнительными затратами на эксплуатацию и техническое обслуживание. |
| трансляция события | Простой и более легкий | Когда узлов много, все узлы транслируются, а ресурсы тратятся впустую. |
Таблица 1: Схема кластеризации WebSocket
С учетом стоимости реализации и масштаба кластера выбрана облегченная схема трансляции событий. Для реализации широковещательной рассылки вы можете выбрать широковещательную рассылку сообщений на основе RocketMQ на основеПубликация/подписка на Redis,на основеZooKeeperПрограмма уведомления, ее преимущества и недостатки показаны в таблице 2. Исходя из пропускной способности, режима реального времени, постоянства, простоты реализации и других соображений, окончательный выборRocketMQ.
| план | преимущество | недостаток |
|---|---|---|
| На основе RocketMQ | Высокая пропускная способность, высокая доступность и гарантированная надежность | Производительность в реальном времени не так хороша, как у Redis |
| РЕДИС | Высокая производительность в режиме реального времени и простота реализации | Не гарантируется надежность |
| На основе ZooKeeper | Простота реализации | Низкая производительность записи, не подходит для частых сценариев записи |
Таблица 2: Сравнение схем реализации вещания
2.2 Архитектура системы
Общая архитектура шлюза показана на рисунке 1.
Рисунок 1: Архитектура шлюза постоянных соединений WebSocket
Общий процесс шлюза выглядит следующим образом:
1. Либо клиент, либо шлюзРукопожатие устанавливает долгосрочное соединение, и узел добавляет его в поддерживаемую памятью очередь долгосрочных соединений. Клиент регулярно отправляет сообщение сердцебиения на сервер.Если сердцебиение не получено по истечении установленного времени, считается, что длительное соединение между клиентом и сервером было разорвано, и сервер закроет соединение и очистит сессию. в памяти.
2. Когда бизнес-системе необходимо передать данные клиенту, данные, предоставленные шлюзом,HTTP-интерфейсОтправить данные на шлюз.
3. Получив push-запрос, шлюз записывает сообщение вRocketMQ.
4. Шлюз действует как потребительрежим трансляцииПотребляйте сообщение, все узлы получат сообщение.
5. После того, как узел получает сообщение, он определяет, находится ли нажатая цель сообщений в очереди длинного соединения, поддерживаемой в собственной памяти.Присутствие, толкать данные длинным подключением, в противном случае он напрямую игнорируется.
Шлюз формирует кластер в многоузловой манере.Каждый узел отвечает за часть длинного соединения, что может обеспечить балансировку нагрузки.При столкновении с большим количеством соединений он также может разделить нагрузку, добавляя узлы для достиженияРазвернуть по горизонтали.В то же время, когда узел не работает, клиент попытается обменяться рукопожатием с другими узлами, чтобы установить длительное соединение, чтобы обеспечить общую доступность службы.
2.3. Управление сессиями
После установления длительного соединения сессия сохраняется в памяти каждого узла.Компонент SessionManagerОтвечает за управление сеансами, внутренне используя хеш-таблицу для поддержания связи между UID и UserSession; UserSession представляет сеанс пользовательского измерения, пользователь может одновременно устанавливать несколько длинных соединений, поэтому UserSession также использует хеш-таблицу для внутреннего обслуживания канала иChannelSessionОтношение. Чтобы пользователи не могли создавать неограниченное количество длинных соединений,UserSessionКогда внутренний ChannelSession превышает определенное число, самый ранний установленный ChannelSession будет закрыт, чтобы уменьшить использование ресурсов сервера.Связь между SessionManager, UserSession и ChannelSessionкак показано на рисунке 2.
Рисунок 2: Компонент SessionManager
2.4. Мониторинг и тревога
Чтобы узнать, сколько длинных соединений установил кластер и сколько пользователей он содержит, шлюз предоставляет базовые возможности мониторинга и оповещения. Шлюз подключенмикрометр,Предоставьте количество подключений и пользователей в качестве пользовательских индикаторов для сбора Prometheus, реализуя связь с существующей системой мониторинга микросервисов. существуетGrafanaлегко просматривать вКоличество подключений, количество пользователей, JVM, ЦП, памятьи другие данные индикатора, чтобы понять текущую пропускную способность службы и нагрузку шлюза. В Grafana также можно настроить правила сигналов тревоги для запуска сигналов тревоги Qixin (внутренняя платформа сигналов тревоги) при ненормальных данных.
2.5 Производительность
Испытание под давлением выбирает две конфигурации в качестве4 ядра 16Gвиртуальные машины в качестве сервера и клиента соответственно. Выбрано, чтобы быть открытым для шлюза во время стресс-теста20 портов, при создании20 клиентов, каждый клиент использует порт сервера для установления 50 000 подключений и может создавать миллионы подключений одновременно. Количество подключений и использование памяти показано на рисунке 3.
Рисунок 3: Миллионы подключений
Отправьте сообщение миллионам длинных соединений одновременно, используя один поток для отправки, среднее время, затрачиваемое сервером на завершение отправки, равно10sвлево и вправо, как показано на рисунке 4.
Рисунок 4. Отнимающая много времени отправка сервера
Как правило, длинные соединения, установленные одним и тем же пользователем в одно и то же время, указываются однозначными числами. В качестве примера возьмем 10 длинных подключений, при условии параллелизма 600 и продолжительности 120 с, тест давления интерфейса будет запущен.TPSО1600+, как показано на рисунке 5.
Рис. 5. Данные измерения давления для 10 длинных соединений, 600 одновременных соединений и продолжительностью 120 с.
Текущие показатели эффективности соответствуют реальным бизнес-сценариям iQIYI и могут поддерживать будущий рост бизнеса.
3 Бизнес-кейс
Чтобы более наглядно проиллюстрировать эффект оптимизации, в конце статьи мы также возьмем пример добавления эффектов фильтра к изображению обложки, чтобы представить использование учетной записи iQIYI.Случай для вобора Websocket.
Люблю самооставленные медиа-видео, вы можете добавить крышку художественного искусства.Эффект фильтра, помогите пользователям обеспечить лучшее качество покрытия. Когда пользователь выбирает обложку, отправляется задача асинхронной фоновой обработки. После обработки асинхронной задачи изображения, обработанные различными эффектами фильтров, возвращаются в браузер через WebSocket.Бизнес-сценарий показан на рисунке 6.
Рисунок 6: Фильтр изображения обложки видео iQIYI\
С точки зрения эффективности НИОКР, если WebSocket интегрирован в бизнес-систему, это займет не менее 1-2 дней времени на разработку; если напрямую используются возможности шлюза для отправки данных, передача данных может быть реализована с помощью простого вызова интерфейса. , а время разработки сокращается до минутного уровня, значительно повышается эффективность НИОКР. отСтоимость эксплуатации и обслуживанияУчтите, что бизнес-система больше не содержит деталей связи, не связанных с бизнес-логикой, а кодболее ремонтопригодный,Архитектура системы упрощается, а стоимость эксплуатации и обслуживания значительно снижается.
4 в конце
В настоящее время WebSocket является основной технологией для реализации push-уведомлений на стороне сервера. Надлежащее использование может эффективно обеспечить быстродействие системы и улучшить взаимодействие с пользователем. Благодаря шлюзу длинных соединений WebSocket в систему можно быстро и эффективно добавить возможность передачи данных.Сокращение затрат на эксплуатацию и техническое обслуживание,Повысить эффективность разработки.
Значение долгосрочного шлюза подключенияв том, что он инкапсулируетдетали связи WebSocket,Отделение от бизнес-системы позволяет шлюзу с длительным соединением и бизнес-системе независимо оптимизировать и выполнять итерации, избегать повторяющихся разработок и облегчать разработку и обслуживание. Во-вторых, шлюз обеспечивает простой в использованииHTTP push-канал,Поддержка доступа к нескольким языкам разработки, что удобно для системной интеграции и использования. Кроме того,Шлюз использует распределенную архитектуру,Он может обеспечить горизонтальное расширение, балансировку нагрузки и высокую доступность услуг. Наконец,Шлюз объединяет мониторинг и сигнализацию,Когда система работает ненормально, она может вовремя предупредить, чтобы обеспечить работоспособность и стабильность службы.
\
В настоящее время,Шлюз WebSocket для длинных соединений применялся в нескольких бизнес-сценариях, таких как уведомление о результатах фильтрации изображений iQIYI и электронная подпись MCN.В будущем предстоит изучить еще много аспектов, таких как повторная передача сообщений и ACK, поддержка двоичных данных WebSocket, поддержка нескольких арендаторов и т. д. Мы продолжим оптимизировать и обогащать функции, чтобы сделать их более удобными для разработчиков.
Может быть, вы все еще хотите увидеть
iQIYI Knowledge WEB Практика компонентизации внешнего интерфейса\
Все данные могут быть настроены: практика проектирования работы зарубежной станции iQIYI\
Отсканируйте QR-код ниже, и вас будет сопровождать еще больше захватывающего контента!