Добро пожаловать назад! Это конкретное руководство является частью серии статей о вкладе, развитии и использовании Fn.
Предыдущие сообщения:
- Продвинутые методы программирования на платформе Fn
- Что нового в комплекте разработки функций для Python?
В этом посте я хочу осветить:
- Связь между Fn и функцией (как транспорт, так и формирование запроса)
- Назначение комплектов разработки
Как Fn взаимодействует с функциями?
Ваша функция выполняется внутри контейнера и использует STDIN контейнера для чтения сериализованных запросов, STDOUT для возврата сериализованного ответа и STDERR для записи всех журналов. Чтобы установить связь с функциями, сервер Fn использует собственные API-интерфейсы Docker для работы с потоками ввода-вывода контейнеров. Fn записывает сериализованные запросы в STDIN функционального контейнера и ожидает сериализованный ответ от функционального процесса внутри STDOUT контейнера. Fn использует STDERR функционального контейнера в качестве источника для журналов функции.
FDK обеспечивает удобный фасад, абстракцию более высокого уровня и защищает разработчика функций от необходимости напрямую взаимодействовать с этими нижележащими конструкциями низкого уровня.
Какой формат общения?
Формат связи функции определяет протокол взаимодействия между Fn и функцией. Fn определяет схемы запросов и ответов для функции, которая отвечает за составление допустимых объектов ответа с точки зрения формата.
Fn определяет 4 разных формата: по умолчанию, HTTP, JSON, CloudEvents.
Дефолт
Функция получает тело запроса как на STDIN. Кроме того, функция имеет доступ к параметрам конфигурации приложения и функции. Как и в случае с запросом, тело ответа функции будет отправлено как в STDOUT. Нет никаких жестких правил, которых должен придерживаться орган запроса и ответа.
HTTP
Функция получает сериализованный объект запроса HTTP 1.1. Функция должна возвращать действительный сериализованный объект ответа HTTP 1.1.
JSON
Функция получает сериализованный объект JSON. Взгляните на следующий пример:
{ "call_id": "123", "content_type": "application/json", "deadline":"2018-01-30T16:52:39.786Z", "body": "{\"some\":\"input\"}", "protocol": { "type": "http", "method": "POST", "request_url": "https://localhost:8080/r/myapp/myfunc?q=hi", "headers": { "Content-Type": ["application/json"], "Other-Header": ["something"] } } }
Функция должна ответить следующими данными:
{ "body": "{\"some\":\"output\"}", "content_type": "application/json", "protocol": { "status_code": 200, "headers": { "Other-Header": ["something"] } } }
где body
- это строка JSON, т. е. сериализованное содержимое ответа JSON. Остальные поля были получены из заголовков запросов HTTP 1.1. С протоколом JSON HTTP-запросы должны быть преобразованы в объекты JSON для использования функцией.
CloudEvents
Формат CloudEvents является частью усилий сообщества CNCF по созданию общего формата данных о событиях для облегчения переносимости функций между облачными провайдерами. Более подробную информацию об этом формате можно найти здесь. Fn недавно добавила поддержку CloudEvents. С точки зрения Fn, это похоже на протокол JSON.
Проблемы развития
Как вы могли заметить, каждый протокол требует, чтобы разработчик функции обрабатывал парсинг запросов. Каждый запрос состоит из двух частей:
- данные запроса (в основном, представляют данные запроса вызывающего абонента)
- контекст запроса (специфичные для запроса атрибуты, такие как заголовки и т. д.)
Наличие разработчиков функций, пишущих код для работы с форматами Fn, - не самое эффективное использование их времени. Введите FDK.
В команде Fn мы заботимся о разработчиках. Форматы не создавались так, чтобы создавать проблемы, поэтому мы потратили значительное количество времени на разработку набора библиотек для различных языков программирования, которые мы используем на регулярной основе (мы начали с Java, Go, Python, Ruby). Эти библиотеки были названы наборами для разработки функций - также известными как FDK.
Что такое FDK?
FDK или набор для разработки функций - это набор библиотек, включенных в Fn для упрощения разработки функций. FDK защищает разработчиков от:
- иметь дело с STDIN, STDOUT и STDERR напрямую
- сложности форматов Fn - разбор запроса и сборка ответа, соответствующего форматам Fn, и
- написание логики, чтобы ваши функции оставались горячими
Fn предоставляет FDK с богатой поддержкой различных языков программирования - Java, Go, Python, Ruby, Node и т. Д. Идея FDK заключается в том, чтобы скрыть от разработчиков любую работу, связанную с протоколом, и позволить им сосредоточиться на бизнес-логике кода своей функции ». или «по бизнес-логике функции.
Дизайн
Основная идея FDK состоит в том, чтобы позволить разработчикам сосредоточиться на своей функции и заставить FDK обрабатывать фрейм протокола. Технически FDK запускает три блока внутри бесконечного цикла, который состоит из следующих частей:
- десериализация отформатированного запроса в контекст запроса и данные запроса
- выполнение функции с контекстом запроса и данными запроса
- ответ функции преобразуется в форматированный ответ
Эти три задачи выполняются в бесконечном цикле в следующем порядке, что позволяет Fn обрабатывать больше запросов для одной функции. Эта схема показывает, как Fn должен обрабатывать непрерывные запросы:
incoming request(s) --> infinite loop: - parse request - call a function - write response back ---> outgoing response
Параметры
Чтобы обеспечить разработчикам функций единообразный пользовательский интерфейс, мы решили, что наши FDK должны выглядеть одинаково независимо от используемого языка, за исключением некоторых специфичных для языка функций и / или когда язык предлагает более идиоматический подход (например, Java FDK делает не имеют понятия обработчиков, упомянутых ниже):
- обработчик, который принимает вызываемый объект: fdk.handle ({callable_object})
- вызываемый объект со следующей подписью: (context, data)
Таким образом, сигнатура функции и ее параметры будут выглядеть одинаково независимо от того, на каком языке программирования вы выбрали для написания кода бессерверной функции.
Контекст запроса
Давайте посмотрим, что такое контекст запроса. Контекст запроса является заполнителем для специфичных для запроса данных, таких как заголовки, крайний срок, идентификатор вызова и т. Д. Ниже приведены атрибуты объекта контекста запроса, доступные разработчикам функций в их коде:
Context | |________ AppName (current function's application) | |________ Route (HTTP trigger URI) | |________ CallID (unique ID assigned to the request) | |________ Config (current application + function config) | |________ Headers (request headers, may be an HTTP request headers) | |________ Arguments (may be an HTTP query parameters map) | |________ Format (current function's format) | |________ Deadline (how soon function will be aborted with the | timeout) | |________ ExecutionType (wether function is async or sync) | |________ RequestContentType (request data content type, may be | derived from an HTTP headers | |________ RequestURL (in case of an HTTP triggers would be complete request URL that was used to trigger current function)
Это атрибуты (или методы без параметров), которые вы можете запросить у объекта контекста.
Данные запроса
Данные запроса извлекаются из запроса, используемого для запуска функции. В случае пути вызова HTTP данные представляют собой тело запроса HTTP.
Детали реализации FDK
FDK должен быть спроектирован и реализован так, чтобы скрыть детали базового протокола, и должен обеспечивать согласованное взаимодействие с пользователем. Независимо от указанного формата (http / JSON / CloudEvents / default) и режима выполнения (sync / async), режим программирования, а также взаимодействие с пользователем должны оставаться согласованными для разных FDK.
Go-подобные сериализованные заголовки HTTP
Fn пишется на голанге. Одна из особенностей инфраструктуры HTTP Golang заключается в том, что она имеет собственный тип данных заголовков HTTP, где каждый ключ сопоставлен со списком строк: map[string]string
. Этот тип данных может не быть родным для других языков программирования. Если вы создаете новый FDK, убедитесь, что ваш FDK может безопасно [де] сериализовать HTTP-заголовки Golang при использовании формата JSON или CloudEvent.
Срок выполнения функции
Каждая функция Fn имеет два значения тайм-аута, которые можно настроить через общедоступный API Fn:
- (обычный) тайм-аут: жесткое ограничение для выполнения вызова функции. По истечении этого времени функция должна умереть с таймаутом HTTP 502, если она была вызвана с помощью триггера HTTP.
- тайм-аут простоя: время между двумя запросами к одной и той же функции. При тайм-ауте простоя Fn сохраняет функциональный контейнер подготовленным, но в режиме ожидания, что помогает экономить ресурсы.
Как часть формата JSON или CloudEvent, Fn предоставляет крайний срок, который указывает разработчику функций время, оставшееся до того, как выполнение текущего вызова будет прервано Fn. Крайний срок сохраняется в заголовках HTTP для каждого горячего формата. Это означает, что средство записи FDK должно реализовать фоновый обработчик или оболочку на основе тайм-аута для вызова функции разработчика. Прежде чем истечет время ожидания, FDK должен передать весь кадр протокола, в противном случае функция будет отключена по тайм-ауту.
Тип содержимого по умолчанию
Чтобы сделать FDK совместимым со средой тестирования Fn CLI, тип содержимого по умолчанию в кадре ответа должен быть установлен на application/json
.
Соответствие тестирования Fn CLI
Fn CLI имеет возможность генерировать шаблонный код. Когда вы запускаете fn init, fn генерирует простое сообщение «Hello World!» функция для одного из поддерживаемых языков. Сгенерированный шаблон также имеет файл test.json, который содержит набор входных и соответствующих выходных данных для тестирования черного ящика. Если функция проходит эти тесты, ожидается, что она будет хорошо работать с удаленным Fn API.
Если у вас есть мысли о том, как улучшить функциональное тестирование, сообщите нам об этом !.
Функциональное тестирование с помощью приспособлений FDK
Несколько наших официально поддерживаемых FDK - Java и Kotlin - выходят за рамки этого и используют популярную среду модульного тестирования Java, то есть JUnit. В идеале каждый FDK должен предоставлять аналогичные возможности модульного тестирования для обнаружения регрессии с любым основным или второстепенным выпуском FDK.
Особенности языка программирования в FDK
Большинство языков программирования обладают уникальными функциями, которых нет в других языках. FDK должны предоставлять такие возможности разработчикам функций. Например, FDK Python поддерживает собственные сопрограммы (начиная с Python 3.5 или выше):
import asyncio import fdk async def handler(context, data=None, loop=None): return data if __name__ == "__main__": loop = asyncio.get_event_loop() fdk.handle(handler, loop=loop)
или обещания в FDK Node:
var fdk=require('@fnproject/fdk'); fdk.handle(function(input, ctx){ return new Promise((resolve,reject)=>{ setTimeout(()=>resolve("Hello"),1000); }); })
Здесь вы найдете краткое изложение этого сообщения, точные ключевые выводы, которые мы хотели бы, чтобы вы имели в виду при разработке нового FDK, поэтому:
- FDK позволяет разработчику сосредоточиться на разработке функций, а не на проблемах низкого уровня, таких как транспорты, протоколы и т. Д.
- FDK - это то, что вам нужно, когда функция должна выйти из строя (переключение со значения по умолчанию на любой из форматов JSON, HTTP, CloudEvent).
- UX разработчика - это то, о чем мы заботимся, поэтому модель программирования остается неизменной во всех FDKs, официально поддерживаемых Fn Project.
- FDK может иметь поддержку специфичных для языка программирования функций, таких как async / await в FDK-Python или обещания в FDK-Node.
- У нас есть существующая модель программирования, поскольку концепция FDK была предложена как часть Fn Project, но это не означает, что она всегда будет оставаться неизменной. Fn развивается, что означает, что интерфейс FDK и модель программирования также могут развиваться. Если вы считаете, что существующая модель программирования действительно не соответствует вашим потребностям, не стесняйтесь сообщить нам об этом! Мы открытое сообщество, и отзывы и предложения всегда приветствуются и высоко ценятся!
Вы можете найти следующие ссылки полезными в качестве общего продолжения этого сообщения:
- Взгляните на существующие ФДК.
- Подпишитесь на канал Fn YouTube.
- Чтобы узнать больше о платформе Fn, посетите нашу домашнюю страницу проекта.
Наконец, присоединяйтесь к Fn Army в Slack!