Это продолжение перевода «The Trello Tech Stack».
- Кофескрипт
- Клиент * Backbone.js * API истории HTML5. * Усы
- Отправка и опрос * Socket.io и WebSockets. * AJAX-запросы
- Сервер
* узел.
js *HAProxy * Редис * МонгоБД
- Итак, нам это нравится?
Сервер
Node.js
Серверная часть Trello основана на Node.js .Мы знали, что нам потребуются мгновенные обновления, а это означало сохранение большого количества открытых соединений, поэтому управляемый событиями неблокирующий сервер казался хорошим выбором.
Node.js также оказался отличным инструментом для создания прототипа одностраничного приложения.
Прототип сервера Trello на самом деле представлял собой простую библиотеку функций, обрабатывающую массивы моделей, расположенные в памяти одного процесса Node.js, а клиентское приложение просто вызывало эти функции с помощью небольшой оболочки WebSocket. Для нас это был самый быстрый способ начать использовать Trello и убедиться, что разработка движется в правильном направлении.
Мы использовали версию прототипа для управления разработкой Trello и остальных внутренних проектов Fog Creek. К тому времени, когда мы закончили прототип, у нас был достаточный опыт работы с Node.js, и мы были поражены его возможностями и производительностью.
Поэтому мы продолжили работу и сделали из нашего Трелло-Пиноккио настоящего мальчика, подарили ему:
- эта база данных и схема ( узел-mongodb-native И Мангуста )
- базовые веб-технологии, такие как маршруты и файлы cookie ( Выражать И Соединять )
- множество процессов на сервере без простоев при перезапуске [процессов] ( Кластер )
- межпроцессное взаимодействие (публикация/подписка) и обмен (совместное использование) структурными данными через Редис ( node_redis )
Огромное количество [и вложенность] обратных вызовов, которые вы вынуждены использовать, поначалу кажется проблемой, но через пару недель к этому привыкаешь.
Мы используем отличную библиотеку асинхронный (а также краткость кода, которую дает CoffeeScript), чтобы сохранить контроль над нашим кодом.
Есть и другие элегантные решения, но нам достаточно использовать async, поведение которого мы прекрасно понимаем.
HAProxy
Мы используем HAProxy для балансировки нагрузки между нашими веб-серверами.
Он распределяет TCP-соединения между серверами по круговому принципу, а остальное оставляет Node.js. Он сохраняет соединения открытыми достаточно долго, чтобы можно было использовать WebSockets и повторно использовать соединение для запросов AJAX.
Редис
Trello использует Redis для кратковременных данных, которые совместно используются серверными процессами, но не сохраняются на диск.Такие объекты, как уровень активности сеанса или временный ключ OpenID, хранятся в Redis, и приложение создано для нормального восстановления после частичной (или полной) потери этих данных.
Запускаем [Redis] с заданным ключом 'allkeys-lru' и рабочий набор как минимум в пять раз больше необходимого.
Таким образом Redis автоматически удаляет данные, которые долгое время не использовались, и восстанавливает их при необходимости.
Одним из наиболее интересных вариантов использования Redis является альтернативное использование коротких запросов при отправке изменений модели обратно в браузеры.
Когда объект изменяется на сервере, мы отправляем сообщение JSON всем соответствующим WebSockets для уведомления клиентов и сохраняем это сообщение в списке фиксированной длины для задействованной модели, отмечая, сколько сообщений было добавлено в этот список с течением времени.
Затем, когда клиент, использующий запросы AJAX [а не соединение WebSocket], пингует сервер на наличие обновлений с момента его последнего запроса, мы можем получить весь ответ сервера перед проверкой разрешений и, в большинстве случаев, проверкой одного значения Redis. Redis безумно быстр, настолько, что может обрабатывать тысячи таких проверок за секунду без существенного снижения производительности одного процессора.
Кроме того, Redis служит нашим сервером публикации/подписки, и мы используем его для распространения сообщений об изменении объекта от серверного процесса, который сделал первоначальный запрос, всем остальным серверным процессам.
После настройки сервера Redis вы начинаете использовать его для самых разных целей.
МонгоБД
МонгоБД удовлетворяет большинству наших запросов к базе данных.Мы хотели, чтобы [сервер] Trello был очень быстрым.
Одна из самых крутых и заботящихся о производительности команд, которую мы знаем, — это наш партнер, компания StackExchange, расположенная по соседству.
Однажды, общаясь за обедом с их ведущим разработчиком Дэвидом, я узнал, что, хотя они используют SQL-сервер для хранения данных, на самом деле они хранят много данных в денормализованной форме, чтобы повысить производительность, и нормализуют их только при необходимости.
Трелло сегодня.
В MongoDB мы отошли от возможностей реляционных баз данных (то есть случайных соединений) в пользу очень быстрой записи, более быстрого чтения в большинстве случаев и лучшей поддержки денормализованных данных — мы можем хранить свойства карты [элемент Trello ] в одном документе в базе данных и при этом иметь возможность запрашивать (и индексировать) вложенные поля документа.
Поскольку мы быстро росли, очень хорошо было иметь базу данных с производительностью, которая могла бы выдержать изрядное количество злоупотреблений с точки зрения чтения/записи.
Кроме того, MongoDB очень легко реплицировать, создавать резервные копии и восстанавливать (несмотря на Четырехквадратное фиаско ).
Еще одним преимуществом использования несвязанного репозитория документов является простота использования разных версий кода Trello с одной и той же базой данных без необходимости беспокоиться о миграции схемы базы данных.
Это имеет множество преимуществ при выпуске новой версии Trello — очень редко (если вообще когда-либо) возникает необходимость закрывать доступ к приложению, пока мы обновляем или заполняем базу данных.
Для разработки это тоже просто супер - когда вы используете hg bisect (или git bisect) для поиска ошибки в исходном коде и тестовой реляционной базы данных, то требуются дополнительные действия по откату или возврату базы данных к тестируемой версии ( или создайте новую базу данных с необходимыми полями).
Это может серьезно замедлить ход событий.
Итак, нам это нравится?
Нам нравится наш технологический стек.Как заметил Джоэл, мы потратили много сил на протяжении всей разработки, но я никогда не видел, чтобы команда создавала интересное приложение без кровопролития, связанного с инструментами и компонентами.
И не каждый может сказать, что ему очень нравится то, с чем он пришел к финишу.
Как и в большинстве приложений, здесь нет компонентов или деталей реализации, которые по своей сути необходимы.
Тем не менее, мы считаем, что это множество замечательных проектов с открытым исходным кодом ускорило нашу разработку, предоставило нам надежную и поддерживаемую базу кода, на основе которой можно двигаться вперед, и сделало Trello более отзывчивым и красивым приложением.
Спасибо всем, кто внес свой вклад в эти проекты, сейчас прекрасное время для того, чтобы стать программистом.
Звучит привлекательно? Попробуйте Трелло! Это бесплатно.
Все еще недостаточно разговоров? Здесь презентация Trello, который я сделал для недавних обсуждений.
Теги: #node.js #html5 #Trello #joel spolsky #node.js
-
Определение Класса Скорости Sd-Карты
19 Oct, 24 -
Доклады О Zend Framework На Phpconf 2009
19 Oct, 24