介绍
限制速率是Web应用程序的关键方面,可确保对资源的公平使用并防止滥用。在此博客文章中,我们将探讨如何使用PostgreSQL和PG_HeaderKit扩展名来实施Supabase请求的速率限制。本文是有关优化Supabase性能的系列的一部分,它基于我们先前关于Boosting Supabase Reliability的指南。
supabase是一个强大的后端平台,建立在PostgreSQL之上,依赖于PostgreSQL作为其基础数据库。通过利用PostgreSQL和PG_Headerkit,我们可以有效地控制提出supabase请求的速率,从而确保最佳性能和资源分配。
先决条件
在我们深入实施之前,请确保您有以下先决条件:
-
supabase project :确保您有一个现有的supabase项目,并设置了必要的API端点。
-
PostgreSQL数据库:使用PostgreSQL作为Supabase的后端数据库。如果您尚未使用Supabase设置PostgreSQL,请按照官方文档开始。
-
pg_headerkit :您需要安装PG_Headerkit库。在https://database.dev/burggraf/pg_headerkit上找到有关此库的安装说明和更多信息。
设置环境
在我们深入限制费率之前,让我们确保我们有必要的先决条件:
-
supabase帐户:确保您设置了一个supabase帐户。
-
database.dev :使用https://database.dev/installer安装DBDEV。
接下来,让我们安装并设置PG_HeaderKit:
SELECT dbdev.install('burggraf-pg_headerkit');
CREATE EXTENSION "burggraf-pg_headerkit" VERSION '1.0.0';
创建限制速率基础架构
在本节中,我们将深入研究为您的Supabase-Power应用程序中的速率限制的基本基础架构的过程。费率限制是一种至关重要的机制,它允许您控制对supabase终点的请求数量,确保资源公平使用并维持系统稳定性。
request_log
表
我们从创建request_log
表开始。该表是跟踪和监视传入请求的主要组件。这是我们设置的方式:
CREATE UNLOGGED TABLE request_log (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
ip inet NOT NULL,
timestamp timestamptz DEFAULT NOW()
);
request_log
表有三个基本列:
-
id
:一个自动生成的每个日志条目的唯一标识符。 -
ip
:本列捕获了客户端的IP地址,帮助我们确定每个请求的来源。 -
timestamp
:它记录了每个请求的确切时间,以确保准确跟踪。
register_request
函数
使用request_log
表,我们开始创建register_request
函数。通过记录每个传入请求并将其与客户端的IP地址相关联,此功能在限制速率过程中起着关键作用。这是定义的方式:
CREATE OR REPLACE FUNCTION register_request(ip_in TEXT)
RETURNS VOID
LANGUAGE plpgsql AS $$
BEGIN
INSERT INTO request_log (ip)
VALUES (inet(ip_in));
END;
$$;
register_request
函数将客户端的IP地址作为输入,并将相应的条目插入request_log
表中。此操作确保我们有所有传入请求的全面记录,这对于限制利率和分析至关重要。
随着建立跟踪请求的基础架构,我们现在准备继续前进。在以下各节中,我们将探讨如何设定速率限制并有效地执行它们。
清洁旧要求
为了维持系统的效率,这对于定期清理旧请求日志至关重要。 clean_old_requests
功能负责此任务:
CREATE OR REPLACE FUNCTION clean_old_requests()
RETURNS VOID
LANGUAGE plpgsql AS $$
BEGIN
-- Delete request logs older than 12 hours
DELETE FROM request_log
WHERE timestamp < NOW() - INTERVAL '12 hours';
END;
$$;
此功能可确保我们的数据库保持无混乱,并且仅保留最相关的请求数据。
实施率限制
现在,让我们深入研究在我们的Supabase-Power应用程序中实现速率限制。利率限制对于防止滥用并确保公平资源分配至关重要。我们通过exceeded_rate_limit
和check_rate_limit
函数实现这一目标。
exceeded_rate_limit
功能
exceeded_rate_limit
功能负责检查客户端是否已超过率限制,在此示例中,该示例以每分钟5个请求设置。这是定义的方式:
CREATE OR REPLACE FUNCTION exceeded_rate_limit(ip_in TEXT)
RETURNS BOOLEAN
LANGUAGE plpgsql AS $$
DECLARE
request_count INTEGER;
BEGIN
SELECT count(*) INTO request_count
FROM request_log
WHERE ip = inet(ip_in) AND timestamp > NOW() - INTERVAL '1 minute';
RETURN request_count >= 5; -- limit of 5 requests per minute
END;
$$;
此功能计算客户在最后一分钟内提出的请求数,如果超过限制,则返回true
。
check_rate_limit
功能
check_rate_limit
函数对于强制率限制至关重要。它通过使用register_request
函数来记录当前请求并验证速率限制是否已超过限制来有效地管理速率限制。如果超过限制,则会引起例外:
CREATE OR REPLACE FUNCTION check_rate_limit()
RETURNS VOID
LANGUAGE plpgsql
SET search_path = public, hdr, extensions
SECURITY DEFINER
AS $$
DECLARE
current_ip TEXT := hdr.ip();
request_method TEXT := current_setting('request.method', TRUE);
BEGIN
-- Only log non-GET requests because they are run
-- in read-only transactions
IF request_method IS NULL OR request_method <> 'GET' THEN
PERFORM register_request(current_ip);
END IF;
-- Check if the rate limit has been exceeded
-- and raise an exception if necessary
IF exceeded_rate_limit(current_ip) THEN
RAISE EXCEPTION 'Rate limit exceeded';
END IF;
END;
$$;
此功能是您限制费率策略的关键组成部分,可确保正确监控每个传入请求并防止客户超过其分配的利率限制。重要的是要注意,此功能主要集中于插入操作的速率限制。虽然可以限制获取请求的费率,但它可能会引入性能问题,例如提出插入限制速率数据的网络请求。
配置PG_Headerkit用tostgrest配置
要与您的supabase-power应用程序无缝整合率限制,请配置pgrst.db_pre_request
选项将check_rate_limit
函数用作PostGrest中的pre-request操作:
ALTER ROLE authenticator
SET pgrst.db_pre_request = 'check_rate_limit';
NOTIFY pgrst, 'reload config';
这种配置可确保在执行前向Supabase提出的每个请求都经过费率限制验证,并保证资源的公平和受控使用。现在,我们可以通过向表发送一些帖子请求来测试速率限制:
预定的清理
保持数据库的性能需要定期清理旧请求日志。安排clean_old_requests
功能以自动运行每个午夜:
SELECT cron.schedule(
'clean_old_requests',
'0 0 * * *', -- Run every midnight
$$ SELECT clean_old_requests(); $$
);
此自动清理过程对于保持数据库处于最佳状态至关重要,没有不必要的混乱和确保有效的资源管理。
结论
在这篇全面的博客文章中,我们深入研究了为您的Supabase-Power应用程序实施速率限制的复杂性。利用PostgreSQL和Versatile PG_Headerkit扩展的功能,我们为您提供了逐步指南,以确保公平资源分配并保护您的申请免受滥用。
限制速率是您的武器库中的基本工具,可以保持一流的性能并提供一贯出色的用户体验。凭借本文从本文中获得的知识,您现在已经准备好将速率限制到您的supabase应用程序中。
不要在这里停止;采用本文中讨论的概念并将其调整为您的特定用例。实验,探索和微调限制速率的策略,以完全与您的应用程序的独特要求保持一致。
如果您发现这篇文章很有价值,则可能也有兴趣探索相关主题:
-
Boosting Supabase Reliability: A Guide to Using Postgres Foreign Data Wrappers:学习如何增强supabase应用程序的可靠性。
-
Exploring Data Relationships with Supabase and PostgreSQL:更深入地了解supabase中的数据关系。
-
Safeguarding Data Integrity with pg-safeupdate in PostgreSQL and Supabase:探索在数据库中维护数据完整性的技术。
有关更多信息和指导,请考虑这些有价值的参考。对于任何疑问,反馈或帮助,请随时与我联系。我们在这里为您帮助您限制supabase的掌握费率的旅程。
参考
有关更多信息和指导,请考虑以下有价值的参考:
-
Supabase Official Documentation:探索Supabase的官方文档,以深入了解这个功能强大的后端平台。
-
PostgreSQL Official Documentation:探讨supabase核心的强大数据库系统PostgreSQL的官方文档。
-
pg_headerkit Extension:有关PG_headerkit的更多详细信息,请访问官方GitHub存储库。
-
PostgREST Official Documentation:发现有关此有用工具的其他信息。