处理meteor的长服务器端计算

我在meteorJS中使用jimp( https://www.npmjs.com/package/jimp )来生成映像服务器端。 换句话说,我使用recursionalgorithm来“计算”图像的像素。 该algorithm需要一段时间才能完成。

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

有什么(meteor)的方式来运行在一个线程或重量recursionalgorithm,以便它不会阻止整个网站?

节点(以及meteor)运行在阻止CPU活动的单个进程中。 简而言之,当IO绑定时节点工作得很好,但只要你做了任何计算绑定,你就需要另一种方法。

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

我们在Edthena有类似的问题,我们需要转换我们的video文件的一个子集。 现在我决定使用基于meteor的解决scheme,因为它很容易build立。 以下是我们所做的:

  1. 当新的转码作业需要发生时,我们在数据库中插入一个“video作业”文件。

  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的解决scheme,如工作收集 。

我相信你正在寻找Meteor.defer(yourFunction)

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

感谢您的意见和答案! 现在似乎在工作。 我所做的是David所build议的。 我在同一台服务器上运行meteor应用程序。 这个应用程序处理图像的生成。 然而,这导致该应用程序仍然消耗掉所有的处理能力。

因此,我在PID上使用renice命令在生成algorithm上设置了稍低的优先级。 ( https://www.nixtutor.com/linux/changing-priority-on-linux-processes/ )这个工程! 用户login网站时,其他(客户端)meteor应用优先于生成algorithm。 现在绝对没有任何延迟。

我现在唯一的问题是,无论何时服务器重新启动,我不知何故必须重新运行或运行(重新)好命令。

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