gpt4 book ai didi

mysql - Slack webhooks 导致 cls-hooked 请求上下文孤立 mysql 连接

转载 作者:行者123 更新时间:2023-12-02 00:13:06 27 4
gpt4 key购买 nike

主要问题:我们有一个可爱的小 express 应用程序,几个月来一直没有问题。我们通过按需打开连接来管理我们的数据库连接,然后使用 cls-hooked 缓存它“按请求”图书馆。请求结束后,我们释放连接,这样我们的连接池就不会用完。经典的。在几个月和许多连接的过程中,我们从未“泄漏”连接。到目前为止!输入...松弛!我们正在使用 slack 事件处理程序,如下所示:

app.use('/webhooks/slack', slackEventHandler.expressMiddleware());

我们有点认为它就像任何其他请求一样,但是松弛请求似乎与我们的 cls-hook 用法很奇怪。例如,我们使用 node-ts 和 nodemon 在本地运行我们的应用程序(例如,您更改代码,应用程序会自动重启)。每次应用程序在我们的开发机器上本地重启,并且您尝试使用松弛事件,当我们释放连接的中间件突然尝试这样做时,它认为 session 中没有任何内容。然后当您使用一个正常的端点时...它工作正常并且基本上似乎重置松弛以再次正常工作。我们现在害怕去刺激我们的松弛集成,因为我们担心我们的松弛“请求”会使我们的连接池饿死。

背景

我们 package.json 的相关子集:

{
"@slack/events-api": "^2.3.2",
"@slack/web-api": "^5.8.0",
"express": "~4.16.1",
"cls-hooked": "^4.2.2",
"mysql2": "^2.0.0",
}

创建 cls-hooked session 的中间件

import { session } from '../db';

const context = (req, res, next) => {
session.run(() => {
session.bindEmitter(req);
session.bindEmitter(res);
next();
});
};

export default context;

释放我们连接的中间件

export const dbReleaseMiddleware = async (req, res, next) => {
res.on('finish', async () => {
const conn = session.get('conn');
if (conn) {
incrementConnsReleased();
await conn.release();
}
});
next();
};

按需创建连接并将其存储在“ session ”中的代码

  const poolConn = await pool.getConnection();
if (session.active) {
session.set('conn', poolConn);
}
return poolConn;

首先设置 session 的代码

export const session = clsHooked.createNamespace('our_company_name');

如果你走到这一步,恭喜你。任何帮助表示赞赏!

旁注:你不能付钱让我写一个更令人困惑的标题......

最佳答案

想通了!似乎我们已经在 slack 的 API 的 Node 版本中识别出以下行为(似乎只发生在 mac 计算机上......有时)

问题是这是在 express 应用程序的上下文中,因此 Slack 正在管理其自己的事件处理程序系统与 express 的 http 端之间的接口(interface)(例如返回 200、500 或其他)。所以似乎发生的是......

// you have some slack event handler
slackEventHandler.on('message', async (rawEvent: any) => {
const i = 0;
i = i + 1;
// at this point, the http request has not returned 200, it is "pending" from express's POV
await myService.someMethod();
// ^^ while this was doing its async thing, the express request returned 200.
// so things like res.on('finished') all fired and all your middleware happened
// but your event handler code is still going
});

所以我们最终创建了一个手动调用来释放我们的松弛事件处理程序中的连接。诡异的!

关于mysql - Slack webhooks 导致 cls-hooked 请求上下文孤立 mysql 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61215539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com