我有一个应用程序对另一个系统进行 API 调用,它使用 Bull 和 Redis 将这些 API 调用排入队列。
但是,有时它会因大量 API 调用而陷入困境,或者某些东西停止正常工作,我希望用户可以通过一种简单的方法来检查系统是否只是“忙碌”。(否则,如果他们执行了某些操作,但 10 分钟后还没有完成,他们会继续尝试,然后我们会积压更多条目(在某些情况下,他们发布了重复部分的数据问题, ETC。)
以下是队列中成功调用 API 的单个“密钥”的样子:
HSET "bull:webApi:4822" "timestamp" "1639085540683"
HSET "bull:webApi:4822" "returnvalue" "{"id":"e1df8bb4-fb6c-41ad-ba62-774fe64b7882","workOrderNumber":"WO309967","status":"success"}"
HSET "bull:webApi:4822" "processedOn" "1639085623027"
HSET "bull:webApi:4822" "data" "{"id":"e1df8bb4-fb6c-41ad-ba62-774fe64b7882","token":"eyJ0eXAiOiJKV1QiL....dQVyEpXt64Fznudfg","workOrder":{"members":{"lShopFloorLoad":true,"origStartDate":"2021-12-09T00:00:00","origRequiredQty":2,"requiredQty":2,"requiredDate":"2021-12-09T00:00:00","origRequiredDate":"2021-12-09T00:00:00","statusCode":"Released","imaItemName":"Solid Pin - Black","startDate":"2021-12-09T00:00:00","reference":"HS790022053","itemId":"13840402"}},"socketId":"3b9gejTZjAXsnEITAAvB","type":"Create WO"}"
HSET "bull:webApi:4822" "delay" "0"
HSET "bull:webApi:4822" "priority" "0"
HSET "bull:webApi:4822" "name" "__default__"
HSET "bull:webApi:4822" "opts" "{"lifo":true,"attempts":1,"delay":0,"timestamp":1639085540683}"
HSET "bull:webApi:4822" "finishedOn" "1639085623934"
您可以看到在这种情况下处理需要 83 秒。(1639085540 - 1639085623)
我希望能够提供汇总指标,例如:
- 最近的 API 调用在 X 秒前被添加到队列中
- 最近一次成功的 API 调用在 X 秒前完成,需要 XX 秒才能完成。
我还希望能够提供 50 个最近的 API 调用的列表,以一种很好的方式格式化并标记为“成功”、“待定”或“失败”。
我对 Redis 和 Bull 还很陌生,我试图弄清楚如何查询这些数据(在 Node.js 中使用 Redis)并将这些数据作为 JSON 返回给应用程序。
我可以拉一个这样的键列表:
// @route GET /status
async function status(req, res) {
const client = createClient({
url: `redis://${REDIS_SERVER}:6379`
});
try {
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect();
const value = await client.keys('*');
res.json(value)
} catch (error) {
console.log('ERROR getting status: ', error.message, new Date())
res.status(500).json({ message: error.message })
} finally {
client.quit()
}
}
这将返回 ["bull:webApi:3","bull:webApi:1","bull:webApi:2"...]
但是我怎样才能拉出与各个键关联的值呢?
以及如何找到数字最高的密钥,然后拉出“最后 50 个”的详细信息。在 SQL 中,这就像执行ORDER BY key_number DESC LIMIT 50 - 但我不确定如何在 Redis 中执行此操作。