Библиотека сайта rus-linux.net
От SocialCalc к EtherCalc
Глава 2 из книги "Производительность приложений с открытым исходным кодом".
Оригинал: From SocialCalc to EtherCalc
Автор: Audrey Tang
Перевод: А.Панин
Начальный прототип
Мы начали с создания сервера для протокола WebSocket с использованием Perl 5, причем данный сервер работал под управлением разработанного в рамках проекта Socilatext не использующего блокировки и основанного на библиотеке libev веб-сервера Feersum. Feersum является очень быстрым сервером, способным обрабатывать более 10000 запросов в секунду при использовании единственного ядра центрального процессора. Уровнем выше Feersum мы использовали промежуточный программный компонент PocketIO, позволяющий запускать популярный клиент под названием Socket.io на языке JavaScript, который предоставлял функции обратной совместимости для устаревших браузеров без поддержки протокола WebSocket.
Начальный прототип очень похож на сервер чата. Каждая сессия совместной работы является комнатой чата; клиенты отправляют данные о выполненных на своей стороне командах и перемещениях курсора серверу, который транслирует их всем остальным клиентам из этой же комнаты.
Приведенная ниже диаграмма отображает стандартный процесс выполнения операции.
Рисунок 2.3 - Прототип сервера с механизмом снимков
Описанное решение позволило снизить нагрузку на центральные процессоры новых клиентов, но создало проблему с производительностью сетевого соединения, так как в данном случае пропускная способность каждого из клиентских соединений имеет большое значение. В случае использования медленного соединения появляются задержки при приеме последующих команд от клиента.
Более того, у сервера не было возможности проверить согласованность переданных клиентами данных снимков. Таким образом, ошибочные или сформированные злоумышленником данные снимка могут привести к переходу в некорректный режим работы всех новых клиентов, рассинхроизировав их с существующими клиентами.
Мудрый читатель может заметить, что обе проблемы возникают из-за невозможности выполнения сервером команд электронных таблиц. В том случае, если бы сервер имел возможность изменять свое состояние при приеме каждой из команд, ему вообще не требовалось бы выполнять синхронизацию данных команд.
Работающая на стороне браузера система SocialCalc разработана с использованием языка JavaScript. Мы рассматривали вариант преобразования логики данной системы для использования вместе с существующим кодом на языке Perl, но такое решение требовало чрезмерных затрат ресурсов на поддержку двух кодовых баз. Мы также проводили эксперименты по интеграции интерпретаторов JavaScript (V8, SpiderMonkey), но они приводили к дополнительному снижению производительности в процессе их работы в рамках цикла обработки событий веб-сервера Feersum.
Наконец, в августе 2011 года, мы решили повторно разработать сервер с использованием фреймворка Node.js.
Продолжение статьи: Портирование для работы с Node.js.