HighLoad.org – блог о высоких нагрузках
HighLoad.org > Plurk Comet: обработка 100,000+ открытых соединений

Plurk Comet: обработка 100,000+ открытых соединений
2010-03-02 03:58 my_fess 
Comet — слово, которое на слуху, прямо как Ajax, и даже еще немного больше. Суть Comet в том, что сервер может пушить новые данные клиенту как только они появились.
Я думаю, Comet сейчас является достаточно крутой штукой, которую все будут использовать, и этот тренд проглядывается в последних продуктах, например Google Wave, в котором Comet усиленно используется для реализации апдейтов в реальном времени. Plurk растет быстро и мы становимся одним из крупнейших сайтов написанных на Python в интернете. Мы обслуживаем параллельно много тысяч пользователей в день (100,000+), поэтому реализация Comet для Plurk — это большая задача и я потратил неделю на возню с различными решениями. Вот список технологий которые я попробовал:
  • Python Twisted: неблокирующий сервер на Python. К сожалению, он потребляет много CPU и не масштабируется.
  • Jetty: Заявляют, что это хорошее решение для Comet (и оно так и есть, если вам не нужно обслуживать 100,000 клиентов за раз). Jetty потребляет около 2GB оперативной памяти на 10,000 активных пользователей, и это неприемлемо для наших нужд.
  • Apache Tomcat: То же, что и Jetty. Потребляет кучу памяти. Поддерживает Comet соединения.
  • Apache Mina: NIO фреймворк (non-blocking IO/ неблокирующий ввод/вывод), который я использовал для построения HTTP-сервера. К сожалению, Mina очень плохо документирован и на деле оказалось, что он плохо масштабируется.
После того как я все это попробовал и выяснил, что они не подходят для обработки большой нагрузки, я почти был готов сдаться. Но потом я неожиданно наткнулся на спасение: JBoss Netty: NIO фреймворк, сделанный основателями Apache Mina. Netty не очень хорошо документирован, но он действительно хорошо спроектирован и после нескольких хаков производительность просто поражает.

Итоги

Используя Netty мы реализовали Comet работающий с 100,000+ открытыми соединениями — все это использует несколько GB оперативной памяти и 20% CPU на четырехъядерном сервере. Таким образом, мы решили задачу в 10 раз крупнее чем 10,000 одновременных клиентов (C10K) используя неблокирующую технологию и несколько очень впечатляющих библиотек (Java NIO и Netty). Передаю большой респект Trustin Lee за его потрясающую работу над Netty!

Автор статьи: amix Дата: 7 июня 2009 Оригинал статьи


комментарии [0]  | комментировать

  © 2010-2018 HIGHLOAD