highload2009 rybak badoo os
TRANSCRIPT
Open Source разработка в Badoo
Довгаль Антон, Нигматулин Андрей,Рыбак Алексей
Badoo.com
В этой презентации• Open Source в Badoo
• PHP-FPM: менеджер FastCGI процессов для PHP
• PINBA: сервер статистики для PHP-приложений
• Blitz: ещё один шаблонный движок для PHP
Badoo• dating network• 47 млн пользователей на сентябрь 2009• 17 языков• LNMP stack: linux, nginx, MySQL, PHP, С/C++• Почти вся OS-разработка – на C “вокруг” PHP• Маленькая команда• Наши OS-проекты направлены на достижение
удобства в эксплуатации, повышение управляемости, надёжности, производительности и снижение совокупной стоимости владения.
PHP-FPM• Менеджер FastCGI-процессов для
PHP
• Архитектура сервера напоминает nginx (master + N workers)
PHP-FPM: эксплуатация• Плавно обновляться, не теряя
соединения• Видеть все ошибки• Автоматически реагировать на
подозрительное поведение воркеров (выход, тормоза, массовые падения)
PHP-PFM: основные возможности• Плавный перезапуск/обновление кода• Мастер ловит stderr воркеров• Автоматический трейсинг и завершение
работы медленных воркеров• Аварийный перезапуск при массовом падении
воркеров
PHP-PFM: доп. возможности• Error header снимает проклятие пустой белой
страницы (200 OK на ошибку)• fastcgi_finish_request() – отдать output
клиенту, но продолжить работу (сессии, статистика и т.д.)
• Accelerated upload (поддержка request_body_file - nginx 0.5.9+)
PHP-FPM: развитие• 2004-2006: набор разрозненных патчей• 2007: один патч поверх PHP (5.3.0-0.5.12,
http://php-fpm.org)• 2009: проект отнимает массу времени, руководство
берёт Michael Shadle, http://launchpad.net/php-fpm• Groups: highload-php-(en|ru)@googlegroups.com• Вы будете смеяться, но мы тоже не знаем, когда FPM
войдет в PHP
PINBA• Сервер статистики для PHP-приложений• PHP Is Not Bottleneck Anymore• Какой-то попугай на одном из диалектов
языка австралийских аборигенов• http://pinba.org
Эксплуатация веб-кластера• Число запросов (полное, на сервер …)• Время ответа (среднее, распределение, по скриптам,
по серверам …)• Использование ресурсов (rusage)• Непрерывный мониторинг в реальном времени• Качество приложений - что меняется при релизах?
PINBA: архитектура• Клиентский модуль для PHP• Для любого запроса собираем script_name,
host, time, rusage …• При завершении отправляем UDP• И так со всех машин веб-кластера • Серверный тред внутри MySQL (v. 5.1.0+)• SQL-интерфейс ко всем данным
PINBA: данные• request: script_name, host, domain, time, rusage, mempeak, output
size, timers• timers: время + пары “ключ (тэг) – значение” • пример: (0.001 sec; {group => db::update, server => dbs42})• SQL: “сырые” данные или отчеты• Отчеты: отдельные таблицы, на лету• Базовые отчёты (~10): по системе, по скриптам, по хост+скрипт…• Отчеты по произвольным тегам (ENGINE=PINBA
COMMENT='report:foo,bar‘) => {script_name, foo_value, bar_value, count, time}
аварияпофиксили
Посмотрим внимательнее…
WTF?
Берём отчет по скриптам.
Периоды?... Это базы грузит регулярно запускаемый скрипт!
Имея «разрез» по тегам (что за операции, какие базы) – ещё быстрее найдем причину
Blitz• Ещё один движок шаблонов• Написан на C, модуль для PHP• Исторически – замена php_templates• Быстрый (нам очень важен CPU usage на веб-машинах)• Принуждает к разделению труда• Верстальщик ничего не программирует• Неожиданно удобен для мультиязычных проектов• http://alexeyrybak.com/blitz/blitz_en.html• В продакшене Badоo с 2006 года
Blitz:причина
PHP is awesome!
Blitz: дизайн (1/2)• View в MVC – это не шаблон!• View – это шаблон (только HTML + «разметка») и логика
отображения (PHP)• Исторически в Blitz шаблон и логика отображения были строго
разделены• Никакого совместного владения• Никаких “недопрограммистов”-верстальщиков• Минус: маргинален и неудобен одиночкам• За время жизни проекта по многочисленным заявкам пришлось-
таки добавлять логику в шаблоны• Нынче в Blitz есть условные операторы, инклюды, callbacks, et
cetera, но в Badoo нет ничего подобного
Blitz: дизайн (2/2)• Принцип напоминает XML/XSLT• Только всё значительно проще• Шаблон накладывается на данные• Переменная - скаляр• Список - массив• Вложенные блоки – структура с соответствующими именами ключей• Любая логика реализуема в этих прототипах• Мультиязычность: «чистый» шаблон – прегенерация шаблонов на всех
языках, без динамических подстановок• Мультиязычность: можно получить всю структуру итераций, сохранить
«снэпшот» и переводить страницы по «снэпшотам» (в контексте любой ситуации)