Отзыв о книге Брендана Бернса "Распределенные системы. Паттерны проектирования"
Прочитал в отпуске книгу Брендана Бёрнса “Распределённые системы. Паттерны проектирования”. Книга небольшая по объёму, в большей степени обзорная. Можно прочитать за пару дней, покачиваясь на верхней полке вагона поезда…
![](/post/2022/04/01/designing-distributed-systems/featured_hue5e22fb9fd7d0fa09e877bbe8b081df1_707619_1200x2500_fit_q75_h2_lanczos.webp)
Представленные в книге паттерны демонстрируются на примере организации контейнеров и их управлении средствами Kubernates. Это неудивительно, автор книги - один из создателей Kubernates.
Во введении автор рассматривает историю подходов к разработке информационных систем, рассуждает о ценности паттернов, как основы общего языка для обсуждения подходов к разработке, отмечает преимущества повторного использования общих компонентов. С этим сложно поспорить. Действительно, наличие общего языка ускоряет коммуникацию между участниками проектной команды, снижает вероятность недопонимания и неоднозначности при общении. В свою очередь и повторное использование компонентов может дать существенный прирост в скорости разработки и, что не менее важно, в удобстве сопровождения. Автор отмечает, что разработка, которая ориентирована на построение повторно используемых компонентов, позволяет улучшить качество каждого из них, поскольку в используемом многими людьми коде более высока вероятность обнаружения ошибок и недостатков.
По ходу повествования в книге рассматриваются одноузловые паттерны (Sidecar, Ambassador, Adapter), вопросы кеширования, репликации и шардирования данных, понятия stateless и stateful, распределение нагрузки через scatter/gather. Также вкратце читатель коснётся FaaS-систем и реализации распределённых блокировок на основе etcd. Завершается книга описанием того, как организовать пакетную обработку очереди задач.
В целом можно назвать эту книгу справочником-шпаргалкой, в которую можно заглянуть, прочитать краткое описание подхода, чтобы потом погрузиться в тему, изучая более специализированную литературу и документацию. На мой взгляд, для читателя, который ранее не сталкивался с построением распределённых систем, не знаком с контейнерами и системами их оркестрации, книга может показаться сложноватой.
С другой стороны некоторые описываемые варианты реализации рассматриваемых паттернов выглядят излишне усложнёнными. Kubernates в этих примерах - молоток, которым пытаются решить все задачи и проблемы, как подходящие, так и не очень. У начинающего специалиста может сложиться впечатление, что вот он единственный верный вариант реализации и нужно делать так и никак иначе. Этого стоит опасаться.
Каждый раз, читая очередную книгу, я радуюсь, когда узнаю что-то новое, что может мне в дальнейшем пригодиться, или понимаю, что раньше что-то понимал неправильно, а теперь всё встаёт на свои места. Благодаря этой книге впервые услышал про кеширующий сервер Varnish Cache и его возможности. И чуть лучше разобрался в разнице между паттернами Sidecar и Ambassador. Раньше, вероятно под влиянием того, что для Istio ресурс, называемый Sidecar, по сути описывает прокси-сервер, который обеспечивает входящую и исходящую связь для контейнера-соседа, у меня было представление, что паттерн Sidecar как раз и описывает такое поведение. А согласно книге всё немного иначе:
- Sidecar - добавление новых возможностей контейнеру-соседу;
- Ambassador - скрытие для контейнера-соседа всех сложностей взаимодействия со внешними сервисами.
В заключении скажу, что главная трудность со всей этой паттерной историей, на мой взгляд, заключается в том, чтобы какой-то один источник получил повсеместное распространение и доминировал над всеми другими вариантами описаний тех же вещей. Иначе вместо единого общего языка мы получим множество “стандартов”, в которых будет сложно ориентироваться не только новичкам, приходящим в индустрию, но и мастодонтам. Примерами таких успешных трудов являются “Паттерны объектно-ориентированного проектирования”, “Шаблоны интеграции корпоративных приложений” (загляните на сайт https://www.enterpriseintegrationpatterns.com/), язык моделирования UML. Встанет ли книга “Распределенные системы. Паттерны проектирования” в один ряд с ними? Мне пока не очевидно. Для тех, кто будет спрашивать совета с чего начать изучать подходы к разработке распределённых систем, я скорее порекомендую для начала книгу Алекса Сюй “System Design. Подготовка к сложному интервью”.