<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dw="https://www.dreamwidth.org">
  <id>tag:dreamwidth.org,2016-12-24:2595908</id>
  <title>Первый рукописный блог рунета™</title>
  <subtitle>О, да</subtitle>
  <author>
    <name>ermouth</name>
  </author>
  <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/"/>
  <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom"/>
  <updated>2017-07-27T01:53:54Z</updated>
  <dw:journal username="ermouth" type="personal"/>
  <entry>
    <id>tag:dreamwidth.org,2016-12-24:2595908:702740</id>
    <link rel="alternate" type="text/html" href="https://ermouth.dreamwidth.org/702740.html"/>
    <link rel="self" type="text/xml" href="https://ermouth.dreamwidth.org/data/atom/?itemid=702740"/>
    <title>Couchbox</title>
    <published>2017-07-27T01:52:40Z</published>
    <updated>2017-07-27T01:53:54Z</updated>
    <category term="couchbox"/>
    <category term="jquerymy"/>
    <category term="cloudwall"/>
    <category term="mysoft"/>
    <category term="inliner"/>
    <category term="javascript"/>
    <category term="design"/>
    <category term="es6"/>
    <category term="couchdb"/>
    <category term="ide"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Месяц назад мы запустили публичную бету &lt;a href="https://vezdelegko.ru/" target="_blank"&gt;vezdelegko.ru&lt;/a&gt;, сервиса бронирования экскурсий, отелей и транспорта. Сервисы бронирования – сами по себе штука сложная, это как магазин, по которому надо вести учёт ассортимента на каждый день, причём ассортимент день ото дня меняется и цены зависят от дня и количества. Причём в магазине куча отделов, и партнёры сами управляют своим ассортиментом. &lt;/p&gt; &lt;p&gt;Дополнительно, в нашем случае сервис делался с прицелом на очень существенную масштабируемость как по ёмкости, так и по географии. Это автоматом предполагает архитектуру из многих узлов и распределённое хранение/обработку данных с последующей их репликацией и агрегацией. Под такую схему я придумал специальную архитектуру узла, которая потребовала платформы исполнения, это и есть &lt;a href="https://gitlab.com/Couchbox/couchbox" target="_blank"&gt;Couchbox&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="https://gitlab.com/Couchbox/couchbox/" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Снимок экрана 2017-07-27 в 2.26.24" border="0" alt="Снимок экрана 2017-07-27 в 2.26.24" src="http://jquerymy.com/dw/Couchbox_4FC8/201707272.26.24.png" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;География узлов и характер распространения данных предполагал версионированную мастер-мастер репликацию между узлами, по сложной топологии, различной для разных типов данных. Такие штуки прекрасно умеет делать моя любимая CouchDB, поэтому основной набор данных хранится в CouchDB, размазанный по всему графу узлов так, что все данные минимум дублированы.&lt;/p&gt; &lt;h3&gt;Code follows data&lt;/h3&gt; &lt;p&gt;Нативная CouchDB хранит в базах не только данные, но и код для predefined map/reduce запросов, по которым строятся высокоэффективные persistent индексы. Этот код, на JS или Erlang, хранится в документах рядом с данными и может распространятся между узлами в тех же потоках репликации, что и сами данные.&lt;/p&gt; &lt;p&gt;Couchbox, наша платформа, расширяет это всё механикой &lt;em&gt;хуков&lt;/em&gt;, реагирующих на изменения документов в базе, и &lt;em&gt;эндпоинтов&lt;/em&gt; – REST–концов, обрабатывающих входящие запросы через https. То-есть в те же специальные документы, где в обычной CouchDB живёт код функций индексов, для Couchbox-а можно добавить ещё и код функций хуков и внешних REST API эндпоинтов. Получается распределённая платформа приложений.&lt;/p&gt; &lt;p&gt;Особо примечателен факт, что с точки зрения установленного софта узлы не различаются вообще. &lt;/p&gt; &lt;p&gt;Весь специфический код, определяющий функциональную роль узла, приходит через БД. То-есть по мере обновления документов с кодом все обработчики по-горячему аккуратно заменяются на новые версии. Обработчики устроены примерно как &lt;a href="https://aws.amazon.com/ru/lambda/details/" target="_blank"&gt;амазоновские лямбды&lt;/a&gt;, функции без сохранения состояния, поэтому горячая замена вполне возможна.&lt;/p&gt; &lt;h3&gt;Файлы – это очень скучно&lt;/h3&gt; &lt;p&gt;Важный момент, как именно код функций попадает в БД.&lt;/p&gt; &lt;p&gt;Код лямбд вообще не существует в виде исходных файлов. Он создаётся в специализированной среде разработки, основанной на &lt;a href="http://cloudwall.me/" target="_blank"&gt;CloudWall&lt;/a&gt; и &lt;a href="http://ddoc.me/" target="_blank"&gt;Ddoc Lab&lt;/a&gt;. Выглядит это примерно так:&lt;/p&gt; &lt;p&gt;&lt;a href="http://jquerymy.com/dw/Couchbox_4FC8/201707273.52.11.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Снимок экрана 2017-07-27 в 3.52.11" border="0" alt="Снимок экрана 2017-07-27 в 3.52.11" src="http://jquerymy.com/dw/Couchbox_4FC8/201707273.52.11_thumb.png" width="820" height="357"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;То-есть, сорцы, из которых собираются лямбды, хранятся в PouchDB в браузерах разработчиков, реплицируются в CouchDB на какой-то из узлов, собираются, а затем распространяются по остальным узлам. &lt;/p&gt; &lt;h3&gt;Деплой обновлений и скорость разработки&lt;/h3&gt; &lt;p&gt;Такая архитектура расслаивается на три части по критерию обслуживания:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Убунта, CouchDB, Redis, node.js и nginx – фундамент со временем между рестартами в месяцы. Для обновления или рестарта фундамента нужен доступ к каждому узлу через терминал. &lt;/li&gt; &lt;li&gt;Couchbox – платформа приложений с временем между обновлениями сейчас в недели, скоро станет в месяцы. Разрабатывается на файловой системе в обычных IDE, для обновления на узлах нужен доступ через терминал.&lt;/li&gt; &lt;li&gt;Код приложений, очень гибкий, может обновляться и дополняться с высокой частотой. Для разработки и отладки как клиентской (UI), так и серверной части (REST API) приложений не нужно ничего, кроме браузера. Код деплоится по узлам автоматом.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Общий объём кода, написанного в браузере для этой системы, перевалил за 100К SLOC и пока всё просто прекрасно. Стартскрин бэкэнда выглядит сейчас вот так:&lt;/p&gt; &lt;p&gt;&lt;a href="http://jquerymy.com/dw/Couchbox_4FC8/201707274.29.jpg" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Снимок-экрана-2017-07-27-в-4.29" border="0" alt="Снимок-экрана-2017-07-27-в-4.29" src="http://jquerymy.com/dw/Couchbox_4FC8/201707274.29_thumb.jpg" width="821" height="647"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Я, в общем, доволен – это самая сложная штуковина, которую я когда-либо придумывал, и её получилось не просто сделать как задумано, но ещё и в плановые сроки почти уложиться. Как с самой платформой, так и с приложениями на ней.&lt;/p&gt; &lt;p&gt;И да, Couchbox is MIT licensed. Опенсорц наше всё.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=702740" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
</feed>
