как строить архитектуру для отказоустойчивой...

115
Как строить архитектуру для отказоустойчивой службы такси Минкин Андрей NambaTaxi

Upload: andrew-minkin

Post on 09-Jan-2017

11.375 views

Category:

Engineering


6 download

TRANSCRIPT

Page 1: как строить архитектуру для отказоустойчивой службы такси

Как строить архитектуру для отказоустойчивой службы таксиМинкин АндрейNambaTaxi

Page 2: как строить архитектуру для отказоустойчивой службы такси

Частник

Page 3: как строить архитектуру для отказоустойчивой службы такси

Диспетчерская служба

Page 4: как строить архитектуру для отказоустойчивой службы такси

Uber

Page 5: как строить архитектуру для отказоустойчивой службы такси

О нас• 300k довольных

клиентов • 600+ водителей на

линии• Не менее 8k заказов в

сутки

Page 6: как строить архитектуру для отказоустойчивой службы такси

Суточная нагрузка

5:00 6:00 7:00 8:00 9:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00 22:00 23:00 0:000

500

1000

1500

2000

2500

3000

3500

4000

Запросов в секунду

Page 7: как строить архитектуру для отказоустойчивой службы такси

AVG response time on backends• Водители - 20 ms• Операторы - 2.5 ms

Page 8: как строить архитектуру для отказоустойчивой службы такси

О чем доклад• Как строили

архитектуру• Как делали WebRTC

Page 9: как строить архитектуру для отказоустойчивой службы такси

Как все начиналось?

Page 10: как строить архитектуру для отказоустойчивой службы такси

Workflow на софте поставщика

Клиент Оператор Заказ

Водитель Принял заказ

Приехал на место

Забрал клиента

Привез клиента

Менеджер видит отчет

Page 11: как строить архитектуру для отказоустойчивой службы такси

Фичи софта поставщика• Call-центр• SMS оповещения• Автоматизация workflow• Много китайских

навигаторов (Shturmann, A500)

Page 12: как строить архитектуру для отказоустойчивой службы такси

Оповещения по SMS• Водитель принял заказ

на исполнение• Водитель приехал на

место

Page 13: как строить архитектуру для отказоустойчивой службы такси

Почему отказались• Нестабильная работа• Долгий даунтайм• Перестал

удовлетворять нашим требованиям роста и бизнеса

Page 14: как строить архитектуру для отказоустойчивой службы такси

Требования к системе• Минимум изменений в

workflow водителей и операторов

• Гибкость разработки и добавления новых фич

Page 15: как строить архитектуру для отказоустойчивой службы такси

• Водители должны остаться на навигаторах на WinCE

• Заложить поддержку Android для водителей

Page 16: как строить архитектуру для отказоустойчивой службы такси

• Реалтайм в операторской

• Работающая телефония• Возможность сразу

перейти на свое решение

Page 17: как строить архитектуру для отказоустойчивой службы такси

Ограничения• Цена на мобильный

интернет• Серверные ресурсы• Маленькая команда• Результат в

кратчайшие сроки

Page 18: как строить архитектуру для отказоустойчивой службы такси

Проектирование Web

Ядро

Операторы Водители

Менеджеры Платежи

Page 19: как строить архитектуру для отказоустойчивой службы такси

Что выбрали• Python/Django для Ядра• Redis для Publish/Subscribe• Node.js – событийный реалтайм

в операторской• Twisted – socket server для

водителей• Ruby для SMS• WebRTC для телефонии

Page 20: как строить архитектуру для отказоустойчивой службы такси

Почему так?• Ruby -> Ruby-smpp для

sms• Node.js -> socket.io для

реалтайма• Twisted – потому что

клевый

Page 21: как строить архитектуру для отказоустойчивой службы такси

Зачем sip через WebRTC• Open Source решение• Нет привязки к железу и ОС• Экономия рабочих мест в

офисе• Экономия на

коммутационном оборудовании

Page 22: как строить архитектуру для отказоустойчивой службы такси

Реализация

Django

Менеджеры Операторы Водители Платежи

Page 23: как строить архитектуру для отказоустойчивой службы такси

Водители

Навигатор Twisted Django+Redis

TwistedНавигатор

Page 24: как строить архитектуру для отказоустойчивой службы такси

SMS оповещения

Twisted Django

Ruby SMSSMSC

Page 25: как строить архитектуру для отказоустойчивой службы такси

SMS заказы

Клиент SMS SMSC

Ruby SMSDjango

Page 26: как строить архитектуру для отказоустойчивой службы такси

Операторская

Операторы

Заказы Телефония

Page 27: как строить архитектуру для отказоустойчивой службы такси

Операторская. Заказы

Page 28: как строить архитектуру для отказоустойчивой службы такси

МенеджерыDjango

Excel Browser

Percona

Page 29: как строить архитектуру для отказоустойчивой службы такси

Percona 5.5 HA• Master-slave replication• Virtual IP for Master

Page 30: как строить архитектуру для отказоустойчивой службы такси

Первая проверка• Проверили продукт в

реальных условиях• Стабилизировали

WebRTC

Page 31: как строить архитектуру для отказоустойчивой службы такси

Перевод бизнеса на свое решение

Page 32: как строить архитектуру для отказоустойчивой службы такси

Задача по переносу• Перенести 2 000

водителей• Перенести все

короткие смс номера• Перенести телефонию• Перенести 20

операторов

Page 33: как строить архитектуру для отказоустойчивой службы такси

• 7 дней• Техническая команда• Начальник

транспортного отдела• Начальник call центра

Page 34: как строить архитектуру для отказоустойчивой службы такси

Как выглядела операторская

Nginx

Ядро Node.js

Page 35: как строить архитектуру для отказоустойчивой службы такси

Как выглядели водители

TCP proxy Twisted

Page 36: как строить архитектуру для отказоустойчивой службы такси

Первые глаза• Sentry• Nagios• Collectd

Page 37: как строить архитектуру для отказоустойчивой службы такси

День 1

20

20

20

20

5

4

2

Операторы

День 7

День 6

День 5

День 4

День 3

День 2

День 1

2000

2000

1500

1000

500

250

100

Водители

Page 38: как строить архитектуру для отказоустойчивой службы такси

День 2

20

20

20

20

5

4

2

Операторы

День 7

День 6

День 5

День 4

День 3

День 2

День 1

2000

2000

1500

1000

500

250

100

Водители

Page 39: как строить архитектуру для отказоустойчивой службы такси

День 3

20

20

20

20

5

4

2

Операторы

День 7

День 6

День 5

День 4

День 3

День 2

День 1

2000

2000

1500

1000

500

250

100

Водители

Page 40: как строить архитектуру для отказоустойчивой службы такси

День 4

20

20

20

20

5

4

2

Операторы

День 7

День 6

День 5

День 4

День 3

День 2

День 1

2000

2000

1500

1000

500

250

100

Водители

Page 41: как строить архитектуру для отказоустойчивой службы такси

Performance проблемы водителей• Некоторые водители не

могут взять заказ• У некоторых водителей

не обновляется список заказов

Page 42: как строить архитектуру для отказоустойчивой службы такси

Причина• Socket timeout на

навигаторах• Twisted синхронный

Page 43: как строить архитектуру для отказоустойчивой службы такси

РешениеTCP proxy

Twisted1 Twisted2

Page 44: как строить архитектуру для отказоустойчивой службы такси

День 5

20

20

20

20

5

4

2

Операторы

День 7

День 6

День 5

День 4

День 3

День 2

День 1

2000

2000

1500

1000

500

250

100

Водители

Page 45: как строить архитектуру для отказоустойчивой службы такси

Проблемы операторов• Периодически не

обновляется список заказов

• Некоторые события не доходят до операторов

Page 46: как строить архитектуру для отказоустойчивой службы такси

Причина• Node.js не справляется

Page 47: как строить архитектуру для отказоустойчивой службы такси

Решение

Nginx

Node.js

node1 node2

Ядро

Page 48: как строить архитектуру для отказоустойчивой службы такси

День 6

20

20

20

20

5

4

2

Операторы

День 7

День 6

День 5

День 4

День 3

День 2

День 1

2000

2000

1500

1000

500

250

100

Водители

Page 49: как строить архитектуру для отказоустойчивой службы такси

День 6. Проблемы• У некоторых водителей

не обновляется список заказов

• У операторов медленно оформляются заказы

Page 50: как строить архитектуру для отказоустойчивой службы такси

Причина• Django не успевает

отвечать на запросы

Page 51: как строить архитектуру для отказоустойчивой службы такси

Выход

Page 52: как строить архитектуру для отказоустойчивой службы такси

Общее решение

Nginx

Node.js

node1 node2

Ядро

Django1 Django2

Page 53: как строить архитектуру для отказоустойчивой службы такси

Первая балансировка

Page 54: как строить архитектуру для отказоустойчивой службы такси

Но это не все

Series10

50

100

150

200

250

300

Node.js Bandwidth

Page 55: как строить архитектуру для отказоустойчивой службы такси

Выход• Socket.io -> surepost-

socket.io

Page 56: как строить архитектуру для отказоустойчивой службы такси

День 7• Все стабилизировалось

Page 57: как строить архитектуру для отказоустойчивой службы такси

Итог• -8% заказов за время

переезда• Время подачи машины

сократилось с 8 до 5 минут

Page 58: как строить архитектуру для отказоустойчивой службы такси

Ошибки на начальном этапе• Twisted синхронный• Вместо Nodejs erlang

или Python• Нагрузочные тесты не

из реального мира

Page 59: как строить архитектуру для отказоустойчивой службы такси

Начался рост заказов

0

1000

2000

3000

4000

5000

6000

7000

8000

9000

Page 60: как строить архитектуру для отказоустойчивой службы такси

Mobile Apps

Page 61: как строить архитектуру для отказоустойчивой службы такси

Архитектура после

Nginx

Ядро Node.js Apps

Page 62: как строить архитектуру для отказоустойчивой службы такси

Наблюдаем рост

Series10

1000

2000

3000

4000

5000

6000

7000

8000

9000

Chart Title

Заказы Пользователи приложений

Page 63: как строить архитектуру для отказоустойчивой службы такси

1 2 3 4 5 6 7 8 9 10 11 120

100

200

300

400

500

600

700

800

Водители на линии

Page 64: как строить архитектуру для отказоустойчивой службы такси

Проблемы роста• Подводит Синхронный

Twisted нас

Page 65: как строить архитектуру для отказоустойчивой службы такси

План действий• Используем Twisted

правильно• Сделать равномерную

балансировку• Построить HA под

шумок

Page 66: как строить архитектуру для отказоустойчивой службы такси

При этом• 1 сервер загруженнее

другого• 1 точка входа для

операторов, клиентов

Page 67: как строить архитектуру для отказоустойчивой службы такси

Series10

10

20

30

40

50

60

70

80

90

100

Chart Title

s1 s2

Page 68: как строить архитектуру для отказоустойчивой службы такси

Схема водителей на этот момент

Haproxy

Twisted1

Django1

Twisted2

Django2

Page 69: как строить архитектуру для отказоустойчивой службы такси

Nginx

Ядро Node.js Apps

Page 70: как строить архитектуру для отказоустойчивой службы такси

Nginx• 2 nginx с keepalived• DNS round robin

Page 71: как строить архитектуру для отказоустойчивой службы такси

HA для Nginx

Page 72: как строить архитектуру для отказоустойчивой службы такси

Разделяем workflow

Nginx

workflow

Django1

Master DB

Django2

reports

Django3

Slave Db

Django4

Page 73: как строить архитектуру для отказоустойчивой службы такси

Правильный Twisted• Async HTTP• Async Redis• Random upstream

Page 74: как строить архитектуру для отказоустойчивой службы такси

План

Twisted

nginx nginx

Page 75: как строить архитектуру для отказоустойчивой службы такси

Итог

Page 76: как строить архитектуру для отказоустойчивой службы такси

Что еще не HA• СМС демоны• Redis

Page 77: как строить архитектуру для отказоустойчивой службы такси

СМС демоны

Django SMSDaemon

SMSC

Page 78: как строить архитектуру для отказоустойчивой службы такси

Минусы• Много коннектов по TCP• Нет масштабируемости

Page 79: как строить архитектуру для отказоустойчивой службы такси

Выход• Redis pub/sub

Page 80: как строить архитектуру для отказоустойчивой службы такси

СМС демоны

Django Redis

SMS DaemonSMSC

Page 81: как строить архитектуру для отказоустойчивой службы такси

Профит• Persistent connect к redis• Publish/Subscribe • Масштабируемость

Page 82: как строить архитектуру для отказоустойчивой службы такси

Redis Failover

Page 83: как строить архитектуру для отказоустойчивой службы такси

Percona 5.6 HA• Master-Master (GTID)• Virtual IP for Master• Virtual IP for Slave• Master – write• Slave – read for reports

Page 84: как строить архитектуру для отказоустойчивой службы такси

Что получилось • Высоко

масштабируемый продукт

• Отказоуйстойчивый• С sip без flash

Page 85: как строить архитектуру для отказоустойчивой службы такси

Как сделали webrtc стабильным

Page 86: как строить архитектуру для отказоустойчивой службы такси

Первая реализацияsipML5

webrtc2sip

Провайдер

Page 87: как строить архитектуру для отказоустойчивой службы такси

Минусы• Не можем подключать

больше номеров• Не можем

балансировать исходящую связь

• 1 номер = 1 webrtc2sip

Page 88: как строить архитектуру для отказоустойчивой службы такси

Asterisk 11.5

sipml5 asterisk

GSM шлюз/провайдеры

Page 89: как строить архитектуру для отказоустойчивой службы такси

Плюсы• Можем подключать

новые номера• Можем балансировать

нагрузку• Получили полноценную

АТС

Page 90: как строить архитектуру для отказоустойчивой службы такси

Проблемы• Срывается звонок • Нет гудков • Нет правильной работы со

статусами прогресса SIP• Долгое время бриджа

аудио• Входящий звонок мог

крашнуть asterisk

Page 91: как строить архитектуру для отказоустойчивой службы такси

Asterisk 11.6

sipml asterisk

GSM шлюз/провайдеры

Page 92: как строить архитектуру для отказоустойчивой службы такси

Плюсы• Звонок не срывается• Asterisk не падает• Audio бриджуется

отлично

Page 93: как строить архитектуру для отказоустойчивой службы такси

Минусы• Нет гудков и

служебных ответов• Нет правильной работы

со статусами прогресса• Одностороннее аудио

Page 94: как строить архитектуру для отказоустойчивой службы такси

Sipml+webrtc2sip

sipml webrtc2sip

asteriskGSM шлюз/провайдеры

Page 95: как строить архитектуру для отказоустойчивой службы такси

Плюсы• Статусы работают• Есть гудки• Нет проблем с

односторонним аудио• Все работает

Page 96: как строить архитектуру для отказоустойчивой службы такси

Минусы• Рандомно крашится

Page 97: как строить архитектуру для отказоустойчивой службы такси

Почему не починили• Нет документации• Плохое качество кода

Page 98: как строить архитектуру для отказоустойчивой службы такси

FreeSWITCH

sipml5 FreeSWITCH

GSM шлюз/провайдеры

Page 99: как строить архитектуру для отказоустойчивой службы такси

Плюсы• Стабильно работает• Поддерживает webrtc

полностью• Все работает, но…

Page 100: как строить архитектуру для отказоустойчивой службы такси

Минусы• Нет гудков и

служебных ответов от операторов

Page 101: как строить архитектуру для отказоустойчивой службы такси

Решение• FreeSWITCH берет

трубку при исходящем звонке

Page 102: как строить архитектуру для отказоустойчивой службы такси

Проблемы• Звонок не больше 2х

минут из-за SipML5

Page 103: как строить архитектуру для отказоустойчивой службы такси

Выход• Sipml5 -> JSSIP

Page 104: как строить архитектуру для отказоустойчивой службы такси

Итог

jssip FreeSWITCH

GSM шлюз/провайдеры

Page 105: как строить архитектуру для отказоустойчивой службы такси

HA sip

Page 106: как строить архитектуру для отказоустойчивой службы такси

Начальная нагрузка• До 25k звонков в сутки

Page 107: как строить архитектуру для отказоустойчивой службы такси

Итоги проделанной работы• Сократили количество

звонков с 25к до 12к за счет автоматизации процессов и мобильных приложений

• Сократили 30% операторов• Увеличили количество

заказов на 40%

Page 108: как строить архитектуру для отказоустойчивой службы такси

Подводные камни• WebRTC• Отказоустойчивость• Concurrency

Page 109: как строить архитектуру для отказоустойчивой службы такси

Борьба с Concurrency• Redis -> setnx• Percona -> Atomic

transactions + select … for update

Page 110: как строить архитектуру для отказоустойчивой службы такси

Какие ошибки?• Не учли быстрого роста• Не было хорошей

балансировки

Page 111: как строить архитектуру для отказоустойчивой службы такси

Наши глаза• Nagios -> Sensu• Collectd -> Graphite• Newrelic -> Node.js• Cprofilemiddleware ->

Django• Opbeat -> Django

Page 112: как строить архитектуру для отказоустойчивой службы такси

Учебные тревоги• До 2х раз в неделю

проверяем отказоустойчивость любого сервиса

• До 2х раз в месяц перезагружаем любой физический сервер

Page 113: как строить архитектуру для отказоустойчивой службы такси

Выводы• Архитектура должна

подстраиваться под бизнес процессы

• Не надо бояться перестраивать архитектуру проекта

Page 114: как строить архитектуру для отказоустойчивой службы такси

Выводы• Разные workflow

большой системы не должны влиять друг на друга

• Хорошая архитектура растет вместе с вами

Page 115: как строить архитектуру для отказоустойчивой службы такси

Спасибо• Skype: gen1us2k• Habr: @gen1us2k