SlideShare a Scribd company logo
gRPC в продакшне
Минкин Андрей. Mad Devs
Кто я?
• Системный администратор 7+ лет
• Python 5+ лет
• Go последние 3 года
Про что доклад
Как все начиналось
• Служба такси
• Водительское приложение
• Много хотелок
• Много технического долга
• Невозможность поддержки
• Пройденная точка невозврата
Как оно работало
• Client-server
• На TCP сокетах
• Poll модель
Чего хотелось бы
• Больше фич
• Рассылки с сервера
• Единый протокол
Смена протокола
• Избавиться от текущих костылей (TCP+UDP)
• Избавиться от костыльной сериализации
• Убить последний питон на серверах (почти)
Что рассматривали?
• MQTT
• UDP+велосипеды и вариации(QUIC, uTP)
• gRPC
Чем не подошли MQTT/QUIC/UDP
• Много ручной работы
• Нужно писать брокер
• Сложно договориться о дизайне на берегу
Что такое gRPC
• Protocol Buffers
• Design first
• HTTP/2
• Двунаправленный стриминг
• Мультиплексинг
• HTTPS
• Множество языков
C/C++
Почему мы выбрали gRPC?
• Design first
• Генерация кода
• Относительно легковестно по трафику
• HTTP/2 streaming + fallback
Подробнее тут
• Документация и код
• http://www.grpc.io
• https://github.com/grpc
• https://github.com/grpc-ecosystem
• Помощь и поддержка
• https://gitter.im/grpc/grpc
• https://groups.google.com/forum/#!forum/grpc-io
Архитектура до
Водитель Twisted Django+redis
TwistedВодитель
Storage
• Redis
• Percona server for MySQL
Первое решение
• 1 стрим – 1 канал
• Храним все в map
• Клиент для HTTP API
• Свой storage
• Pub/sub в Redis на уровне приложения
Show me the code
func (a *API) Orders(in *empty.Empty, stream
pb.Foreman_OrdersServer) error {
ctx := stream.Context()
user, ok := user.FromContext(ctx)
if !ok {
return grpc.Errorf(codes.Unauthenticated, "user not
found")
}
OrdersChan := pubsub.AddOrderReader(user.CabNumber)
defer pubsub.LeaveOrderReader(user.CabNumber, OrdersChan)
// ..
}
type OrderSubscriber struct {
mu *sync.RWMutex
OrderSubs map[string]chan *pb.Order
}
func AddOrderReader(cabNumber string) chan *pb.Order {
ordersChan := make(chan *pb.Order)
orderSubscriber.JoinOrderSubs(cabNumber, ordersChan)
grpclog.Println("Join to new order readers:",
cabNumber)
return ordersChan
}
func (o *OrderSubscriber) JoinOrderSubs(cabNumber
string, orderChan chan *pb.Order) {
o.mu.Lock()
o.OrderSubs[cabNumber] = orderChan
o.mu.Unlock()
}
Внедряем
• 12 factor
• Docker
• Nginx-stream + SSL
Мониторинг
• https://github.com/grpc-ecosystem/go-grpc-prometheus
Проблемы с подключением
• Приложение не может подключиться к серверу
• Клиент на Go может
• Дебажим, читаем спеку http/2
• Погружаемся в Android
В чем проблема то?
• Android – нет поддержки NPN
• Nginx – нет поддержки ALPN
Решение
• -nginx
• +nghttpx
Начали ЗБТ приложения
Приложение теряет связь
• Рандомно отваливается стрим
• Приложение не переподключается
Почему?
• Сервер паникует
• Нет явного статуса стрима, но есть статус канала
• Оператор связи рубит пустые http соединения(O’rly?)
Почему падает сервер
• Паники & гонки
Трассировка и отладка
• http://charithe.github.io/tracing-grpc-services-in-go.html
• net/http/pprof
Давай это порефакторим
• - каналы
• + пабсаб на поток
Было
func (a *API) Orders(in *empty.Empty, stream
pb.Foreman_OrdersServer) error {
ctx := stream.Context()
user, ok := user.FromContext(ctx)
if !ok {
return grpc.Errorf(codes.Unauthenticated, "user not
found")
}
OrdersChan := pubsub.AddOrderReader(user.CabNumber)
defer pubsub.LeaveOrderReader(user.CabNumber, OrdersChan)
// ..
}
type OrderSubscriber struct {
mu *sync.RWMutex
OrderSubs map[string]chan *pb.Order
}
func AddOrderReader(cabNumber string) chan *pb.Order {
ordersChan := make(chan *pb.Order)
orderSubscriber.JoinOrderSubs(cabNumber, ordersChan)
grpclog.Println("Join to new order readers:",
cabNumber)
return ordersChan
}
func (o *OrderSubscriber) JoinOrderSubs(cabNumber
string, orderChan chan *pb.Order) {
o.mu.Lock()
o.OrderSubs[cabNumber] = orderChan
o.mu.Unlock()
}
Стало
(a *API) Orders(in *empty.Empty, stream pb.Foreman_OrdersServer) error {
// ..
ordersChan := make(chan *pb.Order, 10)
errs := make(chan error, 1)
pubsub := a.redisClient.Subscribe("orders")
defer pubsub.Close()
// ..
Стало
// ..
go func() {
for {
msg, err := pubsub.ReceiveMessage()
// ..
order := &pb.Order{}
err = json.Unmarshal([]byte(msg.Payload), order)
// ..
if order.Status == pb.Order_NEW {
ordersChan <- order
}
}
}()
Стало
for {
select {
case order := <-ordersChan:
// business logic here
case <-ctx.Done():
return ctx.Err()
case e := <-errs:
close(ordersChan)
return e
}
}
Масштабирование
• Рефакторинг дал более хороший механизм масштабирования
• Нет состояния – нет проблем
Работаем с падающими стримами
• Circuit breaker для упавших стримов
• +keepalive
Keepalive на мобильных операторах
• Обычно рубят NAT сессии через 1-5 минут
• Выставили 20 секунд для мобильного приложения
waitForReady
• https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md
• Ждет READY состояния
• Падает на всех других (SHUTDOWN, Deadline exceeded…)
Плохая связь
• Fallback на unary
• Circuit breaker
• Observer на клиенте со счетчиками
• Ошибка или таймаут
• Перезапуск через N секунд в случае достижения maxRetries
Как балансировать gRPC
• Со стороны клиента
• Со стороны сервера
Как балансировать на сервере
• Ngx socket
Как балансировать на сервере
• Ngx socket – нет APLN
Как балансировать на сервере
• Ngx socket – нет APLN
• Встроенные механизмы
Как балансировать на сервере
• Ngx socket – нет APLN
• Встроенные механизмы – клиент наружу
Как балансировать на сервере
• Ngx socket – нет APLN
• Встроенные механизмы – клиент наружу
• Proxy_pass в NGINX
Как балансировать на сервере
• Ngx socket – нет APLN
• Встроенные механизмы – клиент наружу
• Proxy_pass в NGINX – все плохо с поддержкой HTTP/2
Как балансировать на сервере
• Ngx socket – нет APLN
• Встроенные механизмы – клиент наружу
• Proxy_pass в NGINX – все плохо с поддержкой HTTP/2
• NGHTTPX
Как балансировать на сервере
• Ngx socket – нет APLN
• Встроенные механизмы – клиент наружу
• Proxy_pass в NGINX – все плохо с поддержкой HTTP/2
• NGHTTPX – ликает
Как балансировать на сервере
• Ngx socket – нет APLN
• Встроенные механизмы – клиент наружу
• Proxy_pass в NGINX – все плохо с поддержкой HTTP/2
• NGHTTPX – ликает
• HAProxy?
NGHTTPX vs HAProxy
• Есть опыт с HAProxy
• Поддержка H2
• Тесты ОК
• Полет нормальный
Rest
• Синхронный
• Документация опциональна
• Внешняя отказоустойчивость
• Все о ресурсах
gRPC
• Асинхронный
• Документация обязательна
• Встроенная отказоустойчивость
• Все о API
Websocket gRPC
• https://www.infoq.com/articles/websocket-and-http2-coexist
Выводы
• gRPC можно использовать вместо REST. И это удобно
• gRPC применим и в мобильных приложениях (с некоторыми
оговорками)
• Балансировать на сервере удобно через HAProxy
• waitForReady может как помочь, так и усложнить жизнь
Контакты
• @maddevsio
• https://maddevs.io
• @Gen1us2k

More Related Content

What's hot

My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016
Alex Chistyakov
 
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
Yehor Herasymchuk
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
Alex Chistyakov
 
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Ontico
 
Илья Кудинов
Илья КудиновИлья Кудинов
Илья Кудинов
CodeFest
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»
DevDay
 
SOA: послать запрос на сервер? Что может быть проще?! / Иван Круглов (Booking...
SOA: послать запрос на сервер? Что может быть проще?! / Иван Круглов (Booking...SOA: послать запрос на сервер? Что может быть проще?! / Иван Круглов (Booking...
SOA: послать запрос на сервер? Что может быть проще?! / Иван Круглов (Booking...
Ontico
 
My talk on Graphite stack on 58it.ru
My talk on Graphite stack on 58it.ruMy talk on Graphite stack on 58it.ru
My talk on Graphite stack on 58it.ru
Alex Chistyakov
 
SOA: послать запрос на сервер? Что может быть проще?!
SOA: послать запрос на сервер? Что может быть проще?!SOA: послать запрос на сервер? Что может быть проще?!
SOA: послать запрос на сервер? Что может быть проще?!
Ivan Kruglov
 
Страх и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжинирингаСтрах и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжиниринга
Mikhail Chinkov
 
Using Ansible
Using AnsibleUsing Ansible
Using Ansible
Alex Chistyakov
 
AnyEvent::HTTPBenchmark
AnyEvent::HTTPBenchmarkAnyEvent::HTTPBenchmark
AnyEvent::HTTPBenchmark
Naim Shafiev
 
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
Alex Chistyakov
 
Мониторинг, когда не тестируешь
Мониторинг, когда не тестируешьМониторинг, когда не тестируешь
Мониторинг, когда не тестируешь
Uptime Community
 
My talk on Docker, Youcon 2015
My talk on Docker, Youcon 2015My talk on Docker, Youcon 2015
My talk on Docker, Youcon 2015Alex Chistyakov
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Oleg Poludnenko
 
Cpanm
CpanmCpanm
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Andrew Minkin
 

What's hot (19)

My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016My talk on HBase ops engineering at TBD Jun 2016
My talk on HBase ops engineering at TBD Jun 2016
 
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
 
Илья Кудинов
Илья КудиновИлья Кудинов
Илья Кудинов
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»
 
SOA: послать запрос на сервер? Что может быть проще?! / Иван Круглов (Booking...
SOA: послать запрос на сервер? Что может быть проще?! / Иван Круглов (Booking...SOA: послать запрос на сервер? Что может быть проще?! / Иван Круглов (Booking...
SOA: послать запрос на сервер? Что может быть проще?! / Иван Круглов (Booking...
 
My talk on Graphite stack on 58it.ru
My talk on Graphite stack on 58it.ruMy talk on Graphite stack on 58it.ru
My talk on Graphite stack on 58it.ru
 
Ua
UaUa
Ua
 
SOA: послать запрос на сервер? Что может быть проще?!
SOA: послать запрос на сервер? Что может быть проще?!SOA: послать запрос на сервер? Что может быть проще?!
SOA: послать запрос на сервер? Что может быть проще?!
 
Страх и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжинирингаСтрах и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжиниринга
 
Using Ansible
Using AnsibleUsing Ansible
Using Ansible
 
AnyEvent::HTTPBenchmark
AnyEvent::HTTPBenchmarkAnyEvent::HTTPBenchmark
AnyEvent::HTTPBenchmark
 
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
 
Мониторинг, когда не тестируешь
Мониторинг, когда не тестируешьМониторинг, когда не тестируешь
Мониторинг, когда не тестируешь
 
My talk on Docker, Youcon 2015
My talk on Docker, Youcon 2015My talk on Docker, Youcon 2015
My talk on Docker, Youcon 2015
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
 
Cpanm
CpanmCpanm
Cpanm
 
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
 

Similar to gRPC в продакшне для мобильных приложений

Работа с геоданными в Go GDGNSK / Work with Geodata in Go
Работа с геоданными в Go GDGNSK / Work with Geodata in GoРабота с геоданными в Go GDGNSK / Work with Geodata in Go
Работа с геоданными в Go GDGNSK / Work with Geodata in Go
Mad Devs
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
Andrey Smirnov
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
Andrey Smirnov
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Ontico
 
Smirnov Twisted Python
Smirnov Twisted PythonSmirnov Twisted Python
Smirnov Twisted PythonHighLoad2009
 
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
AvitoTech
 
Как собирать gps треки раз в секунду, экономя трафик / How to Collect GPS Tra...
Как собирать gps треки раз в секунду, экономя трафик / How to Collect GPS Tra...Как собирать gps треки раз в секунду, экономя трафик / How to Collect GPS Tra...
Как собирать gps треки раз в секунду, экономя трафик / How to Collect GPS Tra...
Mad Devs
 
Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...
Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...
Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...
Ontico
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...rit2011
 
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Sergey Xek
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...rit2011
 
Путь мониторинга, DevOps club в Grammarly
Путь мониторинга, DevOps club в GrammarlyПуть мониторинга, DevOps club в Grammarly
Путь мониторинга, DevOps club в GrammarlyVsevolod Polyakov
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Ontico
 
Как строить архитектуру для отказоустойчивой службы такси / How to Build a ...
Как строить архитектуру для отказоустойчивой службы такси / How to Build a ...Как строить архитектуру для отказоустойчивой службы такси / How to Build a ...
Как строить архитектуру для отказоустойчивой службы такси / How to Build a ...
Mad Devs
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Sergey Xek
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Sergey Xek
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовКирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектов
Olesya_V
 
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
Ontico
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Николай Лавлинский
 

Similar to gRPC в продакшне для мобильных приложений (20)

Работа с геоданными в Go GDGNSK / Work with Geodata in Go
Работа с геоданными в Go GDGNSK / Work with Geodata in GoРабота с геоданными в Go GDGNSK / Work with Geodata in Go
Работа с геоданными в Go GDGNSK / Work with Geodata in Go
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
 
Smirnov Twisted Python
Smirnov Twisted PythonSmirnov Twisted Python
Smirnov Twisted Python
 
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
 
Как собирать gps треки раз в секунду, экономя трафик / How to Collect GPS Tra...
Как собирать gps треки раз в секунду, экономя трафик / How to Collect GPS Tra...Как собирать gps треки раз в секунду, экономя трафик / How to Collect GPS Tra...
Как собирать gps треки раз в секунду, экономя трафик / How to Collect GPS Tra...
 
Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...
Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...
Собираем GPS-треки от водителей в такси раз в секунду, экономя трафик / Андре...
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 
Sivko
SivkoSivko
Sivko
 
Путь мониторинга, DevOps club в Grammarly
Путь мониторинга, DevOps club в GrammarlyПуть мониторинга, DevOps club в Grammarly
Путь мониторинга, DevOps club в Grammarly
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 
Как строить архитектуру для отказоустойчивой службы такси / How to Build a ...
Как строить архитектуру для отказоустойчивой службы такси / How to Build a ...Как строить архитектуру для отказоустойчивой службы такси / How to Build a ...
Как строить архитектуру для отказоустойчивой службы такси / How to Build a ...
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовКирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектов
 
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
 

More from Mad Devs

Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Mad Devs
 
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Mad Devs
 
Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101. Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101.
Mad Devs
 
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Devs
 
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy FedorenkoMad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Devs
 
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Devs
 
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий КононенкоMaв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Mad Devs
 
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия КононенкоЛайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Mad Devs
 
Mad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrainMad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrain
Mad Devs
 
Flutter vs Native App Development
Flutter vs Native App DevelopmentFlutter vs Native App Development
Flutter vs Native App Development
Mad Devs
 
Mad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companiesMad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companies
Mad Devs
 
The paradox of choice in design
The paradox of choice in designThe paradox of choice in design
The paradox of choice in design
Mad Devs
 
Git and Github for Beginners
Git and Github for Beginners Git and Github for Beginners
Git and Github for Beginners
Mad Devs
 
How to hire freelancers
How to hire freelancersHow to hire freelancers
How to hire freelancers
Mad Devs
 
Ethereum blockchain
Ethereum blockchainEthereum blockchain
Ethereum blockchain
Mad Devs
 
"Outside In". Web application testing.
"Outside In". Web application testing."Outside In". Web application testing.
"Outside In". Web application testing.
Mad Devs
 
Asynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use itAsynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use it
Mad Devs
 
Ethereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактовEthereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактов
Mad Devs
 
Why we sleep. Michael Ivashenko
Why we sleep. Michael IvashenkoWhy we sleep. Michael Ivashenko
Why we sleep. Michael Ivashenko
Mad Devs
 
Удаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитикаУдаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитика
Mad Devs
 

More from Mad Devs (20)

Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
 
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество
 
Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101. Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101.
 
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
 
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy FedorenkoMad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
 
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
 
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий КононенкоMaв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
 
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия КононенкоЛайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
 
Mad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrainMad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrain
 
Flutter vs Native App Development
Flutter vs Native App DevelopmentFlutter vs Native App Development
Flutter vs Native App Development
 
Mad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companiesMad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companies
 
The paradox of choice in design
The paradox of choice in designThe paradox of choice in design
The paradox of choice in design
 
Git and Github for Beginners
Git and Github for Beginners Git and Github for Beginners
Git and Github for Beginners
 
How to hire freelancers
How to hire freelancersHow to hire freelancers
How to hire freelancers
 
Ethereum blockchain
Ethereum blockchainEthereum blockchain
Ethereum blockchain
 
"Outside In". Web application testing.
"Outside In". Web application testing."Outside In". Web application testing.
"Outside In". Web application testing.
 
Asynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use itAsynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use it
 
Ethereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактовEthereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактов
 
Why we sleep. Michael Ivashenko
Why we sleep. Michael IvashenkoWhy we sleep. Michael Ivashenko
Why we sleep. Michael Ivashenko
 
Удаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитикаУдаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитика
 

gRPC в продакшне для мобильных приложений