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

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

Jan 09, 2017

Download

Engineering

Andrew Minkin
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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