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

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

Upload: ontico

Post on 16-Apr-2017

1.447 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Как строить

архитектуру для

отказоустойчивой

службы такси Минкин Андрей

NambaTaxi

Page 2: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Частник

Page 3: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

Page 4: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Uber

Page 5: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

О нас

• 300k довольных клиентов

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

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

сутки

Page 6: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

0

500

1000

1500

2000

2500

3000

3500

4000

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:00

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

Page 7: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

AVG response time on

backends • Водители - 20 ms

• Операторы - 2.5 ms

Page 8: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

О чем доклад

• Как строили архитектуру

• Как делали WebRTC

Page 9: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

Page 10: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

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

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

заказ Приехал на

место

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

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

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

Page 11: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Фичи софта поставщика

• Call-центр

• SMS оповещения

• Автоматизация workflow

• Много китайских

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

A500)

Page 12: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Оповещения по SMS

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

исполнение

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

место

Page 13: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Почему отказались

• Нестабильная работа

• Долгий даунтайм

• Перестал удовлетворять

нашим требованиям роста

и бизнеса

Page 14: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Требования к системе

• Минимум изменений в

workflow водителей и

операторов

• Гибкость разработки и

добавления новых фич

Page 15: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

• Водители должны

остаться на навигаторах

на WinCE

• Заложить поддержку

Android для водителей

Page 16: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

• Работающая телефония

• Возможность сразу

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

Page 17: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Ограничения

• Цена на мобильный

интернет

• Серверные ресурсы

• Маленькая команда

• Результат в кратчайшие

сроки

Page 18: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

Ядро

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

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

Page 19: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Что выбрали

• Python/Django для Ядра

• Redis для Publish/Subscribe

• Node.js – событийный реалтайм в

операторской

• Twisted – socket server для

водителей

• Ruby для SMS

• WebRTC для телефонии

Page 20: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Почему так?

• Ruby -> Ruby-smpp для

sms

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

реалтайма

• Twisted – потому что

клевый

Page 21: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Зачем sip через WebRTC

• Open Source решение

• Нет привязки к железу и ОС

• Экономия рабочих мест в офисе

• Экономия на коммутационном

оборудовании

Page 22: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Реализация

Django

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

Page 23: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Водители

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

Twisted Навигатор

Page 24: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

SMS оповещения

Twisted Django

Ruby SMS SMSC

Page 25: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

SMS заказы

Клиент SMS SMSC

Ruby SMS Django

Page 26: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

Операторы

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

Page 27: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

Page 28: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Менеджеры

Django

Excel Browser

Percona

Page 29: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Percona 5.5 HA

• Master-slave replication

• Virtual IP for Master

Page 30: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Первая проверка

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

реальных условиях

• Стабилизировали

WebRTC

Page 31: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

решение

Page 32: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Задача по переносу

• Перенести 2 000

водителей

• Перенести все короткие

смс номера

• Перенести телефонию

• Перенести 20 операторов

Page 33: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

• 7 дней

• Техническая команда

• Начальник транспортного

отдела

• Начальник call центра

Page 34: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Как выглядела

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

Nginx

Ядро Node.js

Page 35: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

водители

TCP proxy Twisted

Page 36: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Первые глаза

• Sentry

• Nagios

• Collectd

Page 37: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

День 1

20

20

20

20

5

4

2

ОПЕРАТОРЫ

2000

2000

1500

1000

500

250

100

ДЕНЬ 7

ДЕНЬ 6

ДЕНЬ 5

ДЕНЬ 4

ДЕНЬ 3

ДЕНЬ 2

ДЕНЬ 1

ВОДИТЕЛИ

Page 38: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

День 2

20

20

20

20

5

4

2

ОПЕРАТОРЫ

2000

2000

1500

1000

500

250

100

ДЕНЬ 7

ДЕНЬ 6

ДЕНЬ 5

ДЕНЬ 4

ДЕНЬ 3

ДЕНЬ 2

ДЕНЬ 1

ВОДИТЕЛИ

Page 39: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

День 3

20

20

20

20

5

4

2

ОПЕРАТОРЫ

2000

2000

1500

1000

500

250

100

ДЕНЬ 7

ДЕНЬ 6

ДЕНЬ 5

ДЕНЬ 4

ДЕНЬ 3

ДЕНЬ 2

ДЕНЬ 1

ВОДИТЕЛИ

Page 40: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

День 4

20

20

20

20

5

4

2

ОПЕРАТОРЫ

2000

2000

1500

1000

500

250

100

ДЕНЬ 7

ДЕНЬ 6

ДЕНЬ 5

ДЕНЬ 4

ДЕНЬ 3

ДЕНЬ 2

ДЕНЬ 1

ВОДИТЕЛИ

Page 41: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Performance проблемы

водителей • Некоторые водители не

могут взять заказ

• У некоторых водителей не

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

заказов

Page 42: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Причина

• Socket timeout на

навигаторах

• Twisted синхронный

Page 43: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Решение

TCP proxy

Twisted1 Twisted2

Page 44: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

День 5

20

20

20

20

5

4

2

ОПЕРАТОРЫ

2000

2000

1500

1000

500

250

100

ДЕНЬ 7

ДЕНЬ 6

ДЕНЬ 5

ДЕНЬ 4

ДЕНЬ 3

ДЕНЬ 2

ДЕНЬ 1

ВОДИТЕЛИ

Page 45: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Проблемы операторов

• Периодически не

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

заказов

• Некоторые события не

доходят до операторов

Page 46: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Причина

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

Page 47: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Решение

Nginx

Node.js

node1 node2

Ядро

Page 48: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

День 6

20

20

20

20

5

4

2

ОПЕРАТОРЫ

2000

2000

1500

1000

500

250

100

ДЕНЬ 7

ДЕНЬ 6

ДЕНЬ 5

ДЕНЬ 4

ДЕНЬ 3

ДЕНЬ 2

ДЕНЬ 1

ВОДИТЕЛИ

Page 49: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

День 6. Проблемы

• У некоторых водителей

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

заказов

• У операторов медленно

оформляются заказы

Page 50: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Причина

• Django не успевает

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

Page 51: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Выход

Page 52: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

Nginx

Node.js

node1 node2

Ядро

Django1 Django2

Page 53: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

Page 54: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Но это не все

0

50

100

150

200

250

300

Node.js Bandwidth

Page 55: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Выход

• Socket.io -> surepost-

socket.io

Page 56: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

День 7

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

Page 57: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Итог

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

переезда

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

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

Page 58: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Ошибки на начальном этапе

• Twisted синхронный

• Вместо Nodejs erlang или

Python

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

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

Page 59: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

0

1000

2000

3000

4000

5000

6000

7000

8000

9000

Page 60: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Mobile Apps

Page 61: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

Nginx

Ядро Node.js Apps

Page 62: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

0

1000

2000

3000

4000

5000

6000

7000

8000

9000

Название диаграммы

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

Page 63: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)
Page 64: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Проблемы роста

• Подводит Синхронный

Twisted нас

Page 65: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

План действий

• Используем Twisted

правильно

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

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

• Построить HA под шумок

Page 66: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

При этом

• 1 сервер загруженнее

другого

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

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

Page 67: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

0

10

20

30

40

50

60

70

80

90

100

Название диаграммы

s1 s2

Page 68: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

этот момент

Haproxy

Twisted1

Django1

Twisted2

Django2

Page 69: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Nginx

Ядро Node.js Apps

Page 70: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Nginx

• 2 nginx с keepalived

• DNS round robin

Page 71: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

HA для Nginx

Page 72: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Разделяем workflow

Nginx

workflow

Django1

Master DB

Django2

reports

Django3

Slave Db

Django4

Page 73: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Правильный Twisted

• Async HTTP

• Async Redis

• Random upstream

Page 74: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

План

Twisted

nginx nginx

Page 75: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Итог

Page 76: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Что еще не HA

• СМС демоны

• Redis

Page 77: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

СМС демоны

Django SMSDaemon

SMSC

Page 78: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Минусы

• Много коннектов по TCP

• Нет масштабируемости

Page 79: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Выход

• Redis pub/sub

Page 80: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

СМС демоны

Django Redis

SMS Daemon

SMSC

Page 81: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Профит

• Persistent connect к redis

• Publish/Subscribe

• Масштабируемость

Page 82: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Redis Failover

Page 83: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Percona 5.6 HA

• Master-Master (GTID)

• Virtual IP for Master

• Virtual IP for Slave

• Master – write

• Slave – read for reports

Page 84: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Что получилось

• Высоко масштабируемый

продукт

• Отказоуйстойчивый

• С sip без flash

Page 85: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Как сделали webrtc

стабильным

Page 86: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

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

sipML5

webrtc2sip

Провайдер

Page 87: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Минусы

• Не можем подключать

больше номеров

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

исходящую связь

• 1 номер = 1 webrtc2sip

Page 88: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Asterisk 11.5

sipml5 asterisk

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

Page 89: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Плюсы

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

номера

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

нагрузку

• Получили полноценную

АТС

Page 90: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Проблемы

• Срывается звонок

• Нет гудков

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

статусами прогресса SIP

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

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

крашнуть asterisk

Page 91: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Asterisk 11.6

sipml asterisk

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

Page 92: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Плюсы

• Звонок не срывается

• Asterisk не падает

• Audio бриджуется отлично

Page 93: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Минусы

• Нет гудков и служебных

ответов

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

статусами прогресса

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

Page 94: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Sipml+webrtc2sip

sipml webrtc2sip

asterisk GSM

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

Page 95: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Плюсы

• Статусы работают

• Есть гудки

• Нет проблем с

односторонним аудио

• Все работает

Page 96: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Минусы

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

Page 97: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Почему не починили

• Нет документации

• Плохое качество кода

Page 98: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

FreeSWITCH

sipml5 FreeSWITCH

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

Page 99: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Плюсы

• Стабильно работает

• Поддерживает webrtc

полностью

• Все работает, но…

Page 100: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Минусы

• Нет гудков и служебных

ответов от операторов

Page 101: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Решение

• FreeSWITCH берет трубку

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

Page 102: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Проблемы

• Звонок не больше 2х

минут из-за SipML5

Page 103: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Выход

• Sipml5 -> JSSIP

Page 104: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Итог

jssip FreeSWITCH

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

Page 105: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

HA sip

Page 106: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Начальная нагрузка

• До 25k звонков в сутки

Page 107: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Итоги проделанной работы

• Сократили количество

звонков с 25к до 12к за счет

автоматизации процессов и

мобильных приложений

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

• Увеличили количество

заказов на 40%

Page 108: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Подводные камни

• WebRTC

• Отказоустойчивость

• Concurrency

Page 109: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Борьба с Concurrency

• Redis -> setnx

• Percona -> Atomic

transactions + select … for

update

Page 110: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Какие ошибки?

• Не учли быстрого роста

• Не было хорошей

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

Page 111: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Наши глаза

• Nagios -> Sensu

• Collectd -> Graphite

• Newrelic -> Node.js

• Cprofilemiddleware ->

Django

• Opbeat -> Django

Page 112: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Учебные тревоги

• До 2х раз в неделю

проверяем

отказоустойчивость

любого сервиса

• До 2х раз в месяц

перезагружаем любой

физический сервер

Page 113: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Выводы

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

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

процессы

• Не надо бояться

перестраивать

архитектуру проекта

Page 114: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Выводы

• Разные workflow большой

системы не должны

влиять друг на друга

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

растет вместе с вами

Page 115: Как строить архитектуру для отказоустойчивой службы такси / Минкин Андрей (Namba Taxi)

Спасибо

• Skype: gen1us2k

• Habr: @gen1us2k