2014-12-20 2 views
1

mongo를 백엔드 데이터 저장소로 사용하는 REST 웹 서비스를 작성했습니다. 나는이 단계 (배포 전), 모범 사례가 무엇인지, 궁극적으로 영원히 (ish) 실행되는 서비스를 생각해 보았습니다. main.go에서MGO와 장기 실행 웹 서비스 - 복구

// database.go 
... 

type DataStore struct { 
    mongoSession *mgo.Session 
} 

... 
func (d *DataStore) OpenSession() { 
    ... // read setup from environment 

    mongoSession, err = mgo.Dial(mongoURI) 
    if err != nil {} 
    ... 
} 

func (d *DataStore) CloseSession() {...} 

func (d *DataStore) Find (...) (results...) { 
    s := d.mongoSession.Copy() 
    defer s.Close() 

    // do stuff, return results 
} 

: - 어떤 시간이 초과되었습니다 세션 복구를 위해 권장되는 연습의

func main() { 
    ds := NewDataStore() 
    ds.OpenSession() 
    defer ds.CloseSession() 


    // Web Service Routes.. 
    ... 
    ws.Handle("/find/{abc}", doFindFunc) 
    ... 
} 

내 질문은

현재, 나는 패턴이 유형의 다음과 같은거야 , 연결이 끊어졌습니다 (내가 사용하고있는 mongo 서비스 공급자가 원격이므로이 일이 일어날 것이라고 추측합니다), 특정 웹 서비스 호출에서 데이터베이스 세션이 더 이상 작동하지 않을 수 있습니까? 세션이 더 이상 유효하지 않고 "신선한"세션이 설정되어야한다는 것을 감지하기 위해 사람들이 이러한 사례를 어떻게 처리합니까?

감사합니다. 당신이 할 수 있습니다 무엇을

+0

* 연결 및 재 연결이 관리되고 있다고 생각합니다. - ['mgo' docs] (http://godoc.org/gopkg.in/mgo.v2)는 "하나 이상의 연결"을 만들 것이라고 말합니다. 세션 당. 이것은''sql.DB'가'database/sql'에 연결 풀을 나타내는 spec'd (http://golang.org/pkg/database/sql/#DB)와 약간 비슷합니다. 이것은 단지 강한 의혹 일 뿐이므로 나는 답을하지 않는다. – twotwotwo

답변

2

은 산화 마그네슘에 의해 관리됩니다 .. (DEFFERED .Close() 포함) 각 들어오는 HTTP 요청, 지금 필요한 경우 처리기의 새로운 세션에서 다시 복사에 대한 세션 .Copy()

연결하고 다시 연결하는 것입니다 MongoDB를 중지했다가 다시 시작하여 웹 서비스에 대한 HTTP 요청을 작성하여 영향을받는 방법을 확인할 수 있습니다.

HTTP 요청을 처리하는 동안 db 연결 문제가 발생하면 db 작업이 결국 시간 초과됩니다 (Dial 대신 DialWithTimeout을 사용하여 제한 시간을 구성 할 수 있으므로이 경우 5xx HTTP 오류 코드로 응답 할 수 있습니다).

관련 문제