【问题标题】:Asynchronous database access with EventMachine使用 EventMachine 进行异步数据库访问
【发布时间】:2011-03-10 13:15:28
【问题描述】:

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

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

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

【问题讨论】:

标签: ruby orm eventmachine


【解决方案1】:

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

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

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

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

【讨论】:

  • 很公平,在反应器中想要一个 ORM 似乎是一件相当小众的事情:)
【解决方案2】:

同意 gregory 所说的,如果您可以使用支持异步操作的本机适配器 - 请使用它们。 mysql2 & pg gem 有很好的异步支持。

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

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 2012-03-10
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多