在 Meteor 中处理长服务器端计算

dealing with long server side calculations in meteor

本文关键字:服务器端 计算 处理 Meteor      更新时间:2023-09-26

我在meteor JS中使用jimp(https://www.npmjs.com/package/jimp)来生成图像服务器端。换句话说,我正在使用递归算法"计算"图像的像素。该算法需要相当长的时间才能完成。

我遇到的问题是这似乎完全阻止了流星服务器。在生成图像时尝试访问网页的用户被迫等待。因此,该网站根本不呈现。

是否有任何(流星)方法可以在线程或其他东西中运行繁重的递归算法,以免阻塞整个网站?

节点

(以及随后的meteor)在单个进程中运行,该进程阻止了CPU活动。简而言之,当你受 IO 限制时,节点工作得非常好,但是一旦你做了任何受计算限制的事情,你就需要另一种方法。

正如上面的评论中所建议的,您需要将此 CPU 密集型活动卸载到另一个进程,该进程可能位于同一服务器(如果您有多个内核)或不同的服务器上。

我们在 Edthena 也有类似的问题,我们需要对视频文件的子集进行转码。现在,我决定使用基于流星的解决方案,因为它很容易设置。以下是我们所做的:

  1. 当需要发生新的转码作业时,我们会将"视频作业"文档插入到数据库中。

  2. 在单独的服务器上(我们在转码时最大化了整个 CPU),我们有一个调用观察的应用程序,如下所示:

Meteor.startup(function () {
  // Listen for non-failed transcode jobs in creation order. Use a limit of 1 to
  // prevent multiple jobs of this type from running concurrently.
  var selector = {
    type: 'transcode',
    state: { $ne: 'failed' },
  };
  var options = {
    sort: { createdAt: 1 }, limit: 1,
  };
  VideoJobs.find(selector, options).observe({
    added: function (videoJob) {
      transcode(videoJob);
    }, });
});

正如注释所示,这一次只允许调用一个作业,这可能是您想要的,也可能不是您想要的。这进一步的限制是,您只能在一个应用程序实例上运行它(多个实例调用observe将同时完成作业)。因此,这是一个非常简单的作业队列,但它可能会在一段时间内满足您的目的。

随着您的扩展,您可以使用更强大的机制来出列和处理任务,例如 Amazon 的 sqs 服务。您还可以探索其他基于流星的解决方案,例如作业收集。

我相信

你正在寻找Meteor.defer(yourFunction).

卡迪拉相关文章:https://kadira.io/academy/meteor-performance-101/content/make-your-app-faster

感谢您的评论和回答!它现在似乎正在工作。我所做的是大卫的建议。我在同一台服务器上运行流星应用程序。此应用程序处理图像的生成。但是,这导致该应用程序仍在消耗所有处理能力。

因此,我在 PID 上使用 renice 命令在生成算法上设置了略低的优先级。(https://www.nixtutor.com/linux/changing-priority-on-linux-processes/)这行得通!每当用户登录网站时,另一个(客户端)meteor应用程序都会优先于生成算法。现在绝对没有耽搁了。

我现在遇到的唯一问题是,每当服务器重新启动时,我都必须以某种方式重新运行或运行(re)nice命令。

由于我使用 meteor up 进行部署,因此两个应用程序都运行相同的用户和相同的"命令":node main.js。我目前正在尝试弄清楚如何在 meteor up 的启动脚本中运行 nice 命令。(位于/etc/init/.conf)