M2FaaS Transparent and fault tolerant FaaSification of Node.js monolith code blocks
- ссылаются на статьи, которые показывают повышение производительности при декомпозиции монолита на микросервисы
- выдвигается предположение, что выделение конкретных частей монолита в FaaS также должно способствовать повышению производительности
- FaaSификация - процесс конвертации монолита в бессерверную архитектуру
- разработчики испытывают затруднение перевода частей монолита в FaaS по следующим причинам:
- необходимость настройки зависимостей каждой функции
- ограничения, связанные с отсутствием состояния (stateless) у бессерверных функций: время исполнения, размер кода и данных ввода/вывода и количество одновременных вызовов
- рутина в настройке FaaS в нескольких регионах и провайдерах
- авторы определяют 3 вида зависимостей, которые должны быть рассмотрены для FaaSификации монолита
- зависимости пакета (package dependencies), они должны быть запакованы вместе с функцией для её корректной работы
- зависимости кода (code dependencies), это вызовы методов из других файлов приложения, поэтому данные файлы тоже должны войти в сборку функции
- зависимости данных (data dependencies), все переменные в коде должны быть объявлены и определены в правильной области видимости, также должна быть налажена синхронизация данных переменных между остальной частью FaaSифицированного монолита и бессерверной функцией
- при этом извлеченные бессерверные функции могут испытывать проблемы с отказоустойчивостью из-за проблем с сетью, троттлинга, ограничений поставщиков услуг и ошибками со стороны API
- существует 2 подхода к интеграции бессерверных вычислений
- оставить для пользователя прозрачность в взаимодействии, интерфейс FaaSифицированного приложения должен быть аналогичным прошлой версии
- место расположения вычислений не должно быть важно пользователю, при этом разработчикам необходимо обеспечить работу в требуемых регионах, это приводит к повторной настройке FaaS для каждого отдельного региона и провайдера
- изменить интерфейс так, чтобы появилась возможность динамической конфигурации FaaS во время исполнения приложения
- статья представляет фреймворк M2FaaS, который автоматизирует FaaSификацию монолита и пытается устранить обнаруженные проблемы FaaSификации
- фреймворк совмещает в себе 2 подхода интеграции бессерверных вычислений: сохраняет текущий интерфейс, но при этом позволяет возможность динамической настройки FaaS во время исполнения
- инновационный подход в данном фреймворке
- синхронизация глобальных и локальных переменных между FaaS и FaaSифицированным монолитом
- повышенная отказоустойчивость при помощи определения резервных провайдеров FaaS для функции
- в случае отказа всех альтернатив будет выполнен код монолита
- возможность детальной настройки каждого FaaS
- ограничения
- поддерживается только JavaScript
- разработчикам необходимо тратить время на ручную аннотацию функций
- сложность выбора ограничений ресурсов конкретного FaaS
- монолиты часто используют глобальные переменные, но для корректной работы придется переписать код использующий их
- критика
- синхронизация локальных и глобальных переменных - сложная и опасная работа
- аннотации занимают очень много места, из-за чего труднее читать исходный код
- сравнение времени интеграции фреймворков для сравнения - странная идея, потому что у M2FaaS банально будет преимущество из-за того, что авторы статьи знают как им пользоваться
- В статье ссылаются на работы, которые предлагают другие способы декомпозиции монолита
- монолит можно разбить на микросервисы, при этом повыситься производительности и стоимость аренды ресурсов, при этом внедрение FaaS повышает производительность и повышает стоимость только при непосредственном использовании
- монолит можно FaaSифицировать, при этом разработчикам приходится тратить много времени на разрешение зависимостей и переписывание методов, зависимости которых не могут быть автоматически устранены FaaSификатором