2011-03-10 89 views
2

我已經開始使用一個簡單的EventMachine項目來接收來自一組網絡客戶端的數據,將其記錄到數據庫中,並同時將其發送到不同的客戶端組。 A客戶端=> B客戶端的一部分就是一個反應器變得很容易的事情,但數據庫訪問並不那麼多 - 至少,以一種非阻塞的,平等的方式。我一直在試圖找到一個體面的ORM,它支持異步訪問,並且可以很好地與EventMachine一起使用,同時仍然提供我所知道並喜歡的所有ORM抽象 - 我希望避免打開一堆套接字和通過SQL他們!此外,維護數據庫支持的合理傳播是可取的(我見過一些文章解釋瞭如何使異步ActiveRecord只與MySQL協同工作)。使用EventMachine異步數據庫訪問

到目前爲止,我發現的所有內容都是swift,看起來應該是這樣,但與ActiveRecord和DataMappers相比,它看起來非常小。

有沒有其他值得追求的途徑?也許其中一個主要的ORM強國有一個鮮爲人知的異步分支? :P

+0

Swift是最小的,因爲我們喜歡用簡單的舊OO輕鬆擴展的東西。例如,如果你想要更多的ActiveModel功能,可以很容易地將它們混合使用:https://github.com/shanna/swift-rails/blob/master/lib/swift-rails/active_model.rb – shanna 2012-05-08 23:53:41

回答

1

我個人更喜歡直接在基於EM的服務器上使用數據庫驅動程序。

其原因是需要EM服務器的項目類型也需要高性能但處理量相當小。因此,將幾個SQL語句放在一起通常會比較簡單,而不是正確配置ORM並使其與EM協同工作。

有了ORM,特別是先進的ORM,很容易引入某種瓶頸。另外,EM還不是很普及,所以如果你嘗試在一個簡單的驅動程序上使用ORM,碰到一些奇怪錯誤的機會就會更大。

Mysql2 gem內置支持異步操作。 Postgresql我最近沒有用過,所以不確定。

+0

公平的,它看起來像一個相當利基的事情要在反應堆中的ORM :) – Scott 2011-03-12 09:53:22

2

同意gregory說,如果您可以使用支持異步操作的本地適配器 - 使用它們。 mysql2 & pg寶石有很好的異步支持。

作爲附註,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