Архив недели @gritzko
Понедельник
Контроль захватил @gritzko, distributed systems researcher, автор @swarm_js, Casual Trees CRDT и RFC7574. Пока меняю пароли и читаю приватки
Swarm - это как @apachekafka, только между клиентом и сервером. Шина синхронизации всего со всем. В том числе, реплицированная БД на клиенте
То есть, скачиваем кусок БД на клиента и работаем с ним локально. Читаем, пишем. Синхронизация/мерж автоматические. Offline, real time.
Проект в разработке, путь был тернистым. Классические БД построены на линейном логе, Swarm на частично упорядоченном - новая математика.
В мире, где на одно рыло уже есть по два-три-четыре компа (телефон-планшет-часы) даже однопользовательские приложения нужно синхронизировать
Тренд будет усугубляться. Тесла - айфон на колёсах. Процессор - это просто переплавленный песок. Кстати, про IoT+JS: youtu.be/zsJnsRGh8dE
Вторник
Опрос. Моё веб приложение сильнее всего выиграло/выиграет, если я добавлю...
🤔
21.0%
serverside prerender🤔
31.7%
real time updates🤔
15.9%
data prefetch🤔
31.4%
offline workИду по дороге, вижу - подкова. Поднял, перевернул - а там конь. Это про разработку сложных систем
Среда
Побеждал offline, но ретвит @nikitonsky перетянул голосование в пользу real-time updates. Возможно, из-за tonsky.me/blog/the-web-a… ?
Иллюстрация к статье: у Твиттера одно и то же число в разных частях интерфейса имеет разные значения. 146% synced.
Собственно, @apachekafka и вырос из этой боли: на бэкэнде много разных БД, нужно их между собой синхронизировать. А есть ещё и фронтенд.
ППШ эффективен и надёжен, при этом прост. Хорошая система - простая система. #чтение #9мая vk.com/doc8787281_179…
Оружейники советской школы провели годы в полевых оружейных мастерских. Поэтому их конструкции исключительно просты в обслуживании и надёжны
Вопрос: в какие окопы отправить ребят из facebook?
Если этот твит наберёт 10 лайков, я расскажу @vmakhaev абсолютно всё, что знаю про номера транзакций, лампортово время и вектора версий.
Итак, самый простой способ обозначать версии—порядковый номер: 1,2,3. Так сделано в PostgreSQL, например. Просто и для локальной системы ОК
В распределенной системе трудно понять, кто 2, а кто 3. Поэтому в LWW системах типа Cassandra используют время (timestamp). NTP им в помощь.
Самые суровые timestamps—в Google Spanner. Он ACID, а не LWW, поэтому время там синхронизируется через спутник, чтобы гарантировать порядок.
Еще способ жить с порядковыми номерами в распр системе: координация, Paxos или Raft. Узлы долго договариваются, какая запись 2, а какая 3.
В 2007 в Яндексе мы с Галаховым случайно изобрели Paxos. Казалось просто. Хорошо, писать не стали. Там как УК РФ 131, 3 года содомии минимум
Еще вариант: хэши, как в git. Плюсы: уникальны, гарантия integrity. Минус: порядок (граф) нужно описывать отдельно. Так в CouchDB/pouchdb.
Лампортова модель. Если одним маркером можно изрисовать всё, кроме самого маркера, то двумя маркерами—абсолютно всё! en.wikipedia.org/wiki/Lamport_t…
Лампорт: нумеруем события парой (номер, процесс). Новое событие получает номер +1 от макс известного. Если номер одинаков–процесс разный.
Лампорт пишет, что его логическое время срисовано с теории относительности, поэтому зависит от системы отчета. Для распред.сист.–самое то!
Lamport timestamps, как и обычные номера/стампы, уникальны. Но увы, они показывают отношения "до-после" только для отдельного процесса.
То есть, (5,А) был после (4,А). А был ли он после (4,Б) или одновременно? Непонятно. Тут и становятся нужны Вовины любимые векторные версии.
Векторные версии (часы) - это конструкции вида [5А,4Б,4В,3Д], которые описывают конус прошлого по Минковскому
@avibryant @strlen Yes, very possibly. Basically what I can say definitely is that vector clocks are a failure as an end-user api.
Векторные часы используются внутри AP систем типа Amazon Dynamo или Voldemort, где их размер N, к-во серверов в с-ме twitter.com/jaykreps/statu…
В Swarm, где у каждого клиента есть своя реплика, N неимоверно больше. Это делает векторные часы не очень-то применимыми. Но и без них низя.
Четверг
Кому экосистема, а кому джунгли. Дай-ка ещё обойму. #nodejs
Кстати, кто-то успел побаловаться с virtual-dom? Какие впечатления? github.com/Matt-Esch/virt…
Если этот твит набирает 20 лайков, сегодня-завтра говорим про управление зависимостями. Я не про наркоту, а про git, npm, semver, zeit...
npm–детский сад по сравнению с git. git рассчитан на проект, а npm на экосистему. Но, в git хэш фиксирует все дерево кода побитно, а в npm?
В npm мы в лучшем случае верим честному слову @izs и что он не накосячил нигде. В теории, там можно ставить ссылки на git, конечно...
Это было бы ещё приемлемо с большими пакетами от известных авторов (типа от @facebook), тогда роль npm сводилась бы до хостинга.
Но для микропакетов механизм неадекватный. Ронахер отписался на тему развёрнуто lucumr.pocoo.org/2016/3/24/open…
@dominictarr I had strange idea of per-function dependency mgmt once. Hypertext of functions, all Merkle pinned. Cool, but is it any better?
С крипто на уровне git можно было бы "один пакет=один класс/функция" замутить даже. Но семвер+центральный репо это 👎 twitter.com/gritzko/status…
Исторически, фронтендеры общались только со своим сервером, поэтому упарываться за крипто и безопасность, как подозреваю, традиции ещё нет.
В этот солнечный майский день нужно быть на природе и слушать Джона Бон Джови youtube.com/watch?v=mafbPc…
Пятница
Видна аналогия между микросервисами, микропакетами и микроядром. Вспомним флеймвор Линуса Торвальдса и Э Таненбаума en.m.wikipedia.org/wiki/Tanenbaum…
Система слишком сложна 2. Распилим на маленькие простые кусочки 3. И как теперь разобраться в этих кусочках
Суббота
Ужастик про управление зависимостями на кластере. Фича реализована на трех уровнях: хранения, агрегации и фронта. Каждый - сотни серверов...
Работает неск версий кластера, части как-то друг друга находят. Порой не так. Результаты кэшируются на неск уровнях. "Умный" балансировщик.
В результате, невозможно понять, какой комбинацией версий кода получен наблюдаемый результат. Правки меняют результат случайным образом.
Интересный подход к микропакетам, который вроде никто не пробовал - совместить пакетный менеджер и систему контроля версий.
Потому что если JavaScript, один пакет = один файл, то их функции на 80% перекрываются. Добавим единое дерево файлов по типу Java пакетов...
...тогда юнит-тесты нужно включить в систему и фашистский семвер по методу Стефана Боннеманна.
Из TDD берем "тесты идут-значит, все работает", из Стефана: "если patch-level change ломает зависимости - коммитить нельзя".
Но, в принципе, такой коммунизм можно устроить в одном большом проекте, с кучей либ и таргетов. Интересно, где поломается...
Ценно, что каждую версию приложения и всех его зависимостей можно фиксировать одним хэшем -- их граф, по require(), это готовое Merkle tree.
Так же, возможен diff по всему дереву, с либами. А версиии можно менять у отдельных компонентов - в отличие от глобальных бранчей в git.
То есть, эффект распиливания отсутствует, зато гибкость присутствует. Осталось найти все подковы и грабли...
Воскресенье
Рыночная ниша node.js сильно отличается от того, что задумывал @ry. Зачем browserify или gulp асинх работа с сетью?
Помня, какого шухера наводили Windows-черви в 2000-х, воспринимаю это очень серьёзно infoq.com/news/2016/03/n… infoworld.com/article/304852…
Про червей. В 2001 N.Weaver написал, что умный червь, используя хитрые оптимизации, может заразить интернет за 15мин iwar.org.uk/comsec/resourc…
В 2003 очень простой, даже тупой, SQL Slammer заразил все уязвимые сервера в интернете за 10 минут en.m.wikipedia.org/wiki/SQL_Slamm…
Но эпидемии - это эффектный фейерверк, не более. Мне лично было плохо в 2006, когда хакер пролез в сеть организации
На этой неделе с вами был @gritzko. Итого, +70 фолловеров и один судебный иск от npm Inc. Всем спасибо за внимание!