Meteor并发模型是什么?

14

我正在为一个Meteor应用程序编写服务器端逻辑,该应用程序必须根据客户端的请求更新内存状态。这个应用程序需要强大的并发性保证 - 特别是,我想确保一次只有一个更新被执行。

我正在尝试确定Meteor的并发模型是否支持此功能。文档提到Meteor是多线程的(这可能会造成问题),但在搜索了一番后,我得出的印象是Meteor实际上使用纤程(显式调度的线程)。如果是这样,只要我代码中需要原子运行的部分不进行任何Meteor调用(包括IO并因而释放执行锁),那么我就是安全的。

情况是否如此?我在哪里可以找到有关Meteor并发模型的更多信息?


我认为你应该为你的内存存储自己实现锁,或者你可以使用Mongo原子操作。 - Denis
如果有帮助的话,可以在这里找到fibers库的文档:链接 - Jonathan Warden
@Denis 如果我可以实现内存锁,因为非IO、非yielding操作是原子的,那么我甚至不需要它们来处理这个应用程序。无论如何,我想了解Meteor中并发的工作原理以获取未来的信息。这些东西应该在某个地方有清晰的文档记录;但事实上并没有。我可能最终会查看Meteor源代码。 - disatisfieddinosaur
2个回答

13

好的,我查看了Meteor源代码,以下是它的工作原理:

1)在服务器端,Meteor独占使用纤程来处理并发。纤程类似于线程,不同之处在于必须明确地放弃上下文。这使得并发的推理更加容易,但可能会导致一些纤程饥饿。

2)所有对Meteor.call、Meteor.setInterval和任何Collection操作的调用都被包装在纤程中。这意味着所有这些调用都会放弃上下文。

3)此外,任何对纤程/未来模块的使用都会放弃上下文。

这种结构的要点是:如果您想编写原子操作,请避免在您想要使其原子化的代码块中访问Meteor框架提供的对象。如果该代码块确实需要(比如)进行数据库访问,则可以轻松实现内存锁定,但对于我的应用程序,了解这些就足够了。我的核心更新函数只需要在Mongo已读取所有所需文档的情况下调用即可。


2

来自Meteor文档:

在Meteor中,您的服务器代码在每个请求中运行一个线程,而不是Node典型的异步回调风格。我们发现线性执行模型更适合Meteor应用程序中典型的服务器代码。

http://docs.meteor.com/#structuringyourapp

有人知道这样做的性能影响吗?


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