如何在Meteor中进行大量处理?

4
我有一个Meteor应用程序,目前正在从Twitter获取数据,然后进行一些操作,最后将文档插入集合中。假设我永远运行此过程,但不想阻塞事件循环,是否有任何解决方案?
注意:我知道node.js是单线程的,并且Meteor不支持诸如cluster之类的包,因为它需要粘性会话。我能想到的唯一解决方案是添加一个专用服务器来处理来自Twitter的数据并将请求转发到该服务器,但那么我就不再使用Meteor或node了。
希望得到帮助。

1
使用另一台服务器或同一台服务器上的其他进程似乎是一个合理的解决方案。Meteor进程和工作进程是否可以通过数据库本身进行通信?例如,工作进程只需写入某些结果集合,然后在客户端上使用即可?不知道问题的确切性质很难提出更多建议。 - David Weldon
1
你的数据归档脚本为什么需要在Meteor中?你可以在Meteor中创建一个集合,然后直接从Node将数据插入到MongoDB集合中。这样你就可以使用Cluster,并且不会阻塞事件循环。你甚至可以让数据收集脚本在另一台服务器上运行。如上所述,在不了解你正在构建的内容的情况下很难提出更多建议。 - Patrick Coffey
1
你读过这篇文章吗?提供一个简单的例子会很有帮助。你可以在Meteor中使用Node事件发射器和Fibers来实现你想要的功能。 - user728291
2个回答

1
这里的真相是,虽然 JavaScript/Node/Meteor 可以进行处理,但你自己并不想这样做。让我给出一些观察和个人例子:
- 应用程序完全与延迟有关。如果你的请求之一需要很长时间才能完成,因为它被卡在紧密的循环中,那么此时连接到服务器的每个其他客户端都会受到影响。如果发生这种情况,每个人的延迟都会增加。(这就是确保代码中没有紧密循环的情况) - JavaScript(语言)对数字值的支持非常简单。 (基本上你只会得到一个双精度浮点数)。像 float、long、int、byte 这样的东西都是为了让你尽可能快地执行紧密的循环。如果你可以使用最接近它的原始类型来表示一个值,你将获得很大的改进。(这就是将数据处理提取到适合数据处理的语言中的情况)
我正在原型开发一个需要对数据进行聚合的应用程序。我使用meteor和setInterval回调启动它,每次完成需要大约2秒钟的时间。在我的开发机器上,我没有注意到它(因为meteor应用程序能够有效地隐藏延迟问题)。但是一旦我部署它并开始查看日志,我意识到没有一个用户的请求延迟低于4秒。这是可怕的客户端体验。
我将数字计算提取到一个小的clojure应用程序中。所有集成都通过插入和读取来自mongo db的记录进行,并且clojure代码有一些定时事件,每隔几秒钟执行完全相同的计算,就像之前在meteor中完成的那样。
在clojure中,这些计算现在总共需要不到100ms的时间(与meteor中的2-4秒相比)。
回到您的问题:听起来您的应用程序没有用户界面?如果有,您最好保留meteor,因为它非常适合Web UI。但是对于无头应用程序,它不是正确的技术,而这似乎是您所拥有的。

0

您可以在进行繁重处理的方法开头使用 this.unblock()。Meteor 将启动另一个纤程,继续处理您的方法,并在完成时触发回调。更多信息请参阅:http://docs.meteor.com/#method_unblock


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接