.. có điều gì rõ ràng cho thấy lý do tại sao các queriers của tôi đạt trung bình 500-650ms không?
Có, có. Bạn đang gọi mgo.Dial()
trước khi thực hiện mỗi truy vấn. mgo.Dial()
luôn phải kết nối với máy chủ MongoDB mà bạn đóng ngay sau khi truy vấn. Kết nối có thể mất hàng trăm mili giây để thiết lập, bao gồm xác thực, phân bổ tài nguyên (cả ở phía máy chủ và máy khách), v.v. Điều này rất lãng phí.
Phương thức này thường chỉ được gọi một lần cho một cụm nhất định. Sau đó, các phiên tiếp theo cho cùng một cụm được thiết lập bằng cách sử dụng các phương pháp Mới hoặc Sao chép trên phiên thu được. Điều này sẽ làm cho chúng chia sẻ cụm cơ bản và quản lý nhóm kết nối một cách thích hợp.
Tạo biến phiên toàn cầu, kết nối khi khởi động một lần (ví dụ:sử dụng một gói init()
chức năng), và sử dụng phiên đó (hoặc một bản sao / bản sao của nó, được lấy bởi Session.Copy()
hoặc Session.Clone()
) .Ví dụ:
var session *mgo.Session
var info *db.Inf // Use your type here
func init() {
var err error
if info, err = db.Info(); err != nil {
log.Fatal(err)
}
if session, err = mgo.Dial(info.ConnectionString()); err != nil {
log.Fatal(err)
}
}
func (r userRepo) GetUserByID(id string) (User, error) {
sess := session.Clone()
defer sess.Close()
// Now we use sess to execute the query:
var user User
c := sess.DB(info.Db()).C("users")
// Rest of the method is unchanged...
}