SlideShare una empresa de Scribd logo
1 de 28
Descargar para leer sin conexión
#noBackend,
или Как выжить
в эпоху толстеющих клиентов
Николай Самохвалов
nikolay@samokhvalov.com
twitter: @postgresmen
Часть 1
Эпоха толстеющих клиентов
4 очень популярных языка для интернет-проектов
Год рождения — 1995
«Гадкий утёнок» JavaScript
1995: 1-я версия — за 10 дней
1990-е: второстепенные роли в веб-проектах
2000-е: Web 2.0, резкое усиление важности
2010-е: доминирование в самых различных областях
- Web apps
- Node.js, npm
- React Ecosystem
…Типичная история о силе дистрибуции и монополии
Популярность языков программирования*
Популярность на GitHub (кол-во проектов)
___________________________
* Исследование RedMonk.com,
Q1 2016
ПопулярностьнаStackOverflow(кол-вотэгов)
«Мобильные» пользователи преобладают ещё с 2014
● декабрь 2014: 51% трафика в Рунете — мобильные устройства
● май 2015: поиском Google.com пользуются больше с мобильных, чем с десктоп
#noBackend
a.k.a. Serverless
«Толстые» клиенты в вебе
Множество фреймворков
React Ecosystem
Основной фокус разработки продукта — FRONTEND
backend — просто должен работать
(безопасный, надёжный, производительный)
iOS, Android
Mobile First
no, BACKEND!
Если у вас «зоопарк»
(web, mobile apps, browser extensions, desktop apps, smartTV, IoT, etc),
то единственный путь жить и развиваться —
простой/надёжный/безопасный BACKEND с API
(например, REST API или новомодный GraphQL)
Часть 2
Как выжить
“true noBackend” – используем облака
Parse.com:
2013: Facebook покупает
2016: Facebook закрывает, R.I.P.
Кладбище mBaaS (Mobile Backend as a Service)
StackMob.com:
2013: PayPal покупает
2014: PayPal закрывает, R.I.P.
…полные аналоги Parse использовать теперь как-то «стрёмно»*
— остаётся использовать AWS (с их Cognito, Lambda), Google Cloud
___________
* но если очень хочется, есть много всякой всячины:
https://github.com/anaibol/awesome-serverless
…или …а давайте всё же сами!
…например, PostgreSQL
…например, PostgREST (http://postgrest.com)
— путь настоящего джедая: сможем не только выжить,
но и использовать силу!
+
PostgREST — API для вашей БД
http://postgrest.com
Написан на Haskell
MIT license
Активно развивается
чат: https://gitter.im/begriffs/postgrest
CREATE VIEW v1.person
AS SELECT * FROM public.person; → /person
CREATE FUNCTION v1.myfunc(...) … → /rpc/myfunc
LANGUAGE ...;
(функции на языках: SQL, plpgsql, plpython, plr, plv8 и т.д.!)
GET → SELECT
POST → INSERT
PATCH → UPDATE
DELETE → DELETE
Только POST
Урок 1: качество
Обязательно, обязательно автоматизируем тестирование API
- дома (Jenkins, TeamCity, etc)
- или в облаках (Circle CI, Travis CI, etc)
Тестируем:
- не только «хорошее», но и «плохое»
- быстродействие
Не надо так
Проверка работы REST API
Как работать с REST API:
- Старый добрый Firefox умеет «Edit and Resend» (разовые проверки)
- cURL
- HTTPie (http://httpie.org)
- Postman (пачка тестов, environments — отгружаем в файлы)
- newman — для консольного запуска пачки Postman-тестов
Урок 2: безопасность. Обязательно тестируем!
DB level: используем has_***_privilegeв тестах sqitch, pg_tap или аналогах
SELECT 1 / (not has_table_privilege)::int4
FROM has_table_privilege('anonymous', 'v1.post', 'select');
API level: пишем тесты для «плохих»
случаев и проверяем:
- 401 Unauthorized
- 403 Forbidden
- 400 Bad Request
и т.п.
Деление на 0, если есть привилегия!
Урок 2-а: анонимные запросы и безопасность
«а» — анонимы
Изучаем и работаем с JWT (см., например, http://jwt.io)
Урезанная DB role для анонимных доступов
(--anonymous у PostgREST)
Этой роли — никаких прав, кроме 2-3 методов в схеме v1
(можно с SECURITY DEFINER),
например: register, login, password_reset
На другие методы прав у аноним-роли быть не должно!
(тестируем API-вызовы)
Урок 2-b: права на столбцы
1) Совсем не светим секретноe — не включаем в выборку представления:
CREATE VIEW v1.post AS
SELECT id, title, body, moderated -- Никаких email, password и т.п.
FROM public.post;
2) Управляем доступом с помощью прав на столбцы:
GRANT SELECT,DELETE ON v1.post TO apiuser;
GRANT INSERT,UPDATE (title, body) ON v1.post TO apiuser; -- moderated -
R/O
Урок 2-с: запрет доступа к «чужим» строкам
Нельзя позволять юзеру менять чужие данные => нужно проверять `user_id`
PostgreSQL до 9.4 включительно:
используем триггеры и current_setting('postgrest.claims.XXXXX')
PostgreSQL 9.5+: используем Row-Level Security
…и опять не забываем тестировать
Урок 3-a: производительность. CPU vs network
Типичный пример из social media: выбор самых свежих материалов из
коллекций, на которые подписан юзер. Главное — round-trip time (RTT)!
Таблицы: person, post, collection, person2collection
Вариант 1:
select …
from post p … join person2collection p2c ..
where p2c.collection_id in (...list…)
And p.id < :prev_id
order by p.id desc limit :per_page;
select … from collection where id in (...);
select … from person … where id in (...);
– 3 API-вызова, RTT*3
Вариант 2:
select
p.*
row_to_json(c.*),
row_to_json(p.*)
from post p
join person2collection p2c ..
join collection c ..
join person p ..
where p.id < :prev_id
order by p.id desc limit :per_page;
- 1 API-вызов, RTT*1, ура!
Урок 3-b: «продвинутый» SQL
10 млн юзеров, 100 млн постов, 1 млн коллекций => оба варианта ~1-10 sec
Можно ли быстре?!
Да. Изучаем джедайские техники:
Максим Богук, pgDay’14 «Неклассические приёмы оптимизации запросов»
http://pgday.ru/files/pgmaster14/max.boguk.query.optimization.pdf
Придётся освоить и применить в комлексе:
● Recursive CTE (WITH RECURSIVE …)
● работа с массивами
● свёртка строк
● Window functions
● generate_series, generate_subscripts
● Loose indexscan https://wiki.postgresql.org/wiki/Loose_indexscan
~ 1-10ms !!!
Урок 3-c: масштабируемость. Три уровня
Уровень 1: много экземпляров PostgREST
Уровень 2: часть GET-запросов → readonly PostgREST, подключённые к Postgres-реплике(ам)
(направляем с помощью nginx). Принудительный мастер — с помощью custom http header.
Уровень 3: как масштабировать мастер? Сходу — пока никак.
Варианты:
3.1) микросервисная архитектура
(например, spilo и patroni от Zalando
– см. Highload++2015 http://www.highload.ru/2015/abstracts/1846.html)
3.2) CitusDB?
Пока нет, мешают WITH в PostgREST (возможно, уберут)
3.3) Можно просто подождать (см. планы Postgres по кластеру)
3.4) А надо ли вам? Миллион TPS на 1 мастере — может быть выгоднее «webscale» с
неэффективными узлами, как 1 трактор может быть выгоднее 100 людей с лопатами!
Урок 4: что не стоит делать внутри
Не стоит делать внутри:
если непредсказумое время работы,
если есть работа с внешними ресурсами (http-запросы, API)
Примеры:
● Отправка почты, СМС
● Сохранение картинок в хранилище
● Вызовы внешних API
Урок 5: асинхронная работа
Обрабатываем асинхронно (демоны на python/ruby/nodejs/etc),
отправляя сообщения с помощью:
● LISTEN/NOTIFY (пример есть в документации по PostgREST http://postgrest.
com/examples/users/#password-reset)
● mbus (Р. Друзягин, И. Фролков, доклад PgDay’15 http://pgday.
ru/files/papers/23/pgday.2015.messaging.frolkov.druzyagin.pdf)
● Сообщения в AMPQ (например, PostgreSQL LISTEN Exchange: https://github.
com/aweber/pgsql-listen-exchange)
Памятка #noBackend-разработчика
1. Ни шагу без CI (прежде всего, негативные проверки API)
2. Проверить (и проверять тестами!) все двери:
a. что может аноним?
b. защищены (чтение, модификация) ли важные поля?
c. можно ли поменять «чужие» записи? а заставить хозяина поменять свои
собственные?
3. Проверить эффективность и быстродействие:
a. можно ли сделать ещё меньше HTTP-запросов?
b. насколько они эффективны сложные запросы и есть ли пути оптимизации?
c. легко ли «положить» backend неожиданными фильтрами, сортировками,
соединениями?
d. легко ли «положить» его большим количеством запросов?
e. какие пути смасштабироваться есть в арсенале?
4. Дополнительно:
a. как делаются асинхронные задачи (скорость, надёжность, блокировки)?
b. есть ли зависимость от внешних ресурсов? Если да, сможем ли сделать
асинхронную работу?
The End
Спасибо!
https://twitter.com/postgresmen
http://PostgreSQLRussia.org
http://Postgres.CHAT

Más contenido relacionado

La actualidad más candente

Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
Go в продакшене Яндекса: отчёт после года использования — Вячеслав Бахмутов
Go в продакшене Яндекса: отчёт после года использования — Вячеслав БахмутовGo в продакшене Яндекса: отчёт после года использования — Вячеслав Бахмутов
Go в продакшене Яндекса: отчёт после года использования — Вячеслав БахмутовYandex
 
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...Yandex
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodNikita Baksalyar
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОFedor Malyshkin
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахAleksander Alekseev
 
My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016Alex Chistyakov
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Нагруженный поиск на Sphinx
Нагруженный поиск на SphinxНагруженный поиск на Sphinx
Нагруженный поиск на SphinxRoman Pavlushko
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и DjangoTaras Lyapun
 
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Daniel Podolsky
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)Ontico
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 

La actualidad más candente (20)

Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
Go в продакшене Яндекса: отчёт после года использования — Вячеслав Бахмутов
Go в продакшене Яндекса: отчёт после года использования — Вячеслав БахмутовGo в продакшене Яндекса: отчёт после года использования — Вячеслав Бахмутов
Go в продакшене Яндекса: отчёт после года использования — Вячеслав Бахмутов
 
Groovy
GroovyGroovy
Groovy
 
Барнаул15
Барнаул15Барнаул15
Барнаул15
 
Devconf15
Devconf15Devconf15
Devconf15
 
Golang
GolangGolang
Golang
 
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
Илья Биин: Организация совместной работы Go и Python-based сервисов в Ostrovo...
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПО
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
 
My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016My talk at YouCon Saratov 2016
My talk at YouCon Saratov 2016
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Нагруженный поиск на Sphinx
Нагруженный поиск на SphinxНагруженный поиск на Sphinx
Нагруженный поиск на Sphinx
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
ETL на Python
ETL на PythonETL на Python
ETL на Python
 
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 

Destacado

noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайOntico
 
Nobackend Parse and Dodo
Nobackend Parse and DodoNobackend Parse and Dodo
Nobackend Parse and DodoPankaj Bhageria
 
Hoodie - Webapplikationen ohne backend
Hoodie - Webapplikationen ohne backendHoodie - Webapplikationen ohne backend
Hoodie - Webapplikationen ohne backendPhilipp Müns
 
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Ontico
 

Destacado (6)

noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
 
Nobackend Parse and Dodo
Nobackend Parse and DodoNobackend Parse and Dodo
Nobackend Parse and Dodo
 
Hoodie - Webapplikationen ohne backend
Hoodie - Webapplikationen ohne backendHoodie - Webapplikationen ohne backend
Hoodie - Webapplikationen ohne backend
 
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
 
Firebase and AngularJS
Firebase and AngularJSFirebase and AngularJS
Firebase and AngularJS
 
No backend
No backendNo backend
No backend
 

Similar a #noBackend, или Как выжить в эпоху толстеющих клиентов

Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Alexey Kachayev
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаMikhail Chinkov
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...Nikolay Samokhvalov
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish SQALab
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, ParallelsNikolay Samokhvalov
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf Conference
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...it-people
 
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...Mail.ru Group
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализацияYandex
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в ЯндексеAndrey Kazarinov
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandexaviatakz
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)Sergey Skvortsov
 
Обзор Continuous integration инструментов
Обзор Continuous integration инструментовОбзор Continuous integration инструментов
Обзор Continuous integration инструментовVitalii Morvaniuk
 

Similar a #noBackend, или Как выжить в эпоху толстеющих клиентов (20)

Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
Telegram Bot
Telegram BotTelegram Bot
Telegram Bot
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)
 
Invisible
InvisibleInvisible
Invisible
 
Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...
 
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в Яндексе
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandex
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 
Обзор Continuous integration инструментов
Обзор Continuous integration инструментовОбзор Continuous integration инструментов
Обзор Continuous integration инструментов
 

Más de Nikolay Samokhvalov

Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхNikolay Samokhvalov
 
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseThe Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseNikolay Samokhvalov
 
Nancy CLI. Automated Database Experiments
Nancy CLI. Automated Database ExperimentsNancy CLI. Automated Database Experiments
Nancy CLI. Automated Database ExperimentsNikolay Samokhvalov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросыNikolay Samokhvalov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросыNikolay Samokhvalov
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1Nikolay Samokhvalov
 
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"Nikolay Samokhvalov
 
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...Nikolay Samokhvalov
 
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...Nikolay Samokhvalov
 
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...Nikolay Samokhvalov
 
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...Nikolay Samokhvalov
 
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.42014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4Nikolay Samokhvalov
 
2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ruNikolay Samokhvalov
 
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussiaNikolay Samokhvalov
 
2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN search2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN searchNikolay Samokhvalov
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)Nikolay Samokhvalov
 
PostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
PostgreSQL Moscow Meetup - September 2014 - Ilya KosmodemyanskyPostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
PostgreSQL Moscow Meetup - September 2014 - Ilya KosmodemyanskyNikolay Samokhvalov
 
PostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
PostgreSQL Moscow Meetup - September 2014 - Nikolay SamokhvalovPostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
PostgreSQL Moscow Meetup - September 2014 - Nikolay SamokhvalovNikolay Samokhvalov
 
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander KorotkovPostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander KorotkovNikolay Samokhvalov
 

Más de Nikolay Samokhvalov (20)

Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
 
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San JoseThe Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
The Art of Database Experiments – PostgresConf Silicon Valley 2018 / San Jose
 
Nancy CLI. Automated Database Experiments
Nancy CLI. Automated Database ExperimentsNancy CLI. Automated Database Experiments
Nancy CLI. Automated Database Experiments
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
2016.10.13 PostgreSQL in Russia
2016.10.13 PostgreSQL in Russia2016.10.13 PostgreSQL in Russia
2016.10.13 PostgreSQL in Russia
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1
 
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
SFPUG 2015.11.20 lightning talk "PostgreSQL in Russia"
 
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
 
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
 
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
 
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
Три вызова реляционным СУБД и новый PostgreSQL - #PostgreSQLRussia семинар по...
 
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.42014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
 
2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Сергей Бурладян, Avito.ru
 
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
 
2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN search2014.10.15 блиц-доклад PostgreSQL kNN search
2014.10.15 блиц-доклад PostgreSQL kNN search
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
 
PostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
PostgreSQL Moscow Meetup - September 2014 - Ilya KosmodemyanskyPostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
PostgreSQL Moscow Meetup - September 2014 - Ilya Kosmodemyansky
 
PostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
PostgreSQL Moscow Meetup - September 2014 - Nikolay SamokhvalovPostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
PostgreSQL Moscow Meetup - September 2014 - Nikolay Samokhvalov
 
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander KorotkovPostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
PostgreSQL Moscow Meetup - September 2014 - Oleg Bartunov and Alexander Korotkov
 

#noBackend, или Как выжить в эпоху толстеющих клиентов

  • 1. #noBackend, или Как выжить в эпоху толстеющих клиентов Николай Самохвалов nikolay@samokhvalov.com twitter: @postgresmen
  • 3. 4 очень популярных языка для интернет-проектов Год рождения — 1995
  • 4. «Гадкий утёнок» JavaScript 1995: 1-я версия — за 10 дней 1990-е: второстепенные роли в веб-проектах 2000-е: Web 2.0, резкое усиление важности 2010-е: доминирование в самых различных областях - Web apps - Node.js, npm - React Ecosystem …Типичная история о силе дистрибуции и монополии
  • 5. Популярность языков программирования* Популярность на GitHub (кол-во проектов) ___________________________ * Исследование RedMonk.com, Q1 2016 ПопулярностьнаStackOverflow(кол-вотэгов)
  • 6. «Мобильные» пользователи преобладают ещё с 2014 ● декабрь 2014: 51% трафика в Рунете — мобильные устройства ● май 2015: поиском Google.com пользуются больше с мобильных, чем с десктоп
  • 7. #noBackend a.k.a. Serverless «Толстые» клиенты в вебе Множество фреймворков React Ecosystem Основной фокус разработки продукта — FRONTEND backend — просто должен работать (безопасный, надёжный, производительный) iOS, Android Mobile First
  • 8. no, BACKEND! Если у вас «зоопарк» (web, mobile apps, browser extensions, desktop apps, smartTV, IoT, etc), то единственный путь жить и развиваться — простой/надёжный/безопасный BACKEND с API (например, REST API или новомодный GraphQL)
  • 10. “true noBackend” – используем облака Parse.com: 2013: Facebook покупает 2016: Facebook закрывает, R.I.P. Кладбище mBaaS (Mobile Backend as a Service) StackMob.com: 2013: PayPal покупает 2014: PayPal закрывает, R.I.P. …полные аналоги Parse использовать теперь как-то «стрёмно»* — остаётся использовать AWS (с их Cognito, Lambda), Google Cloud ___________ * но если очень хочется, есть много всякой всячины: https://github.com/anaibol/awesome-serverless
  • 11. …или …а давайте всё же сами! …например, PostgreSQL …например, PostgREST (http://postgrest.com)
  • 12. — путь настоящего джедая: сможем не только выжить, но и использовать силу! +
  • 13. PostgREST — API для вашей БД http://postgrest.com Написан на Haskell MIT license Активно развивается чат: https://gitter.im/begriffs/postgrest CREATE VIEW v1.person AS SELECT * FROM public.person; → /person CREATE FUNCTION v1.myfunc(...) … → /rpc/myfunc LANGUAGE ...; (функции на языках: SQL, plpgsql, plpython, plr, plv8 и т.д.!) GET → SELECT POST → INSERT PATCH → UPDATE DELETE → DELETE Только POST
  • 14. Урок 1: качество Обязательно, обязательно автоматизируем тестирование API - дома (Jenkins, TeamCity, etc) - или в облаках (Circle CI, Travis CI, etc) Тестируем: - не только «хорошее», но и «плохое» - быстродействие
  • 16. Проверка работы REST API Как работать с REST API: - Старый добрый Firefox умеет «Edit and Resend» (разовые проверки) - cURL - HTTPie (http://httpie.org) - Postman (пачка тестов, environments — отгружаем в файлы) - newman — для консольного запуска пачки Postman-тестов
  • 17. Урок 2: безопасность. Обязательно тестируем! DB level: используем has_***_privilegeв тестах sqitch, pg_tap или аналогах SELECT 1 / (not has_table_privilege)::int4 FROM has_table_privilege('anonymous', 'v1.post', 'select'); API level: пишем тесты для «плохих» случаев и проверяем: - 401 Unauthorized - 403 Forbidden - 400 Bad Request и т.п. Деление на 0, если есть привилегия!
  • 18. Урок 2-а: анонимные запросы и безопасность «а» — анонимы Изучаем и работаем с JWT (см., например, http://jwt.io) Урезанная DB role для анонимных доступов (--anonymous у PostgREST) Этой роли — никаких прав, кроме 2-3 методов в схеме v1 (можно с SECURITY DEFINER), например: register, login, password_reset На другие методы прав у аноним-роли быть не должно! (тестируем API-вызовы)
  • 19. Урок 2-b: права на столбцы 1) Совсем не светим секретноe — не включаем в выборку представления: CREATE VIEW v1.post AS SELECT id, title, body, moderated -- Никаких email, password и т.п. FROM public.post; 2) Управляем доступом с помощью прав на столбцы: GRANT SELECT,DELETE ON v1.post TO apiuser; GRANT INSERT,UPDATE (title, body) ON v1.post TO apiuser; -- moderated - R/O
  • 20. Урок 2-с: запрет доступа к «чужим» строкам Нельзя позволять юзеру менять чужие данные => нужно проверять `user_id` PostgreSQL до 9.4 включительно: используем триггеры и current_setting('postgrest.claims.XXXXX') PostgreSQL 9.5+: используем Row-Level Security …и опять не забываем тестировать
  • 21. Урок 3-a: производительность. CPU vs network Типичный пример из social media: выбор самых свежих материалов из коллекций, на которые подписан юзер. Главное — round-trip time (RTT)! Таблицы: person, post, collection, person2collection Вариант 1: select … from post p … join person2collection p2c .. where p2c.collection_id in (...list…) And p.id < :prev_id order by p.id desc limit :per_page; select … from collection where id in (...); select … from person … where id in (...); – 3 API-вызова, RTT*3 Вариант 2: select p.* row_to_json(c.*), row_to_json(p.*) from post p join person2collection p2c .. join collection c .. join person p .. where p.id < :prev_id order by p.id desc limit :per_page; - 1 API-вызов, RTT*1, ура!
  • 22. Урок 3-b: «продвинутый» SQL 10 млн юзеров, 100 млн постов, 1 млн коллекций => оба варианта ~1-10 sec Можно ли быстре?! Да. Изучаем джедайские техники: Максим Богук, pgDay’14 «Неклассические приёмы оптимизации запросов» http://pgday.ru/files/pgmaster14/max.boguk.query.optimization.pdf Придётся освоить и применить в комлексе: ● Recursive CTE (WITH RECURSIVE …) ● работа с массивами ● свёртка строк ● Window functions ● generate_series, generate_subscripts ● Loose indexscan https://wiki.postgresql.org/wiki/Loose_indexscan
  • 24. Урок 3-c: масштабируемость. Три уровня Уровень 1: много экземпляров PostgREST Уровень 2: часть GET-запросов → readonly PostgREST, подключённые к Postgres-реплике(ам) (направляем с помощью nginx). Принудительный мастер — с помощью custom http header. Уровень 3: как масштабировать мастер? Сходу — пока никак. Варианты: 3.1) микросервисная архитектура (например, spilo и patroni от Zalando – см. Highload++2015 http://www.highload.ru/2015/abstracts/1846.html) 3.2) CitusDB? Пока нет, мешают WITH в PostgREST (возможно, уберут) 3.3) Можно просто подождать (см. планы Postgres по кластеру) 3.4) А надо ли вам? Миллион TPS на 1 мастере — может быть выгоднее «webscale» с неэффективными узлами, как 1 трактор может быть выгоднее 100 людей с лопатами!
  • 25. Урок 4: что не стоит делать внутри Не стоит делать внутри: если непредсказумое время работы, если есть работа с внешними ресурсами (http-запросы, API) Примеры: ● Отправка почты, СМС ● Сохранение картинок в хранилище ● Вызовы внешних API
  • 26. Урок 5: асинхронная работа Обрабатываем асинхронно (демоны на python/ruby/nodejs/etc), отправляя сообщения с помощью: ● LISTEN/NOTIFY (пример есть в документации по PostgREST http://postgrest. com/examples/users/#password-reset) ● mbus (Р. Друзягин, И. Фролков, доклад PgDay’15 http://pgday. ru/files/papers/23/pgday.2015.messaging.frolkov.druzyagin.pdf) ● Сообщения в AMPQ (например, PostgreSQL LISTEN Exchange: https://github. com/aweber/pgsql-listen-exchange)
  • 27. Памятка #noBackend-разработчика 1. Ни шагу без CI (прежде всего, негативные проверки API) 2. Проверить (и проверять тестами!) все двери: a. что может аноним? b. защищены (чтение, модификация) ли важные поля? c. можно ли поменять «чужие» записи? а заставить хозяина поменять свои собственные? 3. Проверить эффективность и быстродействие: a. можно ли сделать ещё меньше HTTP-запросов? b. насколько они эффективны сложные запросы и есть ли пути оптимизации? c. легко ли «положить» backend неожиданными фильтрами, сортировками, соединениями? d. легко ли «положить» его большим количеством запросов? e. какие пути смасштабироваться есть в арсенале? 4. Дополнительно: a. как делаются асинхронные задачи (скорость, надёжность, блокировки)? b. есть ли зависимость от внешних ресурсов? Если да, сможем ли сделать асинхронную работу?