← Cloudflare Queues / queues / configuration
JavaScript API
Cloudflare Queues интегрирован с Cloudflare Workers. Для отправки и получения сообщений необходимо использовать Worker.
Worker, который может отправлять сообщения в очередь, называется Worker-производителем. Worker, который может получать сообщения из очереди, называется Worker-потребителем. При желании один и тот же Worker может одновременно выступать в роли производителя и потребителя.
В будущем мы планируем поддержать и другие API, например HTTP-эндпоинты для отправки и получения сообщений. Чтобы сообщить об ошибке или предложить новую функцию, перейдите в Cloudflare Community Forums ↗. Чтобы оставить отзыв, перейдите в #queues ↗ канал Discord.
Производитель
Эти API позволяют Worker-производителю отправлять сообщения в очередь.
Пример записи одного сообщения в очередь:
export default {
async fetch(req, env, ctx) {
await env.MY_QUEUE.send({
url: req.url,
method: req.method,
headers: Object.fromEntries(req.headers),
});
return new Response("Sent!");
},
};interface Env {
readonly MY_QUEUE: Queue;
}
export default {
async fetch(req, env, ctx): Promise<Response> {
await env.MY_QUEUE.send({
url: req.url,
method: req.method,
headers: Object.fromEntries(req.headers),
});
return new Response("Sent!");
},
} satisfies ExportedHandler<Env>;from workers import Response, WorkerEntrypoint
class Default(WorkerEntrypoint):
async def fetch(self, request):
await self.env.MY_QUEUE.send({
"url": request.url,
"method": request.method,
"headers": dict(request.headers),
})
return Response("Sent!")API Queues также поддерживает запись нескольких сообщений одновременно:
const sendResultsToQueue = async (results, env) => {
const batch = results.map((value) => ({
body: value,
}));
await env.MY_QUEUE.sendBatch(batch);
};const sendResultsToQueue = async (results: Array<unknown>, env: Env) => {
const batch: MessageSendRequest[] = results.map((value) => ({
body: value,
}));
await env.MY_QUEUE.sendBatch(batch);
};async def send_results_to_queue(results, env):
batch = [
{"body": value}
for value in results
]
await env.MY_QUEUE.sendBatch(batch)Queue
Привязка, которая позволяет производителю отправлять сообщения в очередь.
interface Queue<Body = unknown> {
send(body: Body, options?: QueueSendOptions): Promise<QueueSendResult>;
sendBatch(messages: Iterable<MessageSendRequest<Body>>, options?: QueueSendBatchOptions): Promise<QueueSendResult>;
metrics(): Promise<QueueMetrics>;
}-
send(body: unknown, options?: {contentType?: QueuesContentType })Promise<QueueSendResult>- Отправляет сообщение в очередь. Тело сообщения может быть любого типа, поддерживаемого алгоритм структурного клонирования ↗, если его размер меньше 128 КБ.
- После выполнения промиса подтверждается, что сообщение записано на диск.
- Возвращает QueueSendResult содержащий метрики очереди в реальном времени.
-
sendBatch(messages: Iterable<MessageSendRequest<unknown>>, options?: QueueSendBatchOptions)Promise<QueueSendBatchResult>- Отправляет пакет сообщений в очередь. Каждый элемент в предоставленном Iterable ↗ должен поддерживаться алгоритм структурного клонирования ↗. Пакет может содержать до 100 сообщений, при этом каждый элемент ограничен 128 КБ, а общий размер массива не может превышать 256 КБ.
- Необязательный
optionsможно использовать для применения настроек (например,delaySeconds) ко всем сообщениям пакета. См. QueueSendBatchOptions. - После выполнения промиса подтверждается, что сообщения записаны на диск.
-
metrics()Promise<QueueMetrics>- Возвращает в реальном времени QueueMetrics для очереди.
MessageSendRequest
Тип-обёртка, используемый для отправки пакетов сообщений.
interface MessageSendRequest<Body = unknown> {
body: Body;
contentType?: QueueContentType;
delaySeconds?: number;
}-
bodyunknown- Тело сообщения.
- Тело может быть любого типа, поддерживаемого алгоритм структурного клонирования ↗, если его размер меньше 128 КБ.
-
contentTypeQueueContentType- Явный тип содержимого сообщения, позволяющий корректно просматривать его с помощью Просмотр сообщений в панели Cloudflare функции. Необязательный аргумент.
- См. QueuesContentType для получения возможных значений.
-
delaySecondsnumber- Количество секунд для отложить сообщение внутри очереди, прежде чем оно будет доставлено потребителю.
- Должно быть целым числом от 0 до 86400 (24 часа).
QueueSendOptions
Необязательные параметры, применяемые при отправке сообщения в очередь.
-
contentTypeQueuesContentType- Явный тип содержимого сообщения, позволяющий корректно просматривать его с помощью Просмотр сообщений в панели Cloudflare функции. Необязательный аргумент.
- На данный момент эта настройка предназначена только для внутреннего использования. В будущем
contentTypeбудет использоваться альтернативными типами потребителей, чтобы явно пометить сообщения как сериализованные и получать их в нужном типе. - См. QueuesContentType для получения возможных значений.
-
delaySecondsnumber- Количество секунд для отложить сообщение внутри очереди, прежде чем оно будет доставлено потребителю.
- Должно быть целым числом от 0 до 86400 (24 часа). Установка этого значения в ноль явно запрещает задержку сообщения, даже если на уровне очереди задана глобальная задержка по умолчанию.
QueueSendBatchOptions
Необязательные параметры, применяемые при отправке пакета сообщений в очередь.
-
delaySecondsnumber- Количество секунд для откладывать сообщения внутри очереди, прежде чем оно будет доставлено потребителю.
- Должно быть положительным целым числом.
QueuesContentType
Тип-объединение, включающий допустимые типы содержимого сообщения.
// Default: json
type QueuesContentType = "text" | "bytes" | "json" | "v8";- Используйте
"json", чтобы отправить объект JavaScript, который можно сериализовать в JSON. Этот тип содержимого можно предварительно просмотреть на Панель управления Cloudflare ↗.jsonтип содержимого используется по умолчанию. - Используйте
"text", чтобы отправитьString. Этот тип содержимого можно предварительно просмотреть с помощью Просмотр сообщений в панели Cloudflare функция. - Используйте
"bytes", чтобы отправитьArrayBuffer. Этот тип содержимого нельзя предварительно просмотреть из Панель управления Cloudflare ↗ и будет отображаться в кодировке Base64. - Используйте
"v8", чтобы отправить объект JavaScript, который нельзя сериализовать в JSON, но который поддерживается структурированное клонирование ↗ (например,DateиMap). Этот тип содержимого нельзя предварительно просмотреть из Панель управления Cloudflare ↗ и будет отображаться в кодировке Base64.
Если указан недопустимый тип содержимого или указанный тип не соответствует фактическому типу содержимого сообщения, операция отправки завершится ошибкой.
QueueSendResult
Результат успешной операции отправки.
interface QueueSendResult {
metadata: {
metrics: QueueMetrics;
};
}-
metadataobject- Содержит метаданные об очереди после выполнения операции отправки.
-
metadata.metricsQueueMetrics- Метрики очереди в реальном времени. См. QueueMetrics.
QueueMetrics
Метрики очереди в реальном времени.
interface QueueMetrics {
backlogCount: number;
backlogBytes: number;
oldestMessageTimestamp: number;
}-
backlogCountnumber- Текущее количество сообщений в очереди.
-
backlogBytesnumber- Общий размер сообщений в очереди, в байтах.
-
oldestMessageTimestampnumber- Временная метка (в миллисекундах с начала эпохи) самого старого сообщения в очереди.
Потребитель
Эти API позволяют Worker-потребителю получать сообщения из очереди.
Чтобы определить Worker-потребителя, добавьте queue() функцию в экспорт по умолчанию Worker. Это позволит ему получать сообщения из очереди.
По умолчанию все сообщения в пакете подтверждаются, как только выполняются все перечисленные условия:
-
queue()функция вернёт управление. - Если
queue()функция вернула promise, этот promise будет разрешён. - Любые промисы, переданные в
waitUntil()будут разрешены.
Если queue() функция выбросит исключение, либо пока возвращённый ею promise или любой из promise, переданных в waitUntil() были отклонены, весь пакет считается неуспешным и будет повторно обработан в соответствии с настройками повторных попыток потребителя.
export default {
async queue(batch, env, ctx) {
for (const message of batch.messages) {
console.log("Received", message.body);
}
},
};interface Env {
// Add your bindings here
}
export default {
async queue(batch, env, ctx): Promise<void> {
for (const message of batch.messages) {
console.log("Received", message.body);
}
},
} satisfies ExportedHandler<Env>;from workers import WorkerEntrypoint
class Default(WorkerEntrypoint):
async def queue(self, batch):
for message in batch.messages:
print("Received", message) env и ctx поля указаны как описано в документации Workers.
Типы сообщений TypeScript
Вы можете типизировать сообщения очереди с помощью Queue<T> для производителя и ExportedHandler<Env, T> для потребителя.
type MyMessage = {
id: string;
};
interface Env {
MY_QUEUE: Queue<MyMessage>;
}
export default {
async queue(batch) {
for (const message of batch.messages) {
console.log(message.body.id);
}
},
} satisfies ExportedHandler<Env, MyMessage>;Для примитивных сообщений используйте Queue<number> или satisfies ExportedHandler<Env, number>. Если вы не укажете тип, message.body это unknown.
Либо, как альтернативу, потребителя очереди можно написать, используя устаревший синтаксис service worker:
addEventListener('queue', (event) => {
event.waitUntil(handleMessages(event));
});В синтаксисе service worker event предоставляет те же поля и методы, что и MessageBatch, как описано ниже, в дополнение к waitUntil() ↗.
MessageBatch
Пакет сообщений, отправляемых Worker-потребителю.
interface MessageBatch<Body = unknown> {
readonly queue: string;
readonly messages: readonly Message<Body>[];
ackAll(): void;
retryAll(options?: QueueRetryOptions): void;
}-
queuestring- Имя очереди, которой принадлежит эта партия.
-
messagesMessage[]- Массив сообщений в пакете. Порядок сообщений обеспечивается по мере возможности, то есть не гарантируется полное соответствие порядку их публикации.
-
ackAll()void- Помечает каждое сообщение как успешно доставленное, независимо от того,
queue()обработчик потребителя завершается успешно или нет.
- Помечает каждое сообщение как успешно доставленное, независимо от того,
-
retryAll(options?: QueueRetryOptions)void- Помечает каждое сообщение для повторной попытки в следующем пакете.
- Поддерживает необязательный
optionsобъект.
Message
Сообщение, отправляемое Worker-потребителю.
interface Message<Body = unknown> {
readonly id: string;
readonly timestamp: Date;
readonly body: Body;
readonly attempts: number;
ack(): void;
retry(options?: QueueRetryOptions): void;
}-
idstring- Уникальный ID сообщения, создаваемый системой.
-
timestampDate- Отметка времени отправки сообщения.
-
bodyunknown- Тело сообщения.
- Тело может быть любого типа, поддерживаемого алгоритм структурного клонирования ↗, если его размер меньше 128 КБ.
-
attemptsnumber- Количество попыток потребителя обработать это сообщение. Отсчёт начинается с 1.
-
ack()void- Помечает сообщение как успешно доставленное, независимо от того,
queue()обработчик потребителя завершается успешно или нет.
- Помечает сообщение как успешно доставленное, независимо от того,
-
retry(options?: QueueRetryOptions)void- Помечает сообщение для повторной попытки в следующем пакете.
- Поддерживает необязательный
optionsобъект.
QueueRetryOptions
Необязательные параметры, используемые при пометке сообщения или пакета сообщений для повторной попытки.
interface QueueRetryOptions {
delaySeconds?: number;
}-
delaySecondsnumber- Количество секунд для отложить сообщение внутри очереди, прежде чем оно будет доставлено потребителю.
- Должно быть положительным целым числом.
-
После выполнения промиса сообщения записываются на диск.
- Возвращает QueueSendResult содержащий метрики очереди в реальном времени.