Skip to content
Queues

使用 Edge Functions 消费 Supabase 队列消息

Learn how to consume Supabase Queue messages server-side with a Supabase Edge Function

本指南帮助你使用 Supabase Edge Function 在服务器端读取和处理队列消息。想了解我们 API 的更多细节,请阅读 Queues API 参考。

🌐 This guide helps you read & process queue messages server-side with a Supabase Edge Function. Read Queues API Reference for more details on our API.

概念 #

🌐 Concepts

Supabase Queues 是一个基于拉取的消息队列,主要由三个组件组成:队列、消息和队列类型。你应该已经熟悉 队列快速入门。

🌐 Supabase Queues is a pull-based Message Queue consisting of three main components: Queues, Messages, and Queue Types. You should already be familiar with the Queues Quickstart.

在 Edge 函数中消费消息 #

🌐 Consuming messages in an Edge Function

这是一个 Supabase Edge 函数,它会从队列中读取 5 条消息,处理每条消息,并在处理完成后删除每条消息。

🌐 This is a Supabase Edge Function that reads 5 messages off the queue, processes each of them, and deletes each message when it is done.

import 'jsr:@supabase/functions-js/edge-runtime.d.ts'
import { createClient } from 'npm:@supabase/supabase-js@2'
const supabaseUrl = 'supabaseURL'
const supabaseKey = 'supabaseKey'
const supabase = createClient(supabaseUrl, supabaseKey)
const queueName = 'your_queue_name'
// Type definition for queue messages
interface QueueMessage {
msg_id: bigint
read_ct: number
vt: string
enqueued_at: string
message: any
}
async function processMessage(message: QueueMessage) {
//
// Do whatever logic you need to with the message content
//
// Delete the message from the queue
const { error: deleteError } = await supabase.schema('pgmq_public').rpc('delete', {
queue_name: queueName,
msg_id: message.msg_id,
})
if (deleteError) {
console.error(`Failed to delete message ${message.msg_id}:`, deleteError)
} else {
console.log(`Message ${message.msg_id} deleted from queue`)
}
}
Deno.serve(async (req) => {
const { data: messages, error } = await supabase.schema('pgmq_public').rpc('read', {
queue_name: queueName,
sleep_seconds: 0, // Don't wait if queue is empty
n: 5, // Read 5 messages off the queue
})
if (error) {
console.error(`Error reading from ${queueName} queue:`, error)
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
headers: { 'Content-Type': 'application/json' },
})
}
if (!messages || messages.length === 0) {
console.log('No messages in workflow_messages queue')
return new Response(JSON.stringify({ message: 'No messages in queue' }), {
status: 200,
headers: { 'Content-Type': 'application/json' },
})
}
console.log(`Found ${messages.length} messages to process`)
// Process each message that was read off the queue
for (const message of messages) {
try {
await processMessage(message as QueueMessage)
} catch (error) {
console.error(`Error processing message ${message.msg_id}:`, error)
}
}
// Return immediately while background processing continues
return new Response(
JSON.stringify({
message: `Processing ${messages.length} messages in background`,
count: messages.length,
}),
{
status: 200,
headers: { 'Content-Type': 'application/json' },
}
)
})

每次运行这个 Edge 函数时,它会:

🌐 Every time this Edge Function is run it:

  1. 从队列中读取5条消息
  2. 调用 processMessage 函数
  3. processMessage结束时,消息会从队列中删除
  4. 如果 processMessage 抛出错误,错误会被记录下来。在这种情况下,消息仍然在队列中,所以下一次这个 Edge Function 运行时,它会再次读取这条消息。

你可能会发现这种设置在配合 Supabase Cron 使用时很方便。你可以设置 Cron,让每隔 N 分钟或秒,Edge Function 就会运行并处理队列中的一些消息。

🌐 You might find this kind of setup handy to run with Supabase Cron. You can set up Cron so that every N number of minutes or seconds, the Edge Function will run and process a number of messages off the queue.

同样,你可以在任何时候通过 supabase.functions.invoke 命令调用 Edge 函数。

🌐 Similarly, you can invoke the Edge Function on command at any given time with supabase.functions.invoke.