Приложение двенадцати факторов

Публикация № 1326342

Разработка - Языки и среды

12 факторов twelve factor app методология микросервис saas

Тенденции современности - это SaaS и микросервисы. Про SaaS не слышал только ленивый, но на всякий случай, Ленивый, это для тебя: SaaS это облачная модель работы с сервисами по подписке. У 1С это технология 1С:Фреш. Но мы поговорим не о SaaS и не об 1С:Фреш, а о методологии "Приложение двенадцати факторов", которая родилась для облегчения жизни разработчикам SaaS приложений. Вы спросите: "А где здесь про 1С?". Давайте разберемся.

Внимание, много букв и нет картинок :). 

Современные тенденции склоняются от монолитов в сторону микросервисной архитектуры. Приложения, разработанные на платформе, можно тоже отнести к сервисам или к набору сервисов. Из приведенных в методологии "Приложение двенадцати факторов" (The Twelve-Factor App) рекомендаций что-то уже нами используется. А кто-то вообще скажет: "Все это и ежику понятно!". Будем считать, что эта статья не для ежиков, а для сусликов. Для тех сусликов, которым это поможет получить новые или структурировать существующие знания для разработки еще более современных и совершенных сервисов.

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

1.Кодовая база
Одна кодовая база, отслеживаемая в системе контроля версий, – множество развёртываний.

Платформа 1С:Предприятие предоставляет собственную систему контроля версий - Хранилище конфигурации, а так же внедряются механики работы с git. Используя конфигурацию, разработанную на платформе, можно развернуть несколько экземпляров приложения.

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


2. Зависимости
Явно объявляйте и изолируйте зависимости.

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

Данный пункт частично применим. Дистрибутив платформы предложит установить, например, "Microsoft Visual C++ 2015 Redistributable", но об отсутствии драйвера "MS SQL Native Client" мы узнаем уже в формате ошибки. Понятно, что вендор не знает в каком формате или на какой БД мы ходим работать. Отменяет ли это возможность наличия инструментов быстрой настройки?

В типовых решениях некоторые внешние компоненты поставляются как макеты двоичных данных в составе конфигурации.

В собственных решениях можно использовать следующее:
- дополнительные внешние библиотеки можно сохранять как макет двоичных данных в конфигурацию;
- если они требуют установки в систему, то лучше разработать механизм быстрого развертывания, позволяющий по "нажатию волшебной кнопки" осуществлять все необходимые для этого действия (regsv32, regasm, choco install или что-либо другое);


3. Конфигурация
Сохраняйте конфигурацию в среде выполнения

Необходимо разделять код приложения и настройки, которые могут меняться между разными развертываниями. Это относится, например, к реквизитам или идентификаторам доступа как внешним по отношению к инфраструктуре, так и внутренним ресурсам, параметры среды исполнения (dev, test, prod).

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

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


4. Сторонние службы (Backing Services)
Считайте сторонние службы (backing services) подключаемыми ресурсами

Любые сторонние по отношению к нашему приложению службы - это подключаемые ресурсы. Если мы перемещаем/заменяем локальный ресурс или выносим его в облако, то наше приложение должно продолжить работу - достаточно изменить настройки подключения. Ресурсы можно по необходимости отключать и подключать.

В какой-то степени платформа реализует этот подход. Например, с настройками подключения к хранилищу конфигураций, подключением ИБ в кластер, перемещение БД с одного сервера на другой. Работа с RAS и сервисы кластера так же отнесем сюда.

В решениях на платформе работой с ftp, почтой и другими внешними службами не зависит от их расположения.


5. Сборка, релиз, выполнение
Строго разделяйте стадии сборки и выполнения

Код обязательно должен пройти 3 этапа:
- этап сборки - код трансформируется в исполняемый пакет
- этап релиза - сборка объединяется с текущей конфигурацией
- этап выполнения - запуск приложения

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


6. Процессы
Запускайте приложение как один или несколько процессов, не сохраняющих внутреннее состояние (stateless)

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

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

Платформа запускает несколько независимых процессов кластера. Данные, которые должны стать доступны всем процессам сохраняются в служебных файлах настроек кластера, а все остальное существует либо в памяти процессов, либо во временных файлах.

В разработанных на платформе приложениях использование многопоточной обработки данных все еще слабо распространенный прием. Фоновые задания конечно используются, но скорее именно как "задания в фоне", которые не блокируют интерактивную работу с приложением. Может быть это так из-за слабого понимания подходов к разделению данных между процессами и их синхронизации?


7. Привязка портов (Port binding)
Экспортируйте сервисы через привязку портов

Приложение должно быть самодостаточным и реализовывать внутренние сервисы без необходимости развертывания внутри себя веб-сервера. Если приложение внутри себя контейнеризирует несколько сервисов, то каждый сервис необходимо предоставлять через отдельный порт.

Платформа реализует сервисы кластера через привязку портов.

С точки зрения платформенных приложений кажется здесь обсуждать особо нечего. Публикация возможно только с использованием сторонних веб-серверов. Разнесение опубликованных сервисов по портам технически возможно.


8.  Параллелизм
Масштабируйте приложение с помощью процессов

Для исполнения разного рода работы необходимо использовать отдельные процессы. Масштабируемость достигается путем запуска процессов разного типа в нескольких экземплярах. За счет свойств изоляции из п.6 обеспечивается простота и надежность параллельной работы.

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

Решения на платформе, как уже было отмечено в п.6 не изобилуют параллельными вычислениями. Есть куда расти.


9. Утилизируемость (Disposability)
Максимизируйте надёжность с помощью быстрого запуска и корректного завершения работы

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

Может мне так везло, но кластер не всегда является образцовым представителем этого пункта методологии. Перезапуск службы может быть быстрым. А может и не быть. Перезапуск процессов может быть быстрым. А может и не быть. Но работа в этом направлении ведется в каждом релизе платформы, так что считаю пункт засчитан.

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


10. Паритет окружений разработки и продуктива (Dev/prod parity)
Держите окружения разработки, промежуточного развёртывания (staging) и рабочего развёртывания (production) максимально похожими

Необходимо обеспечивать:
- минимальное различие между кодом разработки и продакшена; например, путем увеличения частоты деплоев и использованием инструментов быстрой доставки изменений;
Понятно, что накапливать различия между кодом разработки и продакшена не стоит, на моей практике бывало всякое - это зависит от внутренних процессов команды разработки;
- к развёртыванию изменений в продакшене привлекать тех же людей, которые реализовывали изменения; тот кто делает задачу может лучше понимать специфику ее деплоя;
DevOps-инженер в среде 1С как Йети: следы есть, но толком никто не видел. Исторически сотрудники поддержки 1С были Бухгалтер-Консультант-Менеджер-Программист-Администратор-Сетевик в одном лице, так что в пункт про "привлечение одних и тех же людей" мы укладываемся %). Ну а если серьезно, то сфера 1С постепенно подтягивается к современным технологиям и тенденциям непрерывного развертывания.
- среды разработки и продакшена должны быть максимально идентичными в плане используемых стеков и инструментов; разрабатывать на Postgres, а в продакшен катить на MS SQL - это вилы;
Этот пункт в 1С прям по дефолту включен, учитывая вопрос: "А что вам еще и отдельный сервер для разработки нужен?" :)


11. Журналирование (Logs)
Рассматривайте журнал как поток событий

Необходимо рассматривать лог как поток событий в стандартный поток вывода (stdout), по которому можно отслеживать поведение приложения. Само приложение не заботится о задаче сбора данных из потока вывода и хранения собранных данных.

Считаем, что через сервис журнала регистрации платформа обеспечивает для приложения такой формат :)

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


12. Задачи администрирования
Выполняйте задачи администрирования/управления с помощью разовых процессов

Для выполнения отдельных задач администрирования/управления или исполнения скриптов используются отдельные разовые процессы.

Платформа реализует, например, фоновое обновление конфигурации БД как отдельный процесс.

Приложения на платформе могут использовать фоновые задания для изоляции административных действий над системой. Ключевое слово "могут".


Что мы получаем в итоге? Рассмотрев существующие примеры можно сказать, что методология и так уже где-то рядом. По заявлению разработчиков: "Методология двенадцати факторов может быть применена для приложений, написанных на любом языке программирования". Пригодятся ли идеи описанные в методологии каждый решит сам. По моему мнению методология применима, пусть и с рядом допущений: "это же 1С!"

Подробнее почитать про методологию можно узнать из источника 12factor[точка]net или погуглив "приложение 12 факторов".

Специальные предложения

Оставьте свое сообщение

См. также

reperr - автоматическая регистрация ошибок для 8.3.17+

Управление задачами OneScript v8 Бесплатно (free)

Представляю вашему вниманию приложение для автоматической регистрации и обработки ошибок, которые возникают при работе в информационных базах на платформе 1С:Предприятие 8.3.17+

04.02.2021    4665    ovcharenko.di    4    

Смена паролей всем локальным пользователям Windows с помощью OneScript

Windows OneScript Пароли Бесплатно (free)

Скрипт, который меняет пароли всем локальным пользователям Windows и сохраняет их в файле. Есть функция генерации пароля, можно задать длину пароля.

18.08.2020    725    info1i    7    

Как программисту перейти с языка 1С Предприятие на Java

ООП Языки и среды Россия Бесплатно (free)

Как изучить язык Java, зная язык 1С.

06.01.2020    15306    ManyakRus    294    

Swagger для 1С.

OneScript WEB Бесплатно (free)

Решение для формирования Swagger спецификаций, описывающих HTTP сервисы конфигураций 1С.

21.10.2019    14634    botokash    47    

Автоматическое сравнение-объединение баз данных с мини-конфигурацией

OneScript v8 Бесплатно (free)

Представляю вашему вниманию скрипт на OneScript для автоматического сравнения-объединения по правилам ("мержевания") конфигураций нескольких баз с мини-конфигурацией.

14.10.2019    3170    artkor    2    

АИТП. Подсистема взаимодействия с рабочими серверами OneScript

OneScript v8 Бесплатно (free)

В статье описан механизм взаимодействия конфигурации АИТП с рабочими серверами OneScript.

22.05.2019    5551    blackhole321    33    

1Script.Web. Интернет-приложения на языке 1С

WEB OneScript Инструментарий разработчика v8 Бесплатно (free)

Запросы рынка таковы, что любое современное клиент-серверное приложение должно иметь веб-интерфейс. Почему бы не писать такие приложения на языке 1С? Андрей Овсянкин расскажет о возможностях разработки веб-приложений на базе 1Script, рассмотрит перспективы этого направления и в качестве демонстрации покажет «боевое» веб-приложение на новом движке – кроссплатформенную консоль администрирования парка кластеров 1С.

20.05.2019    21236    Evil Beaver    33    

Создание высокодоступной фермы рабочих серверов OneScript в ОС Centos 7

OneScript Бесплатно (free)

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

14.05.2019    4890    blackhole321    0    

Разворачиваем рабочий сервер OneScript для конфигурации АИТП

OneScript v8 Бесплатно (free)

В статье описана методика развертывания рабочего сервера OneScript для конфигурации АИТП, на ОС CentOS 7.

09.05.2019    6439    blackhole321    0    

Хостим OneScript.Web приложение (heroku)

OneScript Бесплатно (free)

Развертывание oscript.web в heroku.

19.12.2018    6719    pallid    6    

Хостим OneScript.Web приложение

OneScript Бесплатно (free)

Удобная возможность для размещения своего OneScript.Web приложение, это завернуть его в docker. Остается вопрос: где разместить контейнер, сделать это можно на vscale или DO, но хочется упростить и не делать установку самого docker на хосте. Один из вариантов - это сервис now https://zeit.co/.

04.07.2018    7930    pallid    3    

Добавляем онлайн-чат в web-приложение OneScript

OneScript v8 Бесплатно (free)

В статье рассмотрено подключение онлайн-чата к web-приложению на основе http-сервисов OneScript

24.06.2018    7737    blackhole321    1    

Сказ про то, как я DevOps-ом занимался (OneScript, Deployka, Jenkins)

OneScript DevOps Jenkins v8 1cv8.cf ИТ-компания Бесплатно (free)

Решаем задачу: автоматизировать обновление тестовых баз 1С из хранилища конфигурации при появлении в нём новых изменений. Данная статья родилась в муках хождения по граблям и поиска безопасного форватора среди подводных камней. Изложение постарался представить в виде инструкции для новичка, в которой собрал всё, с чем пришлось столкнуться. Сам я не DevOps-ер, ни на что не претендую, просто делюсь опытом :)

17.06.2018    23418    stas_ganiev    36    

Макеты в http-сервисах OneScript

OneScript v8 Бесплатно (free)

В статье описана библиотека, реализующая механизм макетов в http-сервисах OneScript, аналогично платформе 1С:Предприятие.

03.06.2018    8570    blackhole321    1    

Перечисления в http-сервисах OneScript

OneScript v8 Бесплатно (free)

В статье описывается библиотека, реализующая механизм перечислений в http-сервиах OneScript, аналогичный механизму платформы 1С:Предприятие

03.06.2018    8085    blackhole321    13    

Обработки в http-сервисах OneScript

OneScript Бесплатно (free)

В статье описана библиотека, реализующая механизм обработок в http-сервисах OneScript.

25.05.2018    7750    blackhole321    0    

Расширенные методы загрузки внешних библиотек в http-сервисах OneScript

OneScript Бесплатно (free)

В статье описаны расширенные методы загрузки внешних библиотек в http-сервисах OneScript на примере механизма фоновых заданий.

25.05.2018    7698    blackhole321    0    

Сборка, тестирование, доставка приложения на onescript с помощью gitlab-ci

OneScript v8 1cv8.cf Бесплатно (free)

Сборка, тестирование, доставка приложения на onescript с помощью gitlab-ci на примере портирования на onescript функции daСклонение.

14.05.2018    13484    pallid    7    

OneScript в облаке или Развертываем http-сервис OneScript на хостинге

OneScript Бесплатно (free)

В статье описан процесс развертывания web-приложения, созданного на базе http-сервисов OneScript на бесплатном хостинге.

05.05.2018    9830    blackhole321    0    

TMSSQL - работа с базами данных MS SQL Server в скриптах на OneScript и из командной строки

OneScript v8 Бесплатно (free)

Представляю вашему вниманию библиотеку TMSQL для работы с базами данных на MS SQL Server. Библиотека подключается в качестве модуля или класса в скрипты, написанные на OneScript, а также может работать как независимое консольное приложение.

26.04.2018    15215    Tavalik    22    

Развертывание http-сервиса OneScript на Raspberry Pi

OneScript Бесплатно (free)

В статье описан процесс настройки, а также процесс развертывания http-сервиса (web-приложения) OneScript на Raspbian (Raspberry Pi 2).

23.04.2018    11341    blackhole321    10    

Создаем свою библиотеку для OneScript

OneScript v8 Бесплатно (free)

Как упаковать свою библиотеку в пакет? Что такое загрузчик и зачем он нужен? Как вообще создать свою библиотеку? Разбираемся на примере.

06.03.2018    22821    nixel    36    

Развертывание http-сервиса (web-приложения) OneScript на Ubuntu Server 16.04

OneScript Бесплатно (free)

В статье описан процесс настройки сервера, а также процесс развертывания http-сервиса (web-приложения) OneScript на Ubuntu Server 16.04

04.03.2018    16044    blackhole321    14    

Обзор имеющихся библиотек OneScript

OneScript v8 Бесплатно (free)

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

14.11.2017    46713    nixel    87    

Начало работы с OneScript

OneScript Бесплатно (free)

Краткая инструкция по установке и начале работы с OneScript. Пишу потому что сам много шишек набил, пока нашел все инструменты. В статье рассмотрены: 1) Установка OneScript. 2) Установка редактора кода. 3) Настройка редактора кода под OneScript. 4) Запуск скриптов из редактора кода 5) Полезные ссылки

18.10.2017    46741    DmitrySinichnikov    54    

С чего начать разработку скриптов на OneScript? Первые шаги

OneScript Бесплатно (free)

После моего доклада на INFOSTART 2017 EVENT COMMUNITY ко мне многие обращались с таким вопросом: с чего начать разработку скриптов на OneScript? В этой статье привожу набор ссылок и некий порядок действий (как его вижу я) для людей, не знакомым с этим инструментом.

11.10.2017    26451    Tavalik    14    

Вебинтерфейс для OneScript и 1С

OneScript v8 Россия Бесплатно (free)

Пример создания вебинтерфейса для OneScript с использованием библиотеки UfaScript.osb

30.06.2017    14035    andreosh    7    

OneScript и Ajax. POST-запрос и мои дальнейшие планы с фантазиями о будущем

OneScript v8 Россия Бесплатно (free)

Моя библиотека для OneScript (версия 3.0 от 09.06.2017 см.GitHab UfaScript) https://github.com/andreosh/UfaScript теперь позволяет посылать POST-запросы на сервер без использования сторонних библиотек типа jquery.

09.06.2017    18074    andreosh    3    

Как сделать OneScript объектно-ориентированным

OneScript Россия Бесплатно (free)

Описание метода создания объектов на OneScript и метода передачи функции в качестве параметра.

16.04.2017    8552    andreosh    7