
為什么要使用Google My Business Reviews API
任何解決方案的設計都必須基于對規(guī)則的深刻理解。Twitter API v2采用了多維度、分層次的速率限制策略,主要分為兩種類型:
關(guān)鍵挑戰(zhàn):
/2/tweets/search/recent
(近期搜索)和 /2/tweets/search/all
(全量搜索)的限制完全不同,且與 /2/users/by
(用戶查詢)的限制相互獨立。解決高并發(fā)問題的核心,是建立一個中心化的、分布式的速率限制管理器(Rate Limit Manager)。這個管理器負責跟蹤所有API端點的令牌桶狀態(tài),并為所有并發(fā)工作線程分配合法的請求配額。
對于大多數(shù)應用,使用Redis作為集中式的速率限制狀態(tài)存儲是最佳選擇。Redis的高性能、原子操作和過期時間(TTL)特性非常適合此場景。
我們以 /2/tweets/search/recent
端點為例,假設其限制為450次/15分鐘(Elevated權(quán)限)。
1. Redis鍵設計:
rate_limit:search:recent:window
-> 存儲當前15分鐘窗口的結(jié)束時間戳。rate_limit:search:recent:remaining
-> 存儲當前窗口剩余的請求數(shù)。2. 請求調(diào)度邏輯(Lua腳本保證原子性):
為了避免競態(tài)條件,我們使用Redis Lua腳本來原子性地檢查并扣除令牌。
-- Lua Script: check_and_decrement.lua
local key_remaining = KEYS[1] -- e.g., 'rate_limit:search:recent:remaining'
local key_window = KEYS[2] -- e.g., 'rate_limit:search:recent:window'
local now = tonumber(ARGV[1])
local window_size = 900 -- 15 minutes in seconds
local limit = 450 -- the rate limit
-- Check if the current window has expired
local current_window_end = tonumber(redis.call('get', key_window) or 0)
if current_window_end < now then
-- We are in a new window, reset the count and set new window end
current_window_end = now + window_size
redis.call('set', key_window, current_window_end)
redis.call('set', key_remaining, limit)
end
-- Get the remaining count
local remaining = tonumber(redis.call('get', key_remaining))
if remaining and remaining > 0 then
-- Decrement and allow the request
redis.call('decr', key_remaining)
return 1 -- Allow request
else
return 0 -- Deny request, rate limit exceeded
end
3. 應用層代碼(Python示例):
在發(fā)起API請求前,先調(diào)用該Lua腳本進行檢查。
import redis
import time
redis_client = redis.Redis(host='localhost', port=6379, db=0)
lua_script = redis_client.register_script("""
... (The Lua script from above)
""")
def can_make_request():
keys = ['rate_limit:search:recent:remaining', 'rate_limit:search:recent:window']
now = int(time.time())
# Execute the Lua script atomically
result = lua_script(keys=keys, args=[now])
return bool(result)
# In your worker thread/process
if can_make_request():
# Make the request to Twitter API
response = requests.get('https://api.twitter.com/2/tweets/search/recent', headers=headers, params=params)
# ... process response ...
else:
# Wait or handle the backoff
time.sleep(1) # Simple backoff
如果你的系統(tǒng)是分布式多節(jié)點的,上述方案可以很好地工作,因為所有節(jié)點都共享同一個Redis狀態(tài)。但對于超大規(guī)模采集,單個“桶”可能不夠。Twitter API允許使用多個用戶身份(即多個Bearer Tokens)進行輪詢,每個Token都有自己的限額。
策略:構(gòu)建一個Token池(Token Pool)
rate_limit:token1:search:recent:remaining
)。僅有速率限制管理是不夠的,我們需要一個完整的、松耦合的架構(gòu)來應對高并發(fā)場景。
推薦架構(gòu):消息隊列 + 工作者集群 + 速率限制管理器
Retry-After
header)。這種架構(gòu)的優(yōu)點在于其彈性和可靠性。即使Twitter API臨時出現(xiàn)故障或限流,任務也會安全地留在隊列中,等待工作者恢復處理。
/2/tweets
通過ID批量獲取推文,或者使用 /2/users
批量獲取用戶信息。一次批量請求消耗1次配額,但可以獲取上百個對象的數(shù)據(jù),極大提升了數(shù)據(jù)獲取效率。since_id
和 until_id
參數(shù)進行增量采集,避免重復獲取已處理過的數(shù)據(jù)。對于用戶信息等變化不頻繁的數(shù)據(jù),可以在本地緩存,并設置合理的過期時間,減少不必要的API調(diào)用。Retry-After
,務必遵守它指示的等待時間。高并發(fā)調(diào)用Twitter API是一個典型的“在規(guī)則框架內(nèi)追求效率最大化”的工程問題。粗暴地發(fā)起大量請求只會導致頻繁被限流,最終得不償失。成功的解決方案依賴于一個多層次、系統(tǒng)性的方法:
通過實施上述解決方案,我們成功地為多個客戶構(gòu)建了穩(wěn)定、高效且合規(guī)的Twitter數(shù)據(jù)采集平臺,能夠輕松應對數(shù)百萬甚至上千萬條數(shù)據(jù)的日采集量,為數(shù)據(jù)驅(qū)動的決策提供了堅實保障。這套架構(gòu)和思路,其核心思想(速率限制管理、彈性架構(gòu))也同樣適用于其他具有嚴格API限制的第三方服務,如Shopify、Google Maps、Jira等,具有很高的通用性和參考價值。
為什么要使用Google My Business Reviews API
RESTful Web API 設計中要避免的 6 個常見錯誤
GitHubAPI調(diào)用頻率限制的增加方法
OpenAI Responses API 使用指南:構(gòu)建智能響應的強大引擎
什么是GitHubActions實現(xiàn)開源項目的自動化
使用 Whisper API 通過設備麥克風把語音轉(zhuǎn)錄為文本
如何通過Password Manager(密碼管理器)的API調(diào)用保護賬戶安全
Python與FFmpeg實現(xiàn)視頻壓縮
深入解析 DeepSeek API 密鑰:獲取、使用與最佳實踐