Рост с нуля до 15000 сообщений в
секунду. Мучительный и
поучительный
Юрий Колесов
http://security-gu.ru
security-guru@mail.ru
+7 (926) 55-99-824
https://www.facebook.com/yuri.v.kolesov
TIM-CONNECT
Процессит банковские SMS-уведомления, по
возможности отправляя их как PUSH
Принимаем по SMPP (Short message Peer-to-Peer),
отправляем по SMPP и PUSH (APNS, GCM, MPNS)
SMPP — C daemon. PUSH, API — python.
TIM-CONNECT
Процессит банковские SMS-уведомления, по
возможности отправляя их как PUSH
Принимаем по SMPP (Short message Peer-to-Peer),
отправляем по SMPP и PUSH (APNS, GCM, MPNS)
SMPP — C daemon. PUSH, API — python.
Задача: показать процессинг 15000 sms/sec
Срок: 2 месяца
TIM-CONNECT
Процессит банковские SMS-уведомления, по
возможности отправляя их как PUSH
Принимаем по SMPP (Short message Peer-to-Peer),
отправляем по SMPP и PUSH (APNS, GCM, MPNS)
SMPP — C daemon. PUSH, API — python.
Задача: показать процессинг 15000 sms/sec
Срок: 2 месяца
Что уже было
Что уже было
● Оптимизировали SMPP демоны
(многопоточные, внутренние очереди, блочная
работа с БД)
Что уже было
● Оптимизировали SMPP демоны
(многопоточные, внутренние очереди, блочная
работа с БД)
● Разделили БД на две: очередь и архив
Что уже было
● Оптимизировали SMPP-демоны
(многопоточные, внутренние очереди, блочная
работа с БД)
● Разделили БД на две: очередь и архив
● Монолит разделили на:
– mobile API
– ЛК
– PUSH
640k ought to be enough for
anybody
(C) Bill Gates 1981
Требования
● Минимальные сроки (уложиться до deadline)
Требования
● Минимальные сроки (уложиться до deadline)
● Ограниченные ресурсы
Требования
● Минимальные сроки (уложиться до deadline)
● Ограниченные ресурсы
● Количественно определенные цели
Оценить
● Достижимость
Оценить
● Достижимость
● Трудоемкость
Оценить
● Достижимость
● Трудоемкость
● Скейлинг
Тестирование
● Все сценарии
● Релевантный набор данных
Тестирование
● Все сценарии
● Релевантный набор данных
– Быстро начать!
– Тестируем на том, что есть
Тестирование
● Все сценарии
● Релевантный набор данных
– Быстро начать!
– Тестируем на том, что есть
● Генераторы и приемники нагрузки
php-fpm vs.
uwsgi+python
На python rps в
два раза больше
Результаты тестирования
Single instance:
● 3500 sms/sec по SMPP
Результаты тестирования
Single instance:
● 3500 sms/sec по SMPP
● 1000 sms/sec по PUSH
Результаты тестирования
Single instance:
● 3500 sms/sec по SMPP
● 1000 sms/sec по PUSH
Тестируем компоненты
Тестируем компоненты
● SMPP (5000/sec)
Тестируем компоненты
● SMPP (5000/sec)
● БД
Тестируем компоненты
● SMPP (5000/sec)
● БД
– Очередь (3500/sec)
Тестируем компоненты
● SMPP (5000/sec)
● БД
– Очередь (3500/sec)
– Архив (14000/sec)
Тестируем компоненты
● SMPP (5000/sec)
● БД
– Очередь (3500/sec)
– Архив (14000/sec)
● Mobile API (4000/sec)
Тестируем компоненты
● SMPP (5000/sec)
● БД
– Очередь (3500/sec)
– Архив (14000/sec)
● Mobile API (4000/sec)
● PUSH (1000/sec)
Идеи
Идеи
● Tuning (достигли 15000/sec в архиве и 4000 в
очереди)
Идеи
● Tuning (достигли 15000/sec в архиве и 4000 в
очереди)
● ENGINE=memory
Идеи
● Tuning (достигли 15000/sec в архиве и 4000 в
очереди)
● ENGINE=memory
● Master-Master
Идеи
● Tuning (достигли 15000/sec в архиве и 4000 в
очереди)
● ENGINE=memory
● Master-Master
● TokuDB
Идеи
● Tuning (достигли 15000/sec в архиве и 4000 в
очереди)
● ENGINE=memory
● Master-Master
● TokuDB
● Перенос в redis
Идеи
● Tuning (достигли 15000/sec в архиве и 4000 в
очереди)
● ENGINE=memory
● Master-Master
● TokuDB
● Перенос в redis
Шардинг?!
Шардинг очереди
● Ключ
– Равномерность распределения данных и
обращений к шардам
Шардинг очереди
● Ключ
– Равномерность распределения данных и
обращений к шардам
– Участвует во всех нужных выборках
Идеи
● Разделить APNS, MPNS, GCM
Идеи
● Разделить APNS, MPNS, GCM
● Шардим по номеру телефона
Идеи
● Разделить APNS, MPNS, GCM
● Шардим по номеру телефона
Грабли
● Номер телефона не присутствует в вызовах API
Идеи
● Разделить APNS, MPNS, GCM
● Шардим по номеру телефона
Грабли
● Номер телефона не присутствует в вызовах API
● Выборки ЛК требуют обращения ко всем
шардам
Идеи
● Разделить APNS, MPNS, GCM
● Шардим по номеру телефона
Грабли
● Номер телефона не присутствует в вызовах API
● Выборки ЛК требуют обращения ко всем
шардам
Бонус
● По API проблема решена
PUSH
Технический долг догоняет (
PUSH
Технический долг догоняет (
Идеи
● Добавить воркеров
PUSH
Технический долг догоняет (
Идеи
● Добавить воркеров
● Разделение APNS/GCM/MPNS
PUSH
Технический долг догоняет (
Идеи
● Добавить воркеров
● Разделение APNS/GCM/MPNS
● Python 3.5 async/await
Итоговый конфиг
● Архивная БД + ЛК
● Процессинг (x4, 4000/sec каждый)
– Очередь
– SMPP
– API
– PUSH
16000+/сек по результатам тестирования
4000x4 не всегда 16000
Выводы
● Планируйте архитектуру, потом оптимизируйте
код
Выводы
● Планируйте архитектуру, потом оптимизируйте
код
● Контролируйте технический долг
Выводы
● Планируйте архитектуру, потом оптимизируйте
код
● Контролируйте технический долг
● Тестируйте, чтобы знать свои пределы
Выводы
● Планируйте архитектуру, потом оптимизируйте
код
● Контролируйте технический долг
● Тестируйте, чтобы знать свои пределы
● Масштабирование всегда ступенчатое
Выводы
● Планируйте архитектуру, потом оптимизируйте
код
● Контролируйте технический долг
● Тестируйте, чтобы знать свои пределы
● Масштабирование всегда ступенчатое
● Простые варианты вперед
Выводы
● Планируйте архитектуру, потом оптимизируйте
код
● Контролируйте технический долг
● Тестируйте, чтобы знать свои пределы
● Масштабирование всегда ступенчатое
● Простые варианты вперед
● Хайлоад — быстро и несложно. Но не всегда)
Вопросы?
Юрий Колесов
http://security-gu.ru
security-guru@mail.ru
+7 (926) 55-99-824
https://facebook.com/yuri.v.kolesov

Рост с нуля до 15000 сообщений в секунду. Мучительный и поучительный / Юрий Колесов (security-gu.ru)