Container — C4 Model

Container

Не Docker! В C4 Model container представляет собой приложение или хранилище данных. Container — это то, что должно быть запущено для работы всей программной системы. На практике container — это что-то вроде:

  • Server-side web application: Java EE web application на Apache Tomcat, ASP.NET MVC на Microsoft IIS, Ruby on Rails на WEBrick, Node.js application и т.д.
  • Client-side web application: JavaScript application в веб-браузере с использованием Angular, Backbone.JS, jQuery и т.д.
  • Client-side desktop application: Windows desktop application с использованием WPF, OS X desktop application на Objective-C, кроссплатформенное desktop application на JavaFX и т.д.
  • Mobile app: Apple iOS app, Android app, Microsoft Windows Phone app и т.д.
  • Server-side console application: Standalone application (например, «public static void main»), batch process и т.д.
  • Serverless function: Одна serverless function (например, Amazon Lambda, Azure Function и т.д.).
  • Database: Schema или база данных в реляционной СУБД, document store, graph database и т.д., таких как MySQL, Microsoft SQL Server, Oracle Database, MongoDB, Riak, Cassandra, Neo4j и т.д.
  • Blob or content store: Blob store (например, Amazon S3, Microsoft Azure Blob Storage и т.д.) или CDN (например, Akamai, Amazon CloudFront и т.д.).
  • File system: Полная локальная файловая система или часть большей сетевой файловой системы (например, SAN, NAS и т.д.).
  • Shell script: Один shell script написанный на Bash и т.д.
  • и т.д.

Container — это по сути runtime boundary вокруг некоторого кода, который выполняется, или данных, которые хранятся. Название «container» было выбрано, потому что я хотел имя, которое не подразумевает ничего о физической природе того, как container выполняется. Например, один Java EE сервер вроде Apache Tomcat может запускать несколько web applications внутри одного Java Virtual Machine, хотя каждое из этих web applications по сути изолировано от других.

FAQ

Почему «container»?

Термины вроде «process», «application», «app», «server», «deployable unit» и т.д. имеют связанные с ними значения, поэтому название «container» было выбрано как общий способ описать что-то, в чего живут components. С одной стороны, неудачно, что контейнеризация стала популярной, потому что многие разработчики теперь ассоциируют термин «container» с Docker. С другой стороны, иногда есть приятное совпадение между container в C4 Model и инфраструктурным (например, Docker) container.

Хотя многие команды успешно используют C4 Model как есть, не стесняйтесь менять терминологию, если это необходимо.

Web applications; один container или два?

Если вы строите server-side web application (например, Spring MVC, ASP.NET, Ruby on Rails, Django и т.д.), которая преимущественно генерирует статический HTML контент, то это один container. Если есть значительное количество JavaScript, доставляемое server-side web application (например, single-page application, построенная на Angular), то это два container.

Хотя при развёртывании server-side web application включает и server-side, и client-side код, разделение client и server на два отдельных container делает явным то, что это два разных process spaces, общающихся через inter-process/remote communication mechanism (например, JSON/HTTPS). Это также даёт основу для масштабирования внутрь каждого container отдельно, чтобы показать компоненты внутри них.

Является ли Java JAR, C# assembly, DLL, module и т.д. container?

Обычно нет. Container — это runtime construct, вроде application; тогда как Java JAR файлы, C# assemblies, DLL, modules и т.д. используются для организации кода внутри этих приложений.

Should data storage services be shown as software systems or containers?

Часто задаваемый вопрос: должны ли сервисы вроде Amazon S3, Amazon RDS, Azure SQL Database, CDN и т.д. показываться как software systems или containers. В конце концов, это внешние сервисы, которыми мы обычно не управляем.

Если вы строите программную систему, которая использует Amazon S3 для хранения данных, это правда, что вы не запускаете S3 сами, но вы владеете и несёте ответственность за используемые вами buckets. Аналогично с Amazon RDS, вы имеете (более или менее) полный контроль над любыми схемами баз данных, которые создаёте. По этой причине, рассматривайте их как containers, потому что они являются неотъемлемой частью вашей software architecture, хотя размещены где-то ещё.


Содержимое основано на c4model.com и лицензировано под Creative Commons Attribution 4.0 International License.