<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Первый рукописный блог рунета™</title>
  <link>https://ermouth.dreamwidth.org/</link>
  <description>Первый рукописный блог рунета™ - Dreamwidth Studios</description>
  <lastBuildDate>Thu, 27 Jul 2017 01:52:40 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>ermouth</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/11294976/2595908</url>
    <title>Первый рукописный блог рунета™</title>
    <link>https://ermouth.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>https://ermouth.dreamwidth.org/702740.html</guid>
  <pubDate>Thu, 27 Jul 2017 01:52:40 GMT</pubDate>
  <title>Couchbox</title>
  <link>https://ermouth.dreamwidth.org/702740.html</link>
  <description>&lt;p&gt;Месяц назад мы запустили публичную бету &lt;a href=&quot;https://vezdelegko.ru/&quot; target=&quot;_blank&quot;&gt;vezdelegko.ru&lt;/a&gt;, сервиса бронирования экскурсий, отелей и транспорта. Сервисы бронирования – сами по себе штука сложная, это как магазин, по которому надо вести учёт ассортимента на каждый день, причём ассортимент день ото дня меняется и цены зависят от дня и количества. Причём в магазине куча отделов, и партнёры сами управляют своим ассортиментом. &lt;/p&gt; &lt;p&gt;Дополнительно, в нашем случае сервис делался с прицелом на очень существенную масштабируемость как по ёмкости, так и по географии. Это автоматом предполагает архитектуру из многих узлов и распределённое хранение/обработку данных с последующей их репликацией и агрегацией. Под такую схему я придумал специальную архитектуру узла, которая потребовала платформы исполнения, это и есть &lt;a href=&quot;https://gitlab.com/Couchbox/couchbox&quot; target=&quot;_blank&quot;&gt;Couchbox&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://gitlab.com/Couchbox/couchbox/&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px&quot; title=&quot;Снимок экрана 2017-07-27 в 2.26.24&quot; border=&quot;0&quot; alt=&quot;Снимок экрана 2017-07-27 в 2.26.24&quot; src=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707272.26.24.png&quot; width=&quot;800&quot; height=&quot;221&quot;&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=&quot;https://aws.amazon.com/ru/lambda/details/&quot; target=&quot;_blank&quot;&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=&quot;http://cloudwall.me/&quot; target=&quot;_blank&quot;&gt;CloudWall&lt;/a&gt; и &lt;a href=&quot;http://ddoc.me/&quot; target=&quot;_blank&quot;&gt;Ddoc Lab&lt;/a&gt;. Выглядит это примерно так:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707273.52.11.png&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Снимок экрана 2017-07-27 в 3.52.11&quot; border=&quot;0&quot; alt=&quot;Снимок экрана 2017-07-27 в 3.52.11&quot; src=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707273.52.11_thumb.png&quot; width=&quot;820&quot; height=&quot;357&quot;&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=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707274.29.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;Снимок-экрана-2017-07-27-в-4.29&quot; border=&quot;0&quot; alt=&quot;Снимок-экрана-2017-07-27-в-4.29&quot; src=&quot;http://jquerymy.com/dw/Couchbox_4FC8/201707274.29_thumb.jpg&quot; width=&quot;821&quot; height=&quot;647&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=ermouth&amp;ditemid=702740&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://ermouth.dreamwidth.org/702740.html</comments>
  <category>javascript</category>
  <category>es6</category>
  <category>design</category>
  <category>ide</category>
  <category>jquerymy</category>
  <category>cloudwall</category>
  <category>mysoft</category>
  <category>couchbox</category>
  <category>inliner</category>
  <category>couchdb</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
</channel>
</rss>
