我开始研究一个简单的EventMachine项目,接受来自一组网络客户端的数据,将其记录到数据库中,同时将其发送到另一组客户端。 A客户的=> B客户端的部分是反应堆使得疯狂容易的事情,但数据库访问并不是那么多 - 至少,以非阻塞,偶然的方式。我一直在努力找到一个体面的ORM,它支持异步访问的方式,可以很好地与EventMachine一起使用,同时仍然提供我知道和喜欢的所有ORM抽象 - 我希望避免打开一堆套接字并讨论SQL over他们!此外,维护DB支持的合理传播是可取的(例如,我已经看过一些文章,解释了如何使异步ActiveRecord仅与mysql一起工作)。
到目前为止,我发现的所有内容都是swift,看起来应该可以解决这个问题,但与ActiveRecord和DataMappers相比,它看起来很小。
还有其他值得追求的路径吗?或许主要的ORM强国之一有一个鲜为人知的异步分支? :P
答案 0 :(得分:2)
我个人更喜欢直接在基于EM的服务器中使用DB驱动程序。
原因是需要EM服务器的项目类型也需要高性能但处理量相当小。因此,将几个SQL语句放在一起而不是正确配置ORM并使其与EM一起使用通常更简单。
使用ORM,特别是高级的ORM,很容易引入某种瓶颈。另外,EM仍然不是很普遍,所以如果你尝试在简单的驱动程序上使用ORM,那么击中一些奇怪的bug的可能性会更大。
Mysql2 gem内置了对异步操作的支持。 Postgresql我最近没用过,所以不确定。
答案 1 :(得分:2)
作为附注,swift(免责声明:我是合着者)已经完成了一些api清理工作以简化异步用例。你可能会觉得这很方便。
require 'swift/synchrony'
EM.run do
3.times.each do |n|
EM.synchrony do
db = Swift.setup(:default, Swift::Adapter::Postgres, db: "swift")
result = db.execute("select pg_sleep(3 - #{n}), #{n + 1} as qid")
p result.first
EM.stop if n == 0
end
end
end