Содержание
- 2. Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность
- 3. О нас Mirantis делает проекты на заказ: Высокотехнологичные, иногда долгосрочные, для «топовых» заказчиков (Cisco, Mentor Graphics,
- 4. Что мы строим Очень тяжелые вычисления (но очень параллельные) Простой API – задача = поток подзадач:
- 5. Обычно (на суперкомпьютерах) используют: Это называется «batch scheduler»
- 6. Нам не подходит Они предполагают: Планировщик ничего не знает про задачу Просто выделяет ядра Задачи монолитны
- 7. Терминология Задача = поток задачек
- 8. Становятся возможными некоторые трюки для повышения утилизации. But this margin is too small…
- 9. Пример неудачной архитектуры Очевидно, single bottleneck – не масштабируется +балансировка нагрузки очень математически нестабильна Клиент 1
- 10. Более удачная архитектура Планировщик Слушает команды о запуске-останове задач Приказывает демонам обслуживать задачи Трубы (как очереди,
- 11. Пример Клиент – Планировщику: Создай задачу A, важность 30% Планировщик (выбирает несколько демонов) – демонам: Ты,
- 12. Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность
- 13. Трубы Как очереди Только шире, быстрее и неупорядоченные На основе RabbitMQ Лучший продукт в своем классе
- 14. Надежная доставка Цикл жизни демона: Получить задачку Посчитать Отослать ответик Подтвердить получение задачки Если помрет, RabbitMQ
- 15. Масштабирование Из коробки RabbitMQ совсем не подходит Одна очередь плохо тянет 10000 клиентов Встроенная кластеризация делает
- 16. Масштабирование Голова задачи (подбираются демонами) задачки Голова задачи ответики (отсылаются демонами) Демон выбирает случайного кролика и
- 17. Трудности Маленький лимит соединений у RabbitMQ под Windows (не потянет 500-1000 машин) Решено: каждая машина подключается
- 18. Сохранность данных при крахах RabbitMQ Client RabbitMQ Disk fsync fsync fsync 0..3 Publish confirmations Клиент буферизует
- 19. Не перегружать RabbitMQ Если слишком яро слать сообщения, RabbitMQ захлебнется (не успевая писать на диск) Тормоза,
- 20. Не перегружать RabbitMQ Оказывается, отличная метрика загрузки – число/размер неподтвержденных сообщений 4 задачи, 4 разноцветных кролика
- 21. Не перегружать RabbitMQ Ограничить число сообщений «в полете» На каждого кролика? Нет, тогда один медленный будет
- 22. Около 5000 ядер, 4 RabbitMQ Нет перегрузок – нет проблем
- 23. Поддерживать асинхронные прерывания Иногда надо всё бросить и заняться другой задачей Прервать запущенную задачку и кинуть
- 24. Переключаться между кроликами Задаче досталось несколько демонов. 3 подключены к rmq1, 1 к rmq2 Дисбаланс Голодание
- 25. Как это закодировать Можно сделать лапшу, делающую все сразу Реконнекты, подтверждения доставки, переключение, балансировка, асинхронные прерывания…
- 26. Как не сойти с ума Разумеется, слои*. *Паттерны Adapter, Composite etc, они же Combinator Library
- 27. Слои API проще некуда: Отсыльщик: Отослать Получить/сбросить список неподтвержденных Уничтожиться (возможно, асинхронно) Слушатель: Достать сейчас (blocking
- 28. Слои «При ошибке переоткрыться» «При ошибке попробовать еще раз» «При ошибке сделать то-то и то-то» «Преобразовать
- 29. Например По числу кроликов задачки ответики
- 30. Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность
- 31. Отладка и анализ Дебаггер – не вариант (только для локальных тестов) Где и когда произойдет ошибка
- 32. Пара фокусов в рукаве Мощный логгер Глобальная ось времени (точнее, чем NTP) Тянет сотни тысяч сообщений
- 33. Мы рисуем http://jkff.info/software/timeplotters/
- 34. http://jkff.info/software/timeplotters/
- 35. Что для этого нужно? Очень подробные логи. Еще об этом – позже.
- 36. Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность
- 37. Корректность: Главный принцип Как писать правильный код?
- 38. Корректность: Главный принцип Код точно неправильный. Как быть?
- 39. Как быть? Быть скромнее Дать себе шанс найти ошибку Минимизировать «ядро корректности» Минимизировать распространение ошибки Избегать
- 40. Быть скромнее Не думать «ничего, отладим» Это будет стоить вам увеличения времени разработки в разы Не
- 41. Цитаты в тему «Write the simplest thing that could possibly work» Ward Cunningham «Debugging is twice
- 42. Дать себе шанс найти ошибку Максимально подробные логи Не бывает «слишком много логов» Не бывает «от
- 43. Минимизировать «ядро корректности» Часть, от корректности которой зависит работоспособность системы. Веб-сервер: Неправильное вычисление в процессе обработки
- 44. Минимизировать распространение ошибки Расставлять «барьеры» До барьера – будь что будет После барьера верны некоторые свойства
- 45. Барьеры Уничтожение процесса (выполнение действия в отдельном процессе) Защищает от утечек ресурсов внутри процесса Периодический перезапуск
- 46. Избегать опасных приемов Изменяемое состояние Многопоточность Блокирование, синхронизация Обратная связь Редко выполняющийся код
- 47. Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность
- 48. Надежность Всё перезапускаемо и готово к перезапуску остальных Asynchronous one-way messaging (противоположность RPC) Явно формулировать переход
- 49. Перезапускаемость Если она есть: Можно перезапустить оборзевший процесс Можно навсегда забыть о редких крахах Можно перезапускать
- 50. Asynchronous, one-way messaging Противоположность RPC, прямое следствие из перезапускаемости. Лучше возложить ответственность за доставку сообщений на
- 51. Eventual consistency Стремление к согласованности
- 52. Eventual consistency Client RabbitMQ Disk fsync fsync fsync 0..3 Publish confirmations 4..5 6..7 Клиент и кролик
- 53. Eventual consistency Master Slave Хозяин и раб постепенно согласуют представление о том, чем рабу надо заниматься
- 54. Введение и Архитектура Доставка задач/результатов Отладка и анализ Обобщение опыта: корректность, надежность, производительность
- 55. Производительность Несколько аспектов: Стабильность под нагрузкой Пропускная способность Задержка
- 56. Главное Ресурсы конечны
- 57. Какие ресурсы конечны Вот что кончалось у нас: Соединения с RabbitMQ Erlang-процессы в RabbitMQ Cинхронные AMQP-операции
- 58. Мораль Планируйте потребление ресурсов Особенно таких, потребление которых растет с масштабом Особенно централизованных Центральные одноэкземплярные сервисы
- 59. Пропускная способность Избегайте обратной связи Из-за нее задержка начинает уменьшать пропускную способность Задержку оптимизировать гораздо труднее
- 61. Скачать презентацию