SlideShare a Scribd company logo
Веб-разработка без
наркотиков на C2H5OH
Кириллов Миша, misha@genosse.org
https://github.com/genosse/c2h5oh/
«Эволюция» разработки для WWW
● HTML
● CGI
● Template Engine
● Framework / ORM
● API / Frontend
Всё это, видите ль, слова, слова, слова
PHP
Yii
Apache
CGI
ASP
.NET
GoLang
J2EE
mod_perl2
Symphony2
PHP7
UWSGI
Laravel
Phalcon
CodeIgniter
CakePHP
Django Reinhardt
Python2
Python3
Node.JS
Parser
Leftpad.io ;)
Aura
Parser
Веб-разработка – это просто
● Фреймворки должны не усложнять, а упрощать
● “Глубокое понимание отличий PHP 6.1.3 и PHP 6.2.1”
● ORM – зло
● Процессорное время и память – конечны
● Задача несложная – отдать данные клиенту
Почему PostgreSQL?
● Надёжность и стабильность
● Скорость, работает быстро
● Хранимки на любых языках
● Можно писать свои расширения
● Поддержка JSON
● Свободное ПО + мне нравится )))
Почему NGINX?
● Надёжность и стабильность “в квадрате”
● Работает очень быстро
● Множество расширений, можно писать свои
● HTTP1.1, HTTP2, IPV6, WebSockets, SSL, etc...
● Свободное ПО + мне нравится )))
Что такое C2H5OH?
Спирт – это расширение веб-сервера
nginx для простой реализации
высокопроизводительных HTTP API
к приложениям на базе PostgreSQL
Почему C2H5OH?
● Берём лучшее: Nginx и PostgreSQL
● Минимализм
● Быстродействие, 14К rps на моём ноутбуке )
● За данные и обработку отвечает один инженер
● Безопасность и масштабируемость
● Всем нужны API
Пример конфигурации nginx
 # /etc/c2h5oh/c2h5oh_nginx.conf
 server {
  
    listen 8080; 
    server_name localhost;
    location /api {
      #        ,        параметры подключения к БД размер пула соединений
      c2h5oh_pass "dbname=c2h5oh user=web password=web" 200;
      #   apiадрес
      c2h5oh_root /api; 
      #     urlфункция маршрутизации
      c2h5oh_route route;
      #          время на выполнение запроса
      c2h5oh_timeout 1s; 
    }
 }
Пример, маршрутизация url
 create or replace function web.route(url varchar, cookies jsonb, query jsonb)     
   returns text as              
 $$                                                                              
 declare∙                                                                        
   res_ jsonb;                                                                   
 begin                                                                           
   execute 'select web.'||                                                       
     quote_ident(replace(regexp_replace(url, '^/?(.*?)/?$', '1'), '/', '_'))||    
    '($1,$2)' into res_ using cookies, query;                                      
   return res_;                                                                  
 exception                                                                      
  when undefined_function then                                                  
    raise warning '%', sqlerrm;                                                 
    return '{"status":404}';                                                    
  when others then                                                    
    return '{"content":{"status":"'||sqlerrm||'"}}';                            
 end;                                                                            
 $$ language plpgsql security definer; 
Пример функции – сумма чисел
create or replace function web.sum(cookies jsonb, query jsonb)                     
  returns text as                                                               
$$                                                                              
­­ @brief Returns a + b                                                            
begin                                                                           
  return json_build_object('content', json_build_object(                        
    'status', 'ok', 'sum', (q­>>'a')::numeric + (q­>>'b')::numeric));           
end;                                                                            
$$ language plpgsql;
curl 'http://localhost:8080/api/sum/?a=10&b=20'    
Пример функции – get_cookie, set_cookie
create or replace function web.cookie_set(c jsonb, q jsonb) returns text as $$     
begin                                                                           
  return                                                                        
    json_build_object('content', json_build_object('status', 'ok'),             
      'headers',∙                                                               
        'Set­Cookie: sid=' || (q­>>'v') || '; Domain= .genosse.org; Expires=' ||
          to_char('2016­01­01'::timestamp + interval '14 days', 
          'Dy, DD­Mon­YYYY HH24:MI:SS GMT') ||∙
          '; Path=/; Secure; HttpOnly');                                        
end; $$ language plpgsql;                                                          
                                                                                
create or replace function web.cookie_get(c jsonb, q jsonb) returns text as $$     
begin                                                                           
  return json_build_object('content', json_build_object(                        
    'status', 'ok', 'sid', c­>>'sid'));                                         
end;                                                                            
$$ language plpgsql;
Пример функции – redirect
create or replace function web.redirect(cookies jsonb, query jsonb)                
  returns text as                                                               
$$                                                                              
­­ @brief Returns redirect to specified url                                        
begin                                                                           
  return json_build_object('content', 'Redirected to: ' || (query­>>'u'),∙         
    'status', 302, 'headers', 'Location: ' || (query­>>'u'));                      
end;                                                                            
$$ language plpgsql;    
Пример функции – заголовки http
create or replace function web.headers(c jsonb, q jsonb)                        
  returns text as                                                               
$$                                                                              
­­ @brief Returns redirect to specified url                                        
begin                                                                           
  return json_build_object('content', 'ok',∙                                    
    'headers', json_build_array(                                                
      'Header1: ' || (q­>>'h1'),∙                                               
      'Header2: ' || (q­>>'h2'),∙                                               
      'Content­Type: text/plain'                                                
    ));                                                                         
end;                                                                            
$$ language plpgsql;   
Пример - загрузка файлов
    location = /api/upload/ {
      client_max_body_size 16m;
      auth_request /auth;
      limit_except POST { deny all; }
      client_body_in_file_only on;
      client_body_temp_path /var/lib/c2h5oh/uploads;
      proxy_pass $scheme://127.0.0.1:$server_port/dummy;
      proxy_set_header           X­FILE $request_body_file;
      proxy_set_header           X­FILE­SIZE $content_length;
      proxy_set_body             off;
      proxy_redirect             off;
    }
    location = /dummy {
      client_max_body_size 16m;
      allow   127.0.0.1;
      deny    all;
      access_log off;
      if ($http_x_file ~ "/(w+$)$") {
        set $file_name $1;
      }
      return 200 '{"name":"$file_name","size":"$http_x_file_size"}';
    }
Отправка e-mail
● Listen/Notify и внешний скрипт
● Очередь mbus и внешний скрипт
● Отправка почты из хранимки на PostgreSQL - плохо
Авторизация пользователей API
● Создание токенов и хранение их в БД
● Подпись токенов с помощью pgcrypto
● JSON Web Tokens – jwt.io
Отладка и тестирование
● Я использую VIM IDE ;)
● Тесты, тесты, тесты
● Отладка хранимых процедур неудобна
● CI: Travis CI, Circle CI
Минусы C2H5OH
● Сложность разработки, надо понимать, что делаешь
● Труднее найти квалифицированных инженеров
● Незнакомое решение
● Мало документации и примеров, типовых сценариев
● Непривычно тестировать и отлаживать
● Сложности в выкладке “на бой”
Задачи на будущее
● Автоматическое создание документации по API
● Автоматическое создание песочницы для API
● Расширить документацию и примеры
● Описать типовые сценарии использования
● Сравнительный анализ существующих решений
● Сохранить минимализм, увеличить быстродействие
Благодарю за внимание, земной поклон!
Готов ответить на любые вопросы
искренне и без хамства
misha@genosse.org

More Related Content

What's hot (20)

PPTX
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Ontico
 
PPTX
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Ontico
 
PPTX
обзор архитектуры и подсистем деплоя и мониторинга
Константин Никифоров
 
PDF
Юрий Насретдинов, Badoo
Ontico
 
PDF
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
PPTX
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Ontico
 
PDF
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Ontico
 
PPTX
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 
PDF
RootConf 2015
Evgeny Uskov
 
PDF
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Ontico
 
PDF
Алексей Фомкин, Практическое применение Web Workers
Aleksey Fomkin
 
PPTX
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
Ontico
 
PPTX
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Ontico
 
PDF
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Ontico
 
PDF
pgconf.ru 2015 avito postgresql
Михаил Тюрин
 
PDF
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Ontico
 
PPTX
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Ontico
 
PPSX
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Ontico
 
PPTX
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Fwdays
 
PDF
Чему мы научились разрабатывая микросервисы?
Vadim Madison
 
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Ontico
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Ontico
 
обзор архитектуры и подсистем деплоя и мониторинга
Константин Никифоров
 
Юрий Насретдинов, Badoo
Ontico
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Ontico
 
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Ontico
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 
RootConf 2015
Evgeny Uskov
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Ontico
 
Алексей Фомкин, Практическое применение Web Workers
Aleksey Fomkin
 
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
Ontico
 
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Ontico
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Ontico
 
pgconf.ru 2015 avito postgresql
Михаил Тюрин
 
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Ontico
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Ontico
 
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Ontico
 
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Fwdays
 
Чему мы научились разрабатывая микросервисы?
Vadim Madison
 

Viewers also liked (18)

PDF
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
Ontico
 
PDF
Всему своё время / Роман Ивлиев (Банки.ру)
Ontico
 
PDF
NoSQL - неспроста ли это ЖЖЖ / Даниил Подольский (inCaller.org)
Ontico
 
PDF
PG Day'14 Russia, Нетрадиционный PostgreSQL: хранение бинарных данных в БД, А...
pgdayrussia
 
PDF
мои модули и патчи для Nginx. максим дунин. зал 1
rit2011
 
PDF
Выход на новые рынки, так ли это сложно организовать / Павел Шинкаренко (Sola...
Ontico
 
PPT
20090721 hpc exercise2
Michael Karpov
 
PDF
20080224 efficientalgorithms kulikov_lecture14
Computer Science Club
 
PDF
Нагрузочное тестирование с помощью Яндекс.Танка
Aleksandr Boichenko
 
PDF
О.В.Сухорослов "Параллельное программирование. Часть 2"
Yandex
 
PDF
Кружок по робототехнике. Занятие #2. Программируем моторы
Alexander Kolotov
 
PDF
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Anastasia Lubennikova
 
PDF
Кружок по робототехнике. Занятие #2. Lego Mindstorms NXT
Alexander Kolotov
 
PDF
"PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио...
Badoo Development
 
PDF
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Ontico
 
PDF
Основы ооп на языке C#. Часть 2. базовый синтаксис.
YakubovichDA
 
PDF
основы ооп на языке C#. часть 1. введение в программирование
YakubovichDA
 
PDF
A Complete Guide To The Best Times To Post On Social Media (And More!)
TrackMaven
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
Ontico
 
Всему своё время / Роман Ивлиев (Банки.ру)
Ontico
 
NoSQL - неспроста ли это ЖЖЖ / Даниил Подольский (inCaller.org)
Ontico
 
PG Day'14 Russia, Нетрадиционный PostgreSQL: хранение бинарных данных в БД, А...
pgdayrussia
 
мои модули и патчи для Nginx. максим дунин. зал 1
rit2011
 
Выход на новые рынки, так ли это сложно организовать / Павел Шинкаренко (Sola...
Ontico
 
20090721 hpc exercise2
Michael Karpov
 
20080224 efficientalgorithms kulikov_lecture14
Computer Science Club
 
Нагрузочное тестирование с помощью Яндекс.Танка
Aleksandr Boichenko
 
О.В.Сухорослов "Параллельное программирование. Часть 2"
Yandex
 
Кружок по робототехнике. Занятие #2. Программируем моторы
Alexander Kolotov
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Anastasia Lubennikova
 
Кружок по робототехнике. Занятие #2. Lego Mindstorms NXT
Alexander Kolotov
 
"PostgreSQL для разработчиков приложений", Павел Лузанов, (Постгрес Профессио...
Badoo Development
 
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Ontico
 
Основы ооп на языке C#. Часть 2. базовый синтаксис.
YakubovichDA
 
основы ооп на языке C#. часть 1. введение в программирование
YakubovichDA
 
A Complete Guide To The Best Times To Post On Social Media (And More!)
TrackMaven
 
Ad

Similar to Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кириллов (CINEMOOD) (20)

PDF
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
DevDay
 
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
PPT
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
PPTX
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
Egor Konovalov
 
PDF
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
Yandex
 
PDF
Инструментируй это
Roman Dvornov
 
PDF
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
PDF
Компиляция скриптов PHP. Алексей Романенко
Fuenteovejuna
 
PDF
Компиляция скриптов PHP (Алексей Романенко)
Ontico
 
PDF
Phalcon - самый быстрый PHP Framework
Oleksandr Torosh
 
PDF
Серверный JavaScript: NodeJS и CouchDB
Stepan Stolyarov
 
PDF
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest
 
PDF
Mihail davidov js-ajax
Yandex
 
ODP
Nginx Igor Sysoev
Media Gorod
 
PDF
Как мы делаем модули PHP в Badoo – Антон Довгаль
Badoo Development
 
PDF
Николай Сиварев "Приручая сайты"
Yandex
 
PDF
Михаил Давыдов — Транспорт, Ajax
Yandex
 
PDF
Introduction in Node.js (in russian)
Mikhail Davydov
 
PDF
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
e-Legion
 
PDF
От Make к Ansible
Ivan Grishaev
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
DevDay
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
Egor Konovalov
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
Yandex
 
Инструментируй это
Roman Dvornov
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
Компиляция скриптов PHP. Алексей Романенко
Fuenteovejuna
 
Компиляция скриптов PHP (Алексей Романенко)
Ontico
 
Phalcon - самый быстрый PHP Framework
Oleksandr Torosh
 
Серверный JavaScript: NodeJS и CouchDB
Stepan Stolyarov
 
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest
 
Mihail davidov js-ajax
Yandex
 
Nginx Igor Sysoev
Media Gorod
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Badoo Development
 
Николай Сиварев "Приручая сайты"
Yandex
 
Михаил Давыдов — Транспорт, Ajax
Yandex
 
Introduction in Node.js (in russian)
Mikhail Davydov
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
e-Legion
 
От Make к Ansible
Ivan Grishaev
 
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 

Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кириллов (CINEMOOD)