[Перевод] Путь от вычислительной машины к машине координационной
В наши дни существует огромное количество технологий, ориентированных на различные аспекты облачных вычислений. В частности, речь идёт о контейнеризации и микросервисах. Они — причина того, что мы стали воспринимать приложения в виде распределённых систем, компоненты которых можно легко разворачивать и перемещать в облаке. Я полагаю, что то, с чем мы столкнулись сегодня — это революция. Но дело тут не только в технологиях. Сейчас мы стоим на пороге чего-то настолько огромного, что это может изменить то, как мы воспринимаем и понимаем программы и программные инфраструктуры.
Моя идея заключается в том, что нам, для жизни в новых условиях, нужны новые абстракции и концепции. В науке всегда ищут модель, наилучшим образом отражающую суть реальности. Делается это так из-за того, что на базе подобных моделей можно создавать технологии, удовлетворяющие нуждам человечества. То же происходит и в информатике, с её первых дней, когда исследователи начали автоматизировать вычисления — то, на что раньше был способен только человеческий разум. С этого момента понятие «вычислительная машина» всегда использовалось как база для всего того, что связано с автоматизированными вычислениями. На основе этой модели были созданы самые разные технологии.
Здесь я хочу поразмышлять о новой базовой идее, направленной на работу с вычислительными ресурсами, которая лучше согласуется с реальностью облачных вычислений, чем традиционная модель вычислительной машины. То, о чём я хочу поговорить, я называю «коммуникационной машиной» (communication machine).
От машины, построенной для вычислений…
Исторически сложилось так, что компьютеры и прочие вычислительные машины создавались для автоматизации вычислений. Если идти от абака к современному компьютеру, то окажется, что всяческие вычислители всегда создавали для того чтобы расширить вычислительные возможности человека с использованием внешнего устройства. Теория вычислительных машин была разработана Аланом Тьюрингом с использованием созданной им абстрактной вычислительной «Машины Тьюринга», а базовая архитектура вычислительных машин была предложена Фон Нейманом.
Архитектура вычислительной машины
Управление подобной машиной, её программирование, по существу, выполняется с помощью потока битов. Языки программирования появились для того чтобы дать разработчикам инструменты для создания программ, близкие к естественному языку. Такие инструменты призваны были повысить скорость работы и снизить количество ошибок. Все эти языки представляют абстрактные примитивы для описания вычислений, давая программистам широкий спектр возможностей — от возможности описывать выражения до возможности объявлять процедуры, функции, объекты. После компиляции всё это превращается в поток битов, который может привести в действие вычислительную машину. Память, устройство управления, арифметико-логическое устройство — это базовые концепции вычислительной машины.
…вычислительная машина эволюционировала до виртуальной машины…
От тех времён до наших дней компьютеры улучшали ради увеличения их вычислительной мощи. Больше памяти, больше процессоров, более высокие тактовые частоты. Вычислительные возможности реальных компьютеров стали настолько велики, что стала возможной виртуализация. Сегодня единственный реальный компьютер может выполнять сотни экземпляров виртуальных машин, которые могут использоваться разными людьми или организациями, то есть — их можно продавать по-отдельности. Рост рынка виртуализации — это весьма интересное явление, так как это означает, что, в целом, для коммерческих целей не нужна вся вычислительная мощь реальных компьютеров. Вместо этого мы нуждаемся в меньшей, но более доступной вычислительной мощности. Виртуальные машины ценны тем, что их базовые параметры, вроде объёма памяти, количества процессоров, объёма дискового пространства, можно перенастраивать, делая это очень быстро.
Самый интересный аспект виртуальной машины заключается в том, что это — не настоящий компьютер, созданный из аппаратных компонентов. Это — программа, которая даёт тому, кто с ней работает, иллюзию того, что работает он с реальным компьютером. Это — не малозначительный факт, а доказательство того, что существует облачный слой, который даёт нам абстракцию вычислительной машины, нереальной, но ведущей себя так же, как настоящая. Программы, на которых основаны виртуальные машины, созданы именно так для того чтобы дать системным администраторам и программистам что-то такое, что кажется настоящим компьютером, с которым они привыкли работать, но, в то же время, такое, что можно развернуть в удалённом дата-центре.
…а потом — до систем контейнеризации и бессерверных систем…
В наше время эволюция вычислительных машин от реальных компьютеров до виртуальных сделала ещё один шаг вперёд. Следующая ступень эволюции — это контейнеризация. Благодаря контейнеризации мы наконец избавились от иллюзии работы с реальной полнофункциональной вычислительной машиной. Вместо этого мы работаем с неким настраиваемым вычислительным «ящиком».
Реальные вычислительные ресурсы, виртуализация (независимость от аппаратного обеспечения), контейнеризация (независимость от облачных технологий)
Каждый контейнер оснащён минимальным набором средств, необходимых для выполнения конкретных приложений. Ничего лишнего у него нет. Так как мы можем строить стек технологий контейнера по своему желанию, мы способны выбрать именно ту технологию, которая нужна нам для разработки приложения, используя стандартные протоколы и форматы для организации взаимодействия с другими компонентами. Это — важный момент, так каждый контейнер может быть немедленно ассоциирован с его поведением, наблюдаемым извне (тем функционалом, который он предоставляет при обращении к объявленной конечной точке). Это — настолько важно, что можно говорить о том, что часть нашей вычислительной инфраструктуры (контейнер) определяется предоставляемым ей функционалом (программным обеспечением). Всё важнее и важнее становится руководство взаимодействием различных контейнеров, а не реализация вычислений внутри этих контейнеров.
Невероятно важное последствие такого подхода можно видеть в бессерверных архитектурах, когда разработчик занимается исключительно функционалом программ, а решение вопросов развёртывания кода и выделения ресурсов ложится на плечи облачного провайдера. Если дойти до такой крайности, то вычислительная машина больше не существует. Она превращается в объём выделенной памяти и в процессорное время. Единственная проблема подобного подхода заключается в сильной привязке к архитектуре конкретного облачного провайдера. Мы вынуждены использовать технологии, выбранные облачным провайдером. С другой стороны, технологии контейнеризации дают нам большую гибкость, так как они позволяют нам самим выбирать инструменты для проведения вычислений. Именно поэтому ниже я продолжу рассуждения, рассматривая контейнеризацию как опору для новой машины и, таким образом, переступая через бессерверные вычисления, которые я считаю особым случаем того, о чём хочу рассказать.
…дойдя до машины, созданной для коммуникации
Прежде чем мы продолжим, предлагаю обобщить вышесказанное.
Вычислительные системы сегодня и завтра
В наши дни, когда мы работаем с облачным провайдером, нам всё ещё виден уровень абстракции, представленный виртуальными машинами. Но завтра нам будут доступны лишь контейнеры (многие платформы уже работают именно так). В этот момент виртуальные машины перестанут существовать. Будут только контейнеры — океан вычислительных «ящиков», реализующих некий функционал. Они будут новым вычислительным слоем, с которым нам придётся работать. В таком случае речь будет уже идти не о битах, а о связях.
Разработчики, общие компоненты и потребители
Новая машина, на самом деле, будет состоять из огромного количества компонентов, которые должны быть соединены для того чтобы получился бы новый программный функционал. Сделать так, чтобы эти компоненты правильно связывались бы друг с другом, будет одной из основных задач разработчиков. В этом сценарии коммуникация и координация станут важнее, чем вычисления.
Связь компонентов
Эта концепция не нова. В 1980-х годах Робин Милнер разработал исчисление взаимодействующих систем (Calculus of Communicating Systems, CCS), дающее математический аппарат, где вычисления выполняются путём настройки связей между процессами. В то же время были предложены и другие математические способы моделирования взаимодействующих систем. Единственное новое явление, с которым мы столкнулись сегодня это то, что «коммуникационная машина» становится привычной, широкодоступной машиной, которой может воспользоваться кто угодно. Это — не нечто, напоминающее специальный инструмент, применяемый в исследовательской лаборатории. Контейнеры — это строительные блоки подобной машины, а ту роль, которую раньше играли биты, теперь играют взаимодействия между контейнерами.
Новые технологии для новой машины
Если мы примем тот факт, что являемся свидетелями революции, касающейся самых основ вычислений, мы можем приступить к изменению подхода к новой коммуникационной машине и к связанным с ней технологиям. Перед нами стоит большая задача, которая заключается в поиске технологий, которые лучше, чем те, что у нас есть, подходят для программирования подобной машины. Программирование API, архитектура как код, сервис-ориентированные вычисления, микросервисы, хореография — это всего лишь некоторые из понятий, которые нужно принимать в расчёт, рассуждая о будущей эволюции технологий для коммуникационной машины.
К написанию этой статьи меня подтолкнуло участие в создании нового языка программирования (Jolie), тот опыт, который я накопил в ходе работы. Мы начали с математической базы CCS, адаптировав её к сервис-ориентированной модели. Jolie — это язык, где коммуникационные примитивы находятся на том же уровне, что и вычислительные. Работая над Jolie, мы заметили, что примитивы, встроенные в язык, могут упростить коммуникацию и координацию, сокращая время разработки программ и упрощая их поддержку. Это происходит из-за того, что некоторые аспекты программирования встроены в сам язык, а не привнесены в него внешними библиотеками. Более того, при таком подходе разработчику нужен сравнительно небольшой объём знаний для создания распределённых сервис-ориентированных приложений. Дело в том, что разработчикам нужно лишь знать язык, а не, вдобавок к языку, владеть набором библиотек и фреймворков.
Мы находимся в самом начале новой эры информатики и ситуация может очень быстро измениться. Но с полной уверенностью можно говорить о том, что существующий сегодня поход к программированию через некоторое время полностью изменится.
Как вы думаете, правда ли то, что будущее компьютеров — это «координационные машины»?