【问题标题】:Trigger a HTTP request and save the response on MYSQL Result触发 HTTP 请求并将响应保存在 MYSQL 结果上
【发布时间】:2019-05-14 17:25:38
【问题描述】:

该程序是一个 Node.js 程序。数据存储在 amazon RDS 下的 MYSQL DB 中。它使用 Sequelize.js 链接。我在程序中有一些计划工作任务。 这些计划作业遵循以下步骤:

  1. 从数据库中选择查询
  2. 向第三方发送请求并获得响应
  3. 对响应做一些事情
  4. 将日志和响应保存到数据库

目前,调度作业在 Node.js 程序中,但是当作业启动时,Node.js 程序会变慢。我正在对其进行重新编码,并希望将其移至 MySQL 服务器。
我知道 MySQL 服务器有事件调度程序,但我发现它只能执行一些 sql 代码。我怎样才能做一些http请求?还是不可能?任何身体帮助?

【问题讨论】:

  • 那么是第 1 步查询速度慢吗?如果是这样,请显示查询和表结构 (SHOW CREATE TABLE {tablename}) 和 EXPLAIN {query}。将更多代码移动到基础架构中可扩展性最低的部分并不是一个好的举措。为什么你没有为这种队列使用消息队列。它具有更好的界面,尤其是针对此类工作而设计的。
  • 感谢@danblack 的评论。查询不慢,第3步的东西也不多。目前从第1步到第4步大概2分钟左右。主要原因是调度任务很频繁,比如5分钟或10分钟。由于 Node.js 是单线程的,因此在任务运行时程序速度较慢。我是否要为计划任务更改另一种编程语言?有什么建议吗?

标签: mysql node.js sequelize.js amazon-rds


【解决方案1】:

保留您的 Node.js 程序以处理请求。它已实现并执行您似乎并不关心其处理时间的事情。

我会转而使用 Rabbit MQ 之类的消息队列(或某种 AWS 队列)来存储需要获得响应和处理的作业。这样,您只需在 HTTP 响应期间将所需的东西(表的主键或标识符)推送到队列,您的 Node.js 就可以从队列中挑选一个项目(阻塞接口)处理它。这样它就不需要基于事件的轮询来处理。

队列方法的另一个优点是,您可以在不发生冲突的情况下扩大处理这些请求的 Node.js 程序的数量,并且可以在不过载的情况下最大化 CPU 使用率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2021-06-18
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多