Brendan Burns — Designing distributed systems

Книга представляет собой обзор паттернов разработки распределенных приложений используя контейнеризацию.

Начинается она с обзора паттернов для случаев, когда контейнеры располагаются на одной физической машине.

Sidecar — второй контейнер рядом с основным, расширяющий его функциональность. Как теория ок. Примеры автор приводит сначала про добавление поддержки https к легаси системе — наверно имеет право на жизнь, если легаси настолько старое, что и правда засунуть его в контейнер будет проще. Следующий пример понравился уже сильно меньше — контейнер который добавляет мониторинг соседнего и некую веб морду с данными о использовании ресурсов. Имхо для таких целей нужен все таки какой-то централизованный мониторинг причем с графиками по времени и т.п. типа как даёт заббикс. Поэтому пример выглядит нежизненным. Третий пример про реализацию доставки изменений через гит репозиторий посредством контейнера который в цикле делает пулл из него. Ну такое. Имхо правильным будет всё-таки когда доставку изменений производит сторонняя система по событию пуша в гит репозиторий, а не трата ресурсов на пулл в цикле.

Дальнейшие рассуждения про то какими должны быть контейнеры, чтобы их можно было переиспользовать хороши, но в целом вытекают из правил для любого модуля, только с поправкой на реалии контейнеров. Внешний интерфейс, документирование, стабильность API и вот это все.

Ambassador — через второй контейнер происходит взаимодействие с внешним миром. От первого примера про шардинг у меня знатно подгорело. Пример собственно про то, что сделаем шардинг редиса так, чтобы для приложения он был как будто один и нам его менять не пришлось. Поднимают 3 независимых редиса, и контейнер-прокси запросы к себе распределяет на них. Ааааа! Кластер редиса делает это сам по себе из коробки, давая при этом ещё и отказоустойчивость. А если заменить редис на какую-то не key-value базу — то там так просто на прокси запросы от приложения не поделишь, совсем приложение не трогая. Другие примеры — сервис-брокер для сервис-дискавери и канареечный релиз / дублирование продакшн трафика на тестовое окружение. Первый да, могу понять, если сервис-дискавери делается не посредством днс. Со вторым так и не смог для себя придумать, когда это было бы полезно делать со стороны клиента, а не сервера принимающего запросы — тестировать то мы будем изменение поведения сервера.

Адаптер. Похоже на амбассадора по сути, но смысл использования — предоставление интерфейса, который основной контейнер не предоставляет. Тут у меня наконец-то вопросов не возникло. И кейсы с мониторингом редиса и изменением формата логов понятные.

Дальше в книге начинаются паттерны для распределенных систем и там уже все выглядит вполне понятно, но в то же время и весьма лайтово (сильно лайтовее книги с кабанчиком). Рассматриваются шардирование, реплики стейтлесс сервисов, scatter/gather паттерн (отправка запросов сразу на несколько серверов и объединение ответа от них в ответ пользователю). Примеры по прежнему не впечатляют, но уже скорее из-за своей простоты. Например пример где делают консистент хешинг на nginx, но при этом на фиксированном в конфиге числе апстримов, учитывая что до этого шла речь про изменение числа шардов, ожидал бы тут какой-то пример, где это самое число шардов можно было бы менять на лету.

Следующая глава посвящена FAAS — function as a service. Общие рассуждения о применимости, удобстве и экономической обоснованности при разной нагрузке полезны. А вот первый предлагаемый пример использования странный — предлагается декоратор по такой схеме: пользователь -> декоратор -> основное приложение. Если декоратор условная лямбда на Амазоне, то если ответ идёт по тому же пути, то декоратор висит все время запроса и мы платим за все это время. Чтобы эта схема была экономически не провальна, мне кажется, нужно усложнять получение ответа от основного приложения в таком сценарии, что никак не согласуется со сценарием — просто добавим декоратор на FAAS, чтобы не править основное приложение.

Выбор мастера и владение (ownership) ресурсом. Первая глава в книге, к которой у меня нет претензий. Более того — она дала мне очень важный инсайт, т.к. на самом деле речь в ней идёт о распределенном локе. Распределенные локи активно используются у нас в коде ( реализованы через редис ). И почему-то раньше я не задумывался о том, чтобы использовать их же для того, чтобы только один наш демон читал определенную очередь (по пулл модели), а думал как-то дополнительно прикручивать zookeper и какой-то более сложный механизм выбора мастера. Глава дала хорошую пищу для размышлений. Также полезной была мысль, что хотя современный оркестратор способен обеспечивать некоторые гарантии fault tolerance, перезапуская упавший контейнер и перенося его с упавшей машины — этого недостаточно при частом деплое.

Последние три главы посвящены очередям и обработке сообщений. Хорошо описано, хотя как по мне поверхностно. Но полезно было взглянуть на это с точки зрения использования контейнеров как замены библиотек.

Общее ощущение от книги — она простовата и наверно скорее полезна как обзорная для новичков. Примеры скорее учебные и не очень близки к реальным. Но в целом прочитать было полезно.

Андрей Курпатов — Красная таблетка

Смешанное впечталение осталось от книги, как от пирожного с песком 🙂

Так что дальше + и — в порядке в каком они приходят в голову:

+ много ссылок на исследования по работе мозга
— почти все из них я уже слышал (не знаю, можно ли это засчитывать в минус книги, но ее ценность для меня оно явно снижает)
— какая-то сумбурность, есть ощущение как будто автор просто скачет с одной мысли на другую, без особой связи между ними (особенно между главами)
— сначала вообще хотел бросить читать, т.к. рассуждения вида «ваше сознание ничем на самом деле не управляет, так что на свою жизнь вы влиять не можете, хаха» — мне не нравятся и я с ними не согласен.
— ближе к концу книги автор как-то переходит на прямо противоположное утверждение, что надо прокачивать мозг, заставлять его думать, при этом или он так и не объяснил, как это сочетается со сказанным им в первой главе, или объяснил как-то так, что я это объяснение не понял и упустил.
+ но при этом понравилась метафора, что сознание — это как фонарь освещающий какую-то часть темноты, в которой на самом деле продолжают параллельно происходить множество других процессов.
+ понравились рассуждения про мультиличность, что не бывает личности самой по себе, а проявляется она в социальном взаимодействии
+ также объяснение прокрастинации в соц. сетях и сравнение ее с подсадкой на наркотик и экспериментом с крысой и кнопкой, возбуждающей дофаминовые центры в мозгу (хотя сравнение и не новое и уже встречалось, но тут как-то хорошо написано)
— ну и несколько раздражала сама манера подачи информации, когда какие-то факты и рассуждения перемежаются снисходительными обращениями к читателю, как будто от лица некоего гуру. Возможно так оно лучше продаётся, не даром автор написал не одну книгу, ставшую бестселлером, но я не в восторге.

Isaac Asimov — Foundation and Empire

Вторая часть классической серии Азимова про Основание.

Книга на самом деле состоит из двух независимых историй. Первая продолжала стиль и характер истории первой книги — космический эпос, стагнирующая империя и Основание, которое побеждает несмотря на всю опасность за счёт внутренних процессов в самой империи.

А вот вторая часть действительно удивила, реальный слом стандартного шаблона — вот мы хорошие люди, в ходе книги происходят всякие сложности, но в конце мы побеждаем. Начинаю понимать популярность серии и берусь за третью книгу 🙂

Martin Kleppmann — Designing Data-Intensive Applications

Долгие годы источником новых знаний в IT для меня был хабрахабр, но или я его перерос или он в последние годы скатился, но что-то стоящее там попадается всё реже и реже. Настолько, что становится жалко времени, которое тратится на перелопачивание новых статей и невольное залипание во всяких статьях, обсуждающих текущие новости, ценность которых, если смотреть даже с небольшого отдаления, стремится к нулю. Достойной замены я ему пока не нашёл, некоторое количество людей в твиттере и медиуме — это всё ещё не то, да и соотношение польза/шум в твиттере не сильно лучше хабра, даже если стараться подписаться на кого-то, от кого прилетает время от времени интересный материал.

В итоге пока решил переключиться на книги, тем более, что книг по специальности я прочёл не так много — в основном потому, что читаю я в основном с читалки или телефона, и специальную литературу в pdf и там и там читать неудобно.

Но технологии не стоят на месте 🙂 Оказалось, что весьма удобную оболочку для чтения книг даёт в своём приложении O’Reilly. К тому же в полном соответствии с мотивационными теориями, если ты за что-то заплатил, то твоя мотивация это использовать заметно повышается 🙂

Это была присказка, а первой прочтённой мной на платформе O’Reilly книгой стала классическая книга с кабанчиком, о которой дальше и пойдёт речь.

Книга действительно настолько хороша, как все о ней говорят. С моим опытом не могу сказать, чтобы там было что-то принципиально новое для меня, но всё равно с некоторыми технологиями я плотно никогда не работал, а о некоторых моментах тех техологий, которые использую в работе, давно не задумывался и освежить их в памяти было очень полезно.

Дальше крупными мазками по содержанию.

Книга состоит из трёх частей. Первая — представляет собой обзор способов хранения и обработки данных в пределах одной машины:

  • Какие бывают БД, как они развивались и для каких задач лучше подходят. Тут очень интересным было читать про графовые БД, так как я сам плотно с ними не работал. Особенно порадовало сходство Datalog и пролога.
  • Как БД хранят данные внутри себя, append-only logs и структуры для индексов — очень подробное и понятное описание, мне конечно тяжело судить, но показалось, что настолько понятное, что его можно было бы читать даже без какого-то бэкграунда
  • Форматы хранения данных — текстовые, бинарные, рассуждения о forward и backward compatibility. Тут интересным было читать про Avro (опять-таки, потому что я с ним не сталкивался ранее 🙂

Вторая — распределенные данные и проблемы возникающие при этом

  • Репликация. Очень подробный обзор — синхронная / асинхронная, с одним лидером и без лидера, проблемы с лагом репликации и способы их решения
  • Партиционирование. Способы шардинга, распределённые индексы, ребалансировка, роутинг запросов.
  • Транзакции. Не просто что такое и зачем, но и трейдоффы, уровни изоляции и как они релизовываются на низком уровне.
  • Проблемы распределённых систем. Одна из самых полезных глав. Что и как может пойти не так — нестабильные сети, процессы на паузе, ненадежное время, разница между монотонным и календарным временем, Byzantine faults (не могу придумать как это корректно перевести на русский таким же коротким термином — возможно, в русском нет подобного термина для неполадок, вызванных поведением частей системы, которые нарочно врут и им нельзя доверять)
  • Распределенные транзакции — двухфазный коммит, алгоритмы консенсуса (без глубокого погружения, но общие принципы, и какие существующие инструменты их реализовывают)

Третья — пакетная и потоковая обработка данных

  • Пакетная обработка (batch processing) — MapReduce и описание какие есть способы осуществления джойнов данных при этом + рассуждения о том насколько оно похоже на Unix утилиты
  • Потоковая обработка (stream processing) — переход от пакетной обработки, message-based и log-based источники данных, change data capture, event sourcing и как и везде в книге — рассуждения о проблемах и трейдофах при потоковой обработке данных, а также как сделать её максимально ошибкоустойчивой (микробатчи, идемпотентность)
  • И последняя глава состоит из рассуждений автора о будущем обработки данных и этических вопросах. Второе неинтересно (т.к. ничего нового, всё те же опасения, и гос. регулирование нас спасёт), разве что стоит отметить сравнение текущего положения со сбором и обработкой данных с ранним капитализмом — детским трудом, 12-часовым рабочим днём и т.п.
    А вот техническая часть главы выглядит интереснее — кругом сплошное телевидение сплошные стримы и данные порождаемые из данных. Интересна идея замены двухфазного коммита на единое сообщение с бизнес-транзакцией пользователя, на основании которой уже все системы (базы данных, поисковые индексы, очереди сообщений и т.п.) делают нужные им изменения состояния, но автор сам отмечает, что тут есть большая проблема с read your own writes, которая по его мнению как-нибудь будет решена (мы же о будущем мечтаем).

В целом очень доволен, что прочёл. Главный плюс книги вижу ещё и в постоянном внимании к тому, что может пойти не так, и какие проблемы есть у таких и эдаких решений. Какая цена будет чтобы их избежать. И не дешевле ли будет позволить системе иногда ошибаться и разработать механизм устранения ошибок постфактум, особенно учитывая то, что информационная система работает с реальным миром, в котором ошибки все равно происходят, поставщики не доставляют товар (даже если он идеально записан во все БД), а сотрудники забывают про задачи клиентов (даже записанные с максимальной надёжностью и доставленные по всем каналам без потерь).

Фернан Бродель. Структуры повседневности: возможное и невозможное

Прочитал первый том труда Фернана Броделя «Материальная цивилизация, экономика и капитализм, XV–XVIII вв.» Очень много информации, очень цельную картина мира в итоге вырисовывается.

Основное понимание, полученное после прочтения — до чего же постоянен и очень медленно изменчив был мир до недавних пор.

Какими были индейские женщины Новой Испании во времена Кортеса в своих длинных, иногда вышитых хитонах из хлопка, а позднее — из шерсти, такими были они и в XVIII в. Мужской костюм, конечно, переменился, но лишь в той мере, в какой победители и их миссионеры требовали пристойного одеяния, скрывающего прежнюю наготу. Как были одеты туземцы в Перу в XVIII в., так же одеты они еще и сегодня: в пончо, квадратный кусок домотканого сукна из шерсти ламы с отверстием в центре, куда человек просовывает голову. Неподвижность царила и в Индии, притом всегда: сегодня, так же как вчера, как давным-давно, индиец одевается в дхоти. В Китае «деревенский люд и простонародье» всегда «изготовляли свою одежду из хлопчатой ткани… самых разнообразных цветов»; в реальности это была длинная рубаха, суженная в талии. 

Цитата про одежду, но в книге множество подобных примеров и про еду, и про строительство и дома и про крайне постепенное и очень медленное развитие технологии, часто встречающее сопростивление.

Далее отдельные запомнившиеся мысли или факты, которые я до этого не знал или что-то слышал, но не очень подробно и не осознавал их полностью.

==Равенство Китая и Европы==

Последние 5-6 веков население Китая и Европы примерно равны, таким образом географически Китай равен Европе в целом. Их суммарная доля в населении всего мира при этом составляла примерно 1/2 или 2/5 мирового.

==XIV век — лучший по уровню жизни==

После Черной смерти середины XIV в. и последовавших за нею и усугубивших ее ударов эпидемий наследства концентрируются в немногих руках. Возделанными остаются только хорошие земли (меньше хлопот и больше продуктивность), уровень жизни и реальная заработная плата выживших повышаются. Именно таким образом начинается в Лангедоке столетие 1350–1450 гг., когда крестьянин со своей патриархальной семьей будет хозяином пустой земли; лес и дикие звери заняли место некогда процветавших здесь деревень

==Ловля трески==

Крупномасштабный лов трески на ньюфаундлендских отмелях с конца XV в. стал настоящей революцией.

Это происходило и в Ла-Рошели на протяжении XVI и XVII вв. — веков процветания. Каждую весну туда заходили многочисленные парусные суда, часто в сотню тонн водоизмещением, потому что требовались довольно просторные трюмы: «Треска не так много весит, как требует много места». На борту находилось 20–25 человек, что указывает на важность рабочей силы при этой неблагодарной работе. Горожанин — судовой агент («bourgeois avitailleur») в кредит снабжал капитана мукой, инвентарем, напитками, солью в соответствии с условиями фрахтовых договоров («chartes-parties»), заверенных у нотариуса. Около Ла-Рошели один только небольшой порт Олонн снаряжал до сотни парусных судов и отправлял к противоположным берегам океана по нескольку тысяч человек ежегодно.
Рыболовные угодья были неистощимы: на большой ньюфаундлендской отмели, бескрайнем подводном плато, едва покрытом водой, у трески было «главное место сбора… Именно здесь она, так сказать, проводит свои праздники, и количество ее там таково, что рыбакам, что собираются там из разных стран, остается лишь с утра до вечера забрасывать лесы, вытаскивать, потрошить выловленную треску и насаживать ее внутренности на крючок, дабы поймать на них другую. Один-единственный человек иной раз берет их за день 300–400 штук.»

==Китайский средневековый флот==

Располагая с XIV в. «большими четырехпалубными джонками, разделенными на водонепроницаемые отсеки, оснащенными четырьмя–шестью мачтами, могущими нести 12 больших парусов, и с командой в тысячу человек», китайцы кажутся при ретроспективном взгляде не имевшими себе равных. При южных Сунах (1127–1279 гг.) они изгнали арабские суда с морских путей в Южно-Китайском море. В XV в. китайские эскадры совершают поразительные плавания под командованием великого евнуха Чжэн Хэ, мусульманина родом из Юньнани. Во время первой экспедиции (1405–1407 гг.) он с 62 крупными джонками дошел до Индонезии. Вторая (1408–1411 гг., 27 тыс. человек, 48 кораблей) завершилась покорением Цейлона, третья (1413–1417 гг.) — завоеванием Суматры, четвертая (1417–1419 гг.) и пятая (1421–1422 гг.) были мирными и закончились обменом дарами и послами. Четвертая достигла Индии, пятая — Аравии и Эфиопского побережья. В ходе быстро закончившегося шестого плавания было доставлено императорское послание правителю и господину Палембанга на Суматре. Последнее, седьмое и, может быть, самое сенсационное плавание началось из гавани Лунван в Нанкине 19 января 1431 г. Остаток этого года флот простоял в расположенных южнее портах Чжэцзяна и Фуцзяни; в 1432 г. путешествие было продолжено через Яву, Палембанг, Малаккский полуостров, остров Ланка и Каликут до Ормуза, который был целью экспедиции и где 17 января 1433 г. флот высадил китайского посла

==Удобство денег из трех металлов для экономики==

Запад сохранил три из них — золото, серебро и медь со всеми неудобствами и преимуществами такого разнообразия. Преимущества: оно отвечало различным потребностям размена; всякий металл с соответствовавшими ему монетами использовался для определенного круга операций. При системе, состоящей из одних золотых монет, было бы трудно оплачивать ничтожные повседневные покупки, а если бы речь шла о системе, ограниченной медью, возникали бы немалые неудобства при крупных платежах. Действительно, каждый металл играл свою собственную роль: золото предназначалось для государей, крупных купцов (даже церкви); серебро — для обычных операций; медь, как и полагается, — для самых низов: это были «черные» деньги простонародья и бедняков.

==Размеры городов==

Ришар Гаскон, имея в виду XVI в., считает, что «шестьсот дворов (т. е. в целом от 2 тыс. до 2500 жителей) были бы, несомненно, довольно удачной нижней границей». Я же думаю, что по крайней мере для XVI в. такая граница чересчур высока; возможно, на Р. Гаскона произвело чрезмерное впечатление сравнительное обилие городов, тяготевших к Лиону. Во всяком случае, в конце средних веков на всю Германию насчитывалось лишь 3 тыс. населенных мест, получивших права города. А ведь их население составляло в среднем 400 человек. То есть обычный порог городской жизни был для Франции, и вне сомнения для всего Запада (исключения лишь подтверждали правило), намного меньше населения Варзи. Так, например, в Шампани в Арси-сюр-Об, которому Франциск I в 1546 г. разрешил окружить себя стенами, — месте расположения соляных складов и центре архидиаконата, — в начале XVIII в. все еще насчитывалось только 228 дворов, т. е. 900 жителей. Шаурс, где были госпиталь и коллеж, в 1720 г. имел 227 дворов, Эруа — 265, Вандёвр-сюр-Барс — 316, Пон-сюр-Сен — 188.