История проекта, который никогда не падает / Андрей...

50
История проекта, который никогда не падает Андрей Шетухин

Upload: ontico

Post on 26-Jun-2015

576 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: История проекта, который никогда не падает / Андрей Шетухин

История проекта, который никогда не падает

Андрей Шетухин

Page 2: История проекта, который никогда не падает / Андрей Шетухин

О докладчике

http://slonik-v-domene.livejournal.com

http://stellar.moikrug.ru

Page 3: История проекта, который никогда не падает / Андрей Шетухин

Тема доклада

Разработка онлайн-игры для Facebook

Выбор новых технологий

Как понять, что дела идут скверно

Что делать, когда проект не работает

Как не делать так, чтобы проект не работал

На что обратить внимание после запуска

Page 4: История проекта, который никогда не падает / Андрей Шетухин

Начало

Page 5: История проекта, который никогда не падает / Андрей Шетухин

Мы, молодая, амбициозная команда,..

Page 6: История проекта, который никогда не падает / Андрей Шетухин

...хотим написать игру для Facebook

Page 7: История проекта, который никогда не падает / Андрей Шетухин
Page 8: История проекта, который никогда не падает / Андрей Шетухин
Page 9: История проекта, который никогда не падает / Андрей Шетухин

Средняя игра для Facebook, это:

100 000+ пользователей

10 000 игроков онлайн

3 - 5 тысяч запросов в секунду

Page 10: История проекта, который никогда не падает / Андрей Шетухин

А еще у нас жестко со сроками:

Два месяца до сдачи прототипа

Три месяца до запуска в тестирование

Четыре месяца до первых пользователей

Полгода — до продакшена

Page 11: История проекта, который никогда не падает / Андрей Шетухин

Выбор технологий

Пишем сервис с нуля, а значит можно выбрать все самое передовое и интересное

Проблем с идеями нет — спасибо Slideshare, конференциям и Opennet

Всегда интересно разобраться с новой технологией и получить опыт

Мы ничем не хуже других: если у них работает, то и у нас тоже все получится

Page 12: История проекта, который никогда не падает / Андрей Шетухин

Ведущий разработчик слышал, что:

ZeroMQ — очередь сообщений которая выглядит как BSD-сокеты с гарантией доставки данных

Mongrel — вебсервер-транслятор HTTP в ZeroMQ и обратно

Google Protobuf — универсальный сериализатор данных

Google Logger — отличное решение для ведения логов

Page 13: История проекта, который никогда не падает / Андрей Шетухин

Ведущий разработчик не знал, что:

ZeroMQ имеет ряд существенных отличий от BSD-сокетов

Библиотека C++ для Mongrel нигде толком не использовалась

Сериализация в Google Protobuf требует CPU

Google Logger вызывает НЕНАВИСТЬ у сисадминов

Page 14: История проекта, который никогда не падает / Андрей Шетухин

Началось проектирование

Для проверки идеи написали однопоточный сервер на ZeroMQ, пример кода взяли из руководства

От чтения примера до запуска — всего 15 минут!

Затем прикрутили пару функций бизнес-логики

Проверили — все работает (на одном онлайн-пользователе)

Page 15: История проекта, который никогда не падает / Андрей Шетухин

Общая идея

Page 16: История проекта, который никогда не падает / Андрей Шетухин

Развитие идеи

Нам нужен один игровой сервер (лучше - два), а еще — сервер сессий, кэш для БД и балансировщик запросов

Взаимодействие систем построим через Google Protobuf

Клиентами будут Flash (со своим протоколом обмена) и jQuery/REST

Page 17: История проекта, который никогда не падает / Андрей Шетухин
Page 18: История проекта, который никогда не падает / Андрей Шетухин

В теории все отлично, но есть одно «но»...

Page 19: История проекта, который никогда не падает / Андрей Шетухин

…или даже не одно...

Page 20: История проекта, который никогда не падает / Андрей Шетухин

Но мы — команда,а значит — справимся!

Page 21: История проекта, который никогда не падает / Андрей Шетухин

Mongrel

Версия 1.7.5 еще не работает, а версия 1.8.0 уже не работает с C++ клиентом

Автор C++ клиента уехал в Тибет искать Шамбалу

Из версий 1.7.5, 1.8.0 и своих патчей собираем рабочий Mongrel

Патчим С++ клиент

Проверяем — вроде, работает

Page 22: История проекта, который никогда не падает / Андрей Шетухин

Protobuf

• Для каждой функции игры надо писать сериализатор из протокола Flash в Protobuf и обратно

• Таких функций десятки уже сейчас, а в будущем их будут сотни

• Структуры Protobuf не имеют механизмов наследования и версионирования

• Сериализация обходится дорого по CPU и потому мало пригодна для однопоточных серверов

Page 23: История проекта, который никогда не падает / Андрей Шетухин

Готовим прототип к запуску

Геймсервер

Сервер сессий

Прокси-кэш для БД

C++ клиент для Mongrel, он же — балансировщик

Mongrel

Сервер статики - nginx

Page 24: История проекта, который никогда не падает / Андрей Шетухин

Запуск

Почему-то всё заметно тормозит уже на 10 пользователях

Падение одного сервиса лечится только рестартом всей системы

При этом при падении одного сервиса виснет вообще всё

Иногда система не стартует вовсе

Обсчет игр 40 онлайн-пользователей занимает до 30% CPU сервера

Page 25: История проекта, который никогда не падает / Андрей Шетухин
Page 26: История проекта, который никогда не падает / Андрей Шетухин

Причины

ZeroMQ гарантирует доставку, поэтому то, что не доставилось при падении сервиса, доставится при рестарте. И сервис упадет еще раз.

ZeroMQ требует двустороннего взаимодействия: нельзя не ответить на запрос. Поэтому клиент упавшего сервиса виснет в ожидании ответа.

Page 27: История проекта, который никогда не падает / Андрей Шетухин

У каждой проблемы есть простое, очевидное для

всехи при этом

неправильноерешение.

Page 28: История проекта, который никогда не падает / Андрей Шетухин

«Решение»

Раз однопоточные сервисы не масштабируются, сделаем их многопоточными

Рестартовать всё будем при помощи скриптов и в четкой последовательности

Купим еще серверов

Напишем миллион правил Nginx для REST

Page 29: История проекта, который никогда не падает / Андрей Шетухин

Что-то забыли?

ZeroMQ — не BSD-сокеты (хотя и очень похоже), и в многопоточной среде ведет себя иначе

А еще у ZeroMQ есть странные проблемы с таймаутами и IPv6

Перезапуск в строго заданной последовательности сервисов на разных серверах очень плохо автоматизируется

Миллион правил Nginx для REST сложно поддерживать

Page 30: История проекта, который никогда не падает / Андрей Шетухин

Внимание, вопрос:

Page 31: История проекта, который никогда не падает / Андрей Шетухин

— Знали ли разработчики об этих проблемах при

выборе технологии?

Page 32: История проекта, который никогда не падает / Андрей Шетухин

— Конечно, нет!

Page 33: История проекта, который никогда не падает / Андрей Шетухин

Почему?

Потому, что на конференциях, в докладах и на сайтах разработчиков — сплошные success stories.

А описание проблем — это списки рассылки, багтрекеры и личная переписка.

И пока не столкнешься с проблемами, подводная часть айсберга не видна. Особенно, если у команды нет опыта работы с данной технологией

Page 34: История проекта, который никогда не падает / Андрей Шетухин

Внезапно!!!

Page 35: История проекта, который никогда не падает / Андрей Шетухин

Случился Дедлайн

Времени «выкинуть все и переписать с нуля» нет

Поэтому запускаемся «как есть», нагрузка небольшая

Сразу после запуска — ревью всего проекта

Page 36: История проекта, который никогда не падает / Андрей Шетухин

Проект не работает, что делать?

Ищем проблемные места

Оцениваем стоимость переделок

Оцениваем риски

Планируем последовательность переделок

Перезапускаем сервисы

Page 37: История проекта, который никогда не падает / Андрей Шетухин

Переделки

Вместо Mongrel и однопоточного балансировщика будет проверенная и знакомая разработчикам технология

Заменяем REST на JSON-RPC и убираем миллион правил Nginx

Пишем врапперы к ZeroMQ для замены на BSD-сокеты. Шедулер — проверенный и работающий libev

Protobuf оставляем — слишком дорого менять

Логгер будет системный (syslog)

Page 38: История проекта, который никогда не падает / Андрей Шетухин

Результат

Вместо неизвестных технологий используются простые и понятные

Сервисы можно рестартовать отдельно и в любой последовательности

Система масштабируется на большое количество серверов

Тем не менее, в проекте остались плохие решения

Page 39: История проекта, который никогда не падает / Андрей Шетухин
Page 40: История проекта, который никогда не падает / Андрей Шетухин

— Можно ли было сделать лучше?

Page 41: История проекта, который никогда не падает / Андрей Шетухин

— Да, но...

Page 42: История проекта, который никогда не падает / Андрей Шетухин

Если бы:

Было больше времени на проектирование и рефакторинг

Проект еще не вышел в предпродакшен

Не было других задач

И т. д., и т. п...

Page 43: История проекта, который никогда не падает / Андрей Шетухин

В итоге:

По сравнению с тем, что было, стало лучше

Однако, определенные проблемы остались, и, видимо, исправить их полностью не получится

Тем не менее, проект запущен и работает

Page 44: История проекта, который никогда не падает / Андрей Шетухин

Выводы

Page 45: История проекта, который никогда не падает / Андрей Шетухин

Плохо:

«Я где-то слышал об этой технологии»

«Прототип написали по учебнику за 15 минут, весь проект займет неделю»

«Нет проблем за ночь пропатчить основной компонент»

«Разберемся по ходу дела»

«На одном пользователе все работает»

«Я сам буду учить новичков»

Page 46: История проекта, который никогда не падает / Андрей Шетухин

Хорошо

Команда продолжительное работала с этой технологией

Нет проблем найти специалистов

Мы знаем, как растет нагрузка от числа онлайн-пользователей

Новички сами учатся, не отвлекая ведущих разработчиков

Page 47: История проекта, который никогда не падает / Андрей Шетухин

Менеджер, помни!

Новые технологии — хорошо, неизвестные технологии — плохо.

Скорость разработки прототипа к скорости разработки проекта не имеет практически никакого отношения.

Сначала — архитектура всей системы, затем — частности

Нет плана деплоймента — нет проекта

Page 48: История проекта, который никогда не падает / Андрей Шетухин

Тимлид, знай!

Реклама может нести заведомо ложную информацию или показывать только положительные стороны технологии

«Тестирование» «прототипа» на одном пользователе на своем десктопе — не тестирование вовсе. И это — не прототип

Невозможно одновременно учить новичков и писать код

Всегда надо закладывать время на непредвиденные проблемы

Page 49: История проекта, который никогда не падает / Андрей Шетухин

Разработчик, будь готов к:

Ошибкам в выборе технологии

Переписыванию проекта под нагрузкой

К тому, что зачастую единственный результат — знание, как не надо делать и что технология вам не подходит

Page 50: История проекта, который никогда не падает / Андрей Шетухин

Вопросы?