使用EventMachine进行异步数据库访问

时间:2011-03-10 13:15:28

标签: ruby orm eventmachine

我开始研究一个简单的EventMachine项目,接受来自一组网络客户端的数据,将其记录到数据库中,同时将其发送到另一组客户端。 A客户的=> B客户端的部分是反应堆使得疯狂容易的事情,但数据库访问并不是那么多 - 至少,以非阻塞,偶然的方式。我一直在努力找到一个体面的ORM,它支持异步访问的方式,可以很好地与EventMachine一起使用,同时仍然提供我知道和喜欢的所有ORM抽象 - 我希望避免打开一堆套接字并讨论SQL over他们!此外,维护DB支持的合理传播是可取的(例如,我已经看过一些文章,解释了如何使异步ActiveRecord仅与mysql一起工作)。

到目前为止,我发现的所有内容都是swift,看起来应该可以解决这个问题,但与ActiveRecord和DataMappers相比,它看起来很小。

还有其他值得追求的路径吗?或许主要的ORM强国之一有一个鲜为人知的异步分支? :P

2 个答案:

答案 0 :(得分:2)

我个人更喜欢直接在基于EM的服务器中使用DB驱动程序。

原因是需要EM服务器的项目类型也需要高性能但处理量相当小。因此,将几个SQL语句放在一起而不是正确配置ORM并使其与EM一起使用通常更简单。

使用ORM,特别是高级的ORM,很容易引入某种瓶颈。另外,EM仍然不是很普遍,所以如果你尝试在简单的驱动程序上使用ORM,那么击中一些奇怪的bug的可能性会更大。

Mysql2 gem内置了对异步操作的支持。 Postgresql我最近没用过,所以不确定。

答案 1 :(得分:2)

如果您可以使用支持异步操作的本机适配器,那么<​​p>同意格雷戈里所说的那样 - 使用它们。 mysql2&amp; pg gems有非常好的异步支持。

作为附注,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