Spec-Zone.ru › Deno 2

Перенос обработки вебхуков в очередь

В веб-приложении часто желательно перенести обработку асинхронных задач, для которых клиенту не нужен мгновенный ответ, в очередь. Это позволяет поддерживать вашу веб-приложение быстрым и отзывчивым, вместо того, чтобы тратить ценные ресурсы на ожидание завершения длительных процессов.

Один из случаев, где вы можете применить эту технику, — это обработка вебхуков. Немедленно после получения запроса вебхука от нечеловеческого клиента, которому не нужен ответ, вы можете перенести эту работу в очередь, где она будет обработана более эффективно.

В этом учебнике мы покажем, как применить эту технику при обработке запросов вебхуков для репозитория GitHub.

Попробуйте в игровой площадке

✏️ Посетите эту игровую площадку, которая реализует обработчик вебхуков репозитория GitHub.

Используя игровые площадки Deno Deploy playgrounds, вы можете мгновенно развернуть собственный обработчик вебхуков GitHub, который использует очереди и Deno KV. Мы рассмотрим, что делает этот код чуть позже.

Настройка вебхуков GitHub для репозитория

Чтобы попробовать запущенный вами вебхук на игровой площадке, настройте новую конфигурацию вебхука для репозитория GitHub, которым вы управляете. Конфигурацию вебхуков можно найти в разделе «Настройки» вашего репозитория.

configure a github webhook

Обзор кода

Функция нашего обработчика вебхуков относительно простая — без комментариев, она содержит всего 23 строки кода. Она подключается к базе данных Deno KV, настраивает слушатель очереди для обработки входящих сообщений и настраивает простой сервер с Deno.serve, который отвечает на входящие запросы вебхуков.

Прочитайте комментарии ниже, чтобы узнать, что происходит на каждом шаге.

server.ts
// Get a handle for a Deno KV database instance. KV is built in to the Deno
// runtime, and is available with zero config both locally and on Deno Deploy
const kv = await Deno.openKv();

// Set up a listener that will handle work that is offloaded from our server.
// In this case, it's just going to add incoming webhook payloads to a KV
// database, with a timestamp.
kv.listenQueue(async (message) => {
  await kv.set(["github", Date.now()], message);
});

// This is a simple HTTP server that will handle incoming POST requests from
// GitHub webhooks.
Deno.serve(async (req: Request) => {
  if (req.method === "POST") {
    // GitHub sends webhook requests as POST requests to your server. You can
    // configure GitHub to send JSON in the POST body, which you can then parse
    // from the request object.
    const payload = await req.json();
    await kv.enqueue(payload);
    return new Response("", { status: 200 });
  } else {
    // If the server is handling a GET request, this will just list out all the
    // webhook events that have been recorded in our KV database.
    const iter = kv.list<string>({ prefix: ["github"] });
    const github = [];
    for await (const res of iter) {
      github.push({
        timestamp: res.key[1],
        payload: res.value,
      });
    }
    return new Response(JSON.stringify(github, null, 2));
  }
});

© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/deploy/kv/tutorials/webhook_processor

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API