在 Meteor 中处理长服务器端计算
dealing with long server side calculations in meteor
我在meteor JS中使用jimp(https://www.npmjs.com/package/jimp)来生成图像服务器端。换句话说,我正在使用递归算法"计算"图像的像素。该算法需要相当长的时间才能完成。
我遇到的问题是这似乎完全阻止了流星服务器。在生成图像时尝试访问网页的用户被迫等待。因此,该网站根本不呈现。
是否有任何(流星)方法可以在线程或其他东西中运行繁重的递归算法,以免阻塞整个网站?
(以及随后的meteor)在单个进程中运行,该进程阻止了CPU活动。简而言之,当你受 IO 限制时,节点工作得非常好,但是一旦你做了任何受计算限制的事情,你就需要另一种方法。
正如上面的评论中所建议的,您需要将此 CPU 密集型活动卸载到另一个进程,该进程可能位于同一服务器(如果您有多个内核)或不同的服务器上。
我们在 Edthena 也有类似的问题,我们需要对视频文件的子集进行转码。现在,我决定使用基于流星的解决方案,因为它很容易设置。以下是我们所做的:
当需要发生新的转码作业时,我们会将"视频作业"文档插入到数据库中。
在单独的服务器上(我们在转码时最大化了整个 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)
- 如何使用skip参数使用angular ui引导进行服务器端分页
- Webpack开发服务器和React服务器端渲染
- 提示使用服务器端事件处理程序激活JavaScript
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 如何轻松地将服务器端变量从Java代码转移到客户端代码
- 通过ajax将坐标传递到php服务器端,并在处理后检索到javascript
- 将表单数据提交到服务器端
- 使用ajax的服务器端分页&jQuery
- 显示具有服务器端自动时间注销的同步倒计时计时器
- 使用FormData上传AJAX图像;t在服务器端显示图像
- React路由器服务器端渲染和ajax获取数据
- Adobe Captivate:在SCORM模块中使用GET/POST进行服务器端计算
- 在不使用集合的情况下将服务器端计算返回到客户端
- 在 Meteor 中处理长服务器端计算
- 计算数据并在从服务器端获取所有数据后呈现它们;$(window).load() 没有运气
- 服务器端或Javascript计算
- 使用Firebase的服务器端计算
- 如何显示没有安装在客户端计算机上而是安装在服务器上的网站字体
- XML搜索或DB搜索/ javascript(客户端)或php(服务器端)计算
- 我应该在哪里进行繁重的计算?客户端或服务器端