javascript - nodejs中长时间运行的请求
问题描述
我想知道是否有任何好的做法如何在 nodejs 中利用长时间运行的请求?我正在使用 Express.js 并且一直想知道是否有任何方法可以(我不知道)将快速请求之一移动到节点的不同实例或其他什么?
我想知道的原因是如果强烈使用CPU,同时阻塞节点中的事件循环。主要问题是,首先,我正在获取一些数据,然后计算并将丢失的数据插入数据库,然后根据结果获取其他数据,然后再次计算并更新数据库中的其他内容。
我没有注意到这个问题,因为到目前为止我是唯一一个使用这个请求的人。但是现在我正在与其他用户一起测试它,如果他们中很少有人使用这个请求,整个应用程序会冻结几秒钟。在我的监控工具上,我看到 CPU 使用率很高(100%-200% 哈哈)
所以我尝试过集群,但它似乎不起作用。我已经使用了 pm2 并在我的 CPU 的所有内核上运行了应用程序。由于我的算法的复杂性,我试图将几个函数移动到工作线程,但看起来这些线程会非常非常频繁地使用,我担心整个节点实例崩溃。
我不知道哪种解决方案是最好的,也不知道是否有任何适用于 Express 的好工具,可以帮助我卸载/利用这些请求?我还没有深入研究分区,但看起来这可能有效。有没有人将它用于较大的项目,并且知道这是否可以将一个请求分配到多个滴答声中?
像 Bull 或 Kue 这样的工作队列呢?将这些任务推入队列是个好主意吗?我从来没有使用过这样的工具,我在问,因为我不知道这是否有意义。
干杯
解决方案
如果您有数据存在 - 您可以使用传入的 HTTP 请求向用户发送数据。但如果您没有找到任何数据,您可以在 HTTP 请求中发送空响应。
并且您需要使用队列服务来计算和插入丢失的数据。蜜蜂队列是一个不错的选择。
将 redis 与 bee-queue 结合使用可以使后台作业更快。
推荐阅读
- powershell - Powershell 搜索旧文件,重命名并将新文件复制到所有找到的位置
- regex - 正则表达式:匹配括号内可能包含或不包含嵌套括号的所有单引号或双引号字符串
- eclipse - Eclipse 通用文本编辑器排序大纲
- json - Presto Json 解析
- php - 如何使用套件谈话 Netsuite API 从保存的搜索中获取摘要
- azure - 所有者或参与者时的 Azure 策略排除
- c++ - 有没有办法将 Cython 扩展类型类属性定义为 C++ 类?
- types - 从文件加载程序集并调用 GetExportedTypes
- python - Spacy 3.0 的 nlp.update 问题:TypeError:[E978] Language.update 方法采用示例对象列表,但得到:{
} - c# - gRPC - 如果空闲时间过长,双向流将进入 TRANSIENT_FAILURE