更好的 Golang 的 MongoDB 驅動 `globalsign/mgo`

用 1.3 版本使用 Go 開始,鏈接 MongoDB 使用的驅動中,最多見的就是:mgo.v2git

這個庫一度是惟一的選擇,它的接口設計合理,與 Golang/MongoDB/bson 適配的也作的不錯。然而這個庫長期處於無人看管的狀態,有一大堆讓人難以忍受 bug,其中咱們遇到的就有很多:github

  1. 當短期執行大量 db 操做把併發執行的與 MongoDB 的鏈接池增大以後,多餘的鏈接沒有被正確的回收掉(即使設置了 maxIdleTimeoutminPoolSize)。
  2. 執行 bulk 操做的 size 是固定不可配置的。

在咱們的線上項目中,偶爾的業務峯值會照成某幾個服務短期大量的 db 操做,而一旦這些 db 操做帶來的鏈接數量被撐大以後,耗盡 db 的鏈接數資源以後。其餘的服務就沒法鏈接到此 db 了( lass 的雲服務器供應商提供的 MongoDB 實例的鏈接數都不高)。服務器

後來終於有人受不了了:數據結構

globalsign/ mgo

新的 MongoDB 驅動,不只修復了 mgo.v2 可怕的鏈接池問題,還帶來的不少很是棒的特性:併發

  • 各類 go 的原生數據結構 (例如time.Duration)到 bson 的序列化支持。
  • 可使用數字做爲 map 的 key 了。
  • 使用 sync.Pool 提升了 bson 序列化的性能,參見這裏

剩下的各類 bug 修復和改進能夠參考該項目的 github 主頁,改進點很是多,強烈建議替換掉 mgo.v2性能

相關文章
相關標籤/搜索