我可以使用 Cloudflare Workers 来批处理请求吗?
Can I use Cloudflare Workers to batch requests?
我想记录通过 Cloudflare 向我的网站发出的请求。我想我可以使用 Cloudflare Workers 来执行此操作,但我不想通过向我的站点发出的每个请求都向它发出请求来拒绝我的日志记录服务。我可以让 Worker 捆绑日志记录报告,并且每 10 或 100 只向我发出请求吗?
回答我自己的问题,是的,你可以做到!您必须使用 event.waitUntil
添加一个任务,该任务将在原始请求得到响应后 运行。这样做的一个错误是,如果 Worker 脚本从内存中被逐出,我们将丢失我们的 batchedRequests
,但这似乎并不经常发生。
addEventListener('fetch', event => {
event.respondWith(fetchAndLog(event))
})
let batchedRequests = []
function sendRequests(){
let promises = []
for (var i=batchedRequests.length; i--;){
promises.push(fetch(...batchedRequests[i]))
}
batchedRequests = []
return Promise.all(promises)
}
/**
* Fetch and log a given request object, uploading a logging request only when five are stored
* @param {Request} request
*/
async function fetchAndLog(event) {
batchedRequests.push(["https://hookb.in/Kb88Ybq8", {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
timestamp: +new Date
})
}])
if (batchedRequests.length > 4){
event.waitUntil(sendRequests())
}
return fetch(event.request)
}
我想记录通过 Cloudflare 向我的网站发出的请求。我想我可以使用 Cloudflare Workers 来执行此操作,但我不想通过向我的站点发出的每个请求都向它发出请求来拒绝我的日志记录服务。我可以让 Worker 捆绑日志记录报告,并且每 10 或 100 只向我发出请求吗?
回答我自己的问题,是的,你可以做到!您必须使用 event.waitUntil
添加一个任务,该任务将在原始请求得到响应后 运行。这样做的一个错误是,如果 Worker 脚本从内存中被逐出,我们将丢失我们的 batchedRequests
,但这似乎并不经常发生。
addEventListener('fetch', event => {
event.respondWith(fetchAndLog(event))
})
let batchedRequests = []
function sendRequests(){
let promises = []
for (var i=batchedRequests.length; i--;){
promises.push(fetch(...batchedRequests[i]))
}
batchedRequests = []
return Promise.all(promises)
}
/**
* Fetch and log a given request object, uploading a logging request only when five are stored
* @param {Request} request
*/
async function fetchAndLog(event) {
batchedRequests.push(["https://hookb.in/Kb88Ybq8", {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
timestamp: +new Date
})
}])
if (batchedRequests.length > 4){
event.waitUntil(sendRequests())
}
return fetch(event.request)
}