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

Модель программирования
Таким образом, наиболее подходящей моделью программирования являются асинхронные программы передачи сообщений с типом отказоустойчивости восстановление после сбоя. В таблице 1 показаны некоторые из различных процессов, типов связи и неисправностей, описанных в литературе (Нэнси Линч, Аттия и Уэлч). Вы можете создавать различные типы распределенных систем, выбирая один тип свойства из каждой строки в таблице, например: синхронная, общая память, система восстановления после сбоя.

Таблица 1:
Типы процессов:
Синхронный / Асинхронный
Типы связи:Общая память / Передача сообщений
Типы ошибок: Неудачная остановка / Неудачное восстановление / Византийский

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

Формальные методы
Сложность и тонкость распределенных алгоритмов требуют более формальных методов проверки их конструкции, выходящих за рамки ручного отслеживания и написания тестов. Чтобы рассуждать о них, были придуманы алгебры процессов. Также начинают использоваться такие языки, как TLA+ (Как AWS использует формальные методы).

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

Также есть возможность использования приемов из физики. Может оказаться полезным знакомство со сложными системными явлениями в том виде, в каком они изучаются физикой.

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

История и эволюция
Хорошо иметь мимолетное знание истории области. Если разработчик желает выйти за рамки того, что предлагают учебники, в Интернете доступно множество сборников статей» (Кристофер Мейкеджон, Дан Крес, Тред на Quora). Однако рекомендуется не использовать их в качестве основного средства изучения распределенных вычислений.

Реализация
В какой-то момент вышеуказанные алгоритмы должны быть реализованы в коде. Язык реализации должен иметь хорошую поддержку передачи сообщений, асинхронного программирования, библиотек, связанных с примитивами распределенной системы (Слайд 17 из этой презентации AWS), работу в сети, обмен сообщениями и обработку ошибок. Важно не упускать из виду традиционные проблемы разработки программного обеспечения, такие как безопасность типов, объектная ориентация, модульная конструкция, неизменность и так далее. Программист должен уметь решать соответствующие проблемы системного программирования по мере их возникновения — планирование процессов, сетевое взаимодействие, ввод-вывод и т. д.

Распределенные системы обычно работают в сочетании с базами данных и аналитическими продуктами. Так что понимание их основ будет полезно.

Применимые домены
Стоит спросить, действительно ли существуют такие системы, в которых все эти идеи вступают в игру. Большинство программных работ, как правило, небольшие и поэтапные по своей природе. Сложные проблемы, связанные с распределенными системами, часто возникают только тогда, когда замышляются и проектируются новые системы. Во многих таких ситуациях будет достаточно готовых решений, таких как Hadoop, Zookeeper, HBase и т. д. Итак, куда можно обратиться для работы над такими проблемами?

  • Очевидный ответ — крупные облачные игроки (AWS, GCP, Azure), которые одновременно консолидируют долю рынка и продолжают расти.
  • Еще одна область, где необходимы такие знания, — это приложения с критическими требованиями к надежности и производительности, например: медицинские системы, авионика (см. раздел Значение формальных методов для «реальных систем» в документе AWS), банковское дело.
  • Развивающимся рынком для этих идей являются услуги, которые управляют кластерами компьютеров — будь то локальное облако или один из основных поставщиков. Эти услуги помогают оптимально выделять ресурсы, развертывать программное обеспечение и контролировать его производительность и стоимость. Примеры — Kubernetes, Hashicorp и Mesos. В своей основе они решают проблему распределенных систем.
  • Даже в компаниях, занимающихся разработкой приложений, которые предпочитают использовать готовые компоненты, наличие доступа к строительным блокам более низкого уровня и умение правильно их использовать, возможно, может привести к более инновационным способам их комбинирования, большей настраиваемости существующих систем и, как следствие, гибкости благодаря к обоим вышеперечисленным.
  • Новые бизнес-идеи могут появиться там, где структурированное распределенное системное решение может значительно улучшить неэффективное до сих пор специальное решение.

Онлайн-курсы
По понятным причинам ни один онлайн-курс не может охватить все вышеперечисленные темы. Тем не менее, некоторые курсы, которые затрагивают части алгоритмов и протоколов, — это курс MIT OCW по распределенным алгоритмам и курс распределенных систем профессора Индранила Гупты в UIUC.