← Cloudflare for Platforms / cloudflare-for-platforms / workers-for-platforms
Как работает Workers for Platforms
Архитектура
Если вы знакомы с Workers, Workers for Platforms включает четыре ключевых компонента: dispatch namespaces, динамические dispatch Workers, пользовательские Workers и, при необходимости, outbound Workers.
Dispatch namespace
Dispatch namespace представляет собой контейнер, который содержит все Workers ваших клиентов. Ваша платформа берёт код, написанный клиентами, а затем отправляет запрос API, чтобы развернуть этот код как пользовательский Worker в пространстве имён, например staging или production. По сравнению с Workers, это обеспечивает:
- Неограниченное количество Workers - На Workers в пространстве имён не распространяются лимиты скриптов на аккаунт
- Изоляция по умолчанию - Каждый пользовательский Worker в пространстве имён выполняется в недоверенный режим : пользовательские Workers никогда не используют общий кэш, даже работая в одной зоне Cloudflare, и не имеют доступа к
request.cfобъект - Динамический вызов - Ваш динамический dispatch Worker может обращаться к любому Worker в пространстве имён с помощью
env.DISPATCHER.get("worker-name")
Динамический dispatch Worker
Dynamic dispatch Worker представляет собой точку входа для всех запросов к вашей платформе. Ваш dynamic dispatch Worker:
- Маршрутизирует запросы - Определяет, какой клиентский Worker должен обрабатывать каждый запрос, исходя из имени хоста, пути, заголовков или других критериев
- Выполняет логику платформы - Выполняет аутентификацию, ограничение частоты запросов или проверку запроса до запуска кода клиента
- Задаёт лимиты для каждого клиента - Обеспечивает соблюдение пользовательские лимиты на время CPU и количество подзапросов в зависимости от типа тарифного плана
- Очищает ответы - Изменяет или фильтрует ответы клиентских Workers
Dynamic dispatch Worker использует привязка dispatch namespace для вызова пользовательских Workers:
export default {
async fetch(request, env) {
// Determine which customer Worker to call
const customerName = new URL(request.url).hostname.split(".")[0];
// Get and invoke the customer's Worker
const userWorker = env.DISPATCHER.get(customerName);
return userWorker.fetch(request);
},
};User Workers
User Workers содержат код, написанный вашими клиентами. Клиент отправляет свой код на вашу платформу, после чего вы выполняете запрос API для развёртывания user Worker от его имени. User Workers развёртываются в dispatch namespace и вызываются вашим dynamic dispatch Worker. Вы можете предоставить user Workers привязки для доступа к KV, D1, R2 и другим ресурсам Cloudflare.
Outbound Worker (необязательно)
Одна исходящий Worker перехватывает fetch() запросы, отправленные пользовательскими Workers. Используйте его для:
- Контролируйте исходящий трафик - Блокируйте или разрешайте внешние вызовы API из кода клиента
- Логирование запросов - Отслеживайте, к каким внешним сервисам обращаются клиенты
- Изменение запросов - Добавляйте заголовки аутентификации или преобразуйте запросы, прежде чем они покинут вашу платформу
Жизненный цикл запроса
- Запрос поступает на ваш dynamic dispatch Worker (например,
customer-a.example.com/api) - Ваш dynamic dispatch Worker определяет, какой user Worker должен обработать запрос
- Dynamic dispatch Worker вызывает
env.DISPATCHER.get("customer-a")чтобы получить пользовательский Worker - Пользовательский Worker выполняется. Если он делает внешние
fetch()вызовов и настроен outbound Worker, эти запросы сначала проходят через outbound Worker. - Пользовательский Worker возвращает ответ
- Ваш dynamic dispatch Worker может по желанию изменить ответ перед его возвратом
Workers for Platforms в сравнении с Service bindings
Как Workers for Platforms, так и Service bindings обеспечивают взаимодействие между Workers. Используйте Service bindings, если вы точно знаете, каким Workers нужно взаимодействовать друг с другом. Используйте Workers for Platforms, если user Workers загружаются вашими клиентами динамически.
Вы можете использовать оба варианта одновременно: ваш dynamic dispatch Worker может обращаться к внутренним службам через Service bindings и одновременно отправлять запросы user Workers в namespace.