Данная публикация является логическим продолжением статей других авторов:
Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions
Знакомимся с HTTP-сервисами в OneScript
И новости:
OneScript для «облачных функций» вызвал интерес у 1С-разработчиков
Мой взгляд на это всё)
В ИТ есть тренды, которые придется так или иначе принять. Одним из них являются serverless вычисления, когда вы загружаете свой код в облако и он отрабатывает по определенному событию (расписание, http-вызов и другие события, которые поддерживает конкретный провайдер)
Одна из ссылок выше - это статья Олега Филиппова по теме. В комментариях были разные отзывы: отписались наши "штатные" негативщики, но основная масса поддержала, в том числе, запрос на добавление языка в поддержку Cloud Functions. Причем поддержали так, что общим количеством подавили другие предложения, отправив тему на первое место.
На самом деле, Яндекс функции не включают ряд других языков, и для решения этой проблемы в облако "выкатили" Serverless Containers. Это, по сути, аналог Cloud Functions, только вы используете не готовое окружение, а собираете все, что требуется сами.
Примечание
Все, что касается Yandex Cloud, Docker, Реестры с образами - все берется из документации облака и из интернета. Статей много, повторяться смысла нет.
Есть курс "Инженер облачных сервисов" на Яндекс.Практикуме. Он бесплатный.
Информацию о HTTP в OneScript берем из документации на сайте разработчиков .
Платформа 1С здесь не используется
Теперь к делу
Будем выполнять вот такой код для примера
script.os
Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт
Ответ= Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки("OK");
Возврат Ответ;
КонецФункции
Создадим папку и накидаем в нее файлов:
- script.os - наш код, который должен выполняться
- web.config - параметры приложения
- dockerfile - алгоритм сборки образа
- Bin - бинарники OneScript из аналогичной папки дистрибутива (*.deb)
web.config
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.os" type="OneScript.ASPNETHandler.ASPNETHandler" />
</httpHandlers>
<customErrors mode="Off"/>
</system.web>
<system.webServer>
<handlers>
<add name="OneScript" verb="*" path="*.os" type="OneScript.ASPNETHandler.ASPNETHandler" />
</handlers>
</system.webServer>
<appSettings>
<add key="CachingEnabled" value="false"/>
</appSettings>
</configuration>
dockerfile
FROM ubuntu:16.04
RUN apt-get update -y
RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get -y install tzdata
RUN mkdir /project
WORKDIR /project
COPY web.config ./
COPY script.os ./
WORKDIR /project/Bin
COPY Bin ./
WORKDIR /project
RUN apt-get install mono-complete -y
RUN apt-get install mono-xsp4 -y
ENTRYPOINT xsp4 --port ${PORT} --nonstop
Выполняем сборку и отправляем образ в реестр:
docker build . -t cr.yandex/<Идентификатор реестра>/ubuntu-os:latest
docker push cr.yandex/<Идентификатор реестра>/ubuntu-os:latest
Образ появится в облаке
Можно использовать другой реестр, при желании.
Запускаем код в работу:
Для этого просто выберем образ при создании Serverless Container
Сделаем контейнер публичным, и можно проверять в браузере
Немного цифр
Первый запуск функции превышает секунду. Тарифицируется 1200 мс. В этой части решение уступает, например, функции на .NET Core (400 мс)
Но последующие вызовы близки по времени выполнения и затратам: 5-6 мс (тарифицируется 100 мс - такие условия). Если контейнер не вызывается некоторое время, то опять потребуется "прогрев".
Зачем оно вообще
Я уже больше года использую Cloud Functions на .NET для решения некоторых задач. Пока все укладывается во "Фри тир", поэтому в финансовом плане это дело не обременяет совсем. Мне нравится.
А так... Боты, Алиса, и все, что держали в голове 400+ проголосовавших за фичу, теперь может быть запущено в облаке.