2

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

到目前为止,我发现的只是swift,看起来应该可以解决问题,但与您的 ActiveRecord 和 DataMappers 相比,它似乎很小。

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

4

2 回答 2

2

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

这样做的原因是需要 EM 服务器的项目类型也需要高性能但处理量相当少。因此,将几个 SQL 语句放在一起通常比正确配置 ORM 并让它与 EM 一起工作更简单。

使用 ORM,尤其是高级的,很容易引入某种瓶颈。此外,EM 仍然不是很普遍,因此如果您尝试在简单的驱动程序上使用 ORM,则遇到一些奇怪错误的机会会更大。

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

于 2011-03-10T15:40:48.583 回答
2

正如 gregory 所说,如果您可以使用支持异步操作的本机适配器,请使用它们。mysql2 & 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
于 2012-05-08T11:01:17.120 回答