我正在使用 node.js memcached 库的承诺版本进行缓存。
var get = promisify(memcached.get).bind(memcached);
var set = promisify(memcached.set).bind(memcached);
var add = promisify(memcached.add).bind(memcached);
var del = promisify(memcached.del).bind(memcached);
var incr = promisify(memcached.incr).bind(memcached);
var getMulti = promisify(memcached.getMulti).bind(memcached);
这些在我的connections.js 文件的导出中公开。我认为这已经足够了,因为我希望 memcached 如果有任何问题会静默失败,我可以回退到数据库。
每小时一次或两次(我猜应用程序每小时收到大约 30,000 个请求)请求失败,日志的输出是这样的:
(node:28788) UnhandledPromiseRejectionWarning: Error: Item is not stored
at Socket.notstored (c:\Workspaces\DOH\Vaccines\Service\node_modules\memcached\lib\memcached.js:445:20)
at Client.rawDataReceived (c:\Workspaces\DOH\Vaccines\Service\node_modules\memcached\lib\memcached.js:744:51)
at Client.BufferBuffer (c:\Workspaces\DOH\Vaccines\Service\node_modules\memcached\lib\memcached.js:678:12)
at Socket.bowlofcurry (c:\Workspaces\DOH\Vaccines\Service\node_modules\memcached\lib\utils.js:126:15)
这对我来说似乎很奇怪,但我想我可以通过将我的函数包装在 try/catch 中来解释这种可能性。
incr: async function (key, amount) {
key = Buffer.from(key).toString('base64')
try {
if (amount == undefined) {
amount = 1
}
var value = await get(env + key);
if (!value) {
await set(env + key, amount, 0)
} else {
await incr(env + key, amount);
}
return get(env + key)
} catch (e) {
console.log("Memcached incr error: " + e);
return 1
}
}
在调试并连接到 memcached 服务器时,我看到调用 cache.incr() 时发生了同样的错误。异常没有被捕获,它只是使请求失败并向客户端发送了 500。
我错过了什么?Promisify 不处理深度异常吗?日志永远无法将异常一直追溯到我的代码中的函数调用;它只是停在 memcached 库中的 utils.js 处。为什么那里断开连接?