0

我正在使用 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 处。为什么那里断开连接?

4

0 回答 0