我正在为Meteor应用程序编写服务器端逻辑,该应用程序必须更新内存中的状态以响应来自客户端的请求。这个应用程序需要强大的并发保证--特别是,我希望确保一次只执行一次更新。
我正在尝试弄清楚Meteor的并发模型是否支持这一点。文档提到Meteor是多线程的(这将是一个问题),但在搜索之后,我得到的印象是Meteor实际上使用了纤程(显式调度的线程)。如果这是真的,那么只要我的代码中需要原子运行的部分不进行任何Meteor调用(这涉及到IO,从而产生执行锁),我就是安全的。
真的是这样吗?在哪里可以找到有关Meteor并发模型的更多信息?
发布于 2013-08-13 00:53:19
好的,我看了一下Meteor的源代码,下面是它的工作原理:
1)在服务器端,Meteor独家使用纤程来处理并发。纤程类似于线程,不同的是上下文必须显式生成。这使得关于并发的推理变得更容易,但代价是一些纤程使另一些纤程处于饥饿状态。
2)所有对Meteor.call、Meteor.setInterval和任何集合操作的调用都封装在纤程中。这意味着所有这些调用都会产生上下文。
3)此外,纤维/期货模块的任何使用都会产生收益。
这种结构的结果是,如果你想写原子操作,只要避免访问Meteor框架提供的对象,你想要使之原子化的代码块。如果这个块确实需要(比方说)一个DB访问,那么您可以毫不费力地实现内存中的锁,但是对于我的应用程序来说,这个知识就足够了。我的核心更新函数只需要从已经读取的Mongo中调用它所需的所有文档。
发布于 2014-04-18 12:18:37
从流星文档中:
在流星中,您的服务器代码在每个请求的单个线程中运行,而不是在典型的Node异步回调风格中运行。我们发现线性执行模型更适合Meteor应用程序中的典型服务器代码。
http://docs.meteor.com/#structuringyourapp
有没有人知道这对性能的影响?
https://stackoverflow.com/questions/18170450
复制相似问题