애플리케이션 시작 시 DB 시작 대기

2112 단어 GoISUCONtech
변경은 드물지만 참고 횟수가 많은 데이터는 응용 프로그램의 메모리에 캐시하는 것이 효율적이다.
이것은 ISUCON도 자주 하는 최적화로 시작할 때 DB에서 캐시된 데이터를 읽으면 재시작 테스트에서 fail의 주요 원인이 된다.
  • db.Open() DB에 연결하지 않고 연결 풀을 초기화할 뿐 연결 오류가 발생하지 않지만 이러한 착각이 쉽게 발생하여 이 API의 결과err == nil라면 연결할 수 있다
  • 개발 중인 애플리케이션이 재부팅될 때 DB 서버는 항상 작동하므로 오류 없음
  • 테스트를 다시 시작해도 DB 서버가 먼저 시작하고 응용 서버의 재시작이 완료(재시작 전 DB에서 캐시를 얻을 수 있음)된 후에 DB를 다시 시작하면 오류가 발생하지 않고 주의하지 않습니다.
  • 이런 실수로 페일노 코어가 패한 것은 너무나 아쉽기 때문에 앱이 시작될 때 DB가 시작할 때까지 기다리는 코드 도구나 복제 라이브러리를 준비하세요.
    	// db.Open() が成功した直後にこれを入れる.
    	for {
    		err := db.Ping()
    		if err == nil {
    			break
    		}
    		log.Print(err)
    		time.Sleep(time.Second * 2)
    	}
    	log.Print("DB ready!")
    
    db.Ping()는 1개의 연결을 만들고 드라이버가 대응할 때 이 DB를 핑한다.연결 오류가 발생하면 이 곳에서 검사할 수 있습니다.
    _, err := db.Exec("SELECT COUNT(*) FROM table") 등에서 사용하는 테이블 대신 방문 확인 & 버퍼 등에 놓는 것도 고려할 수 있다.

    좋은 웹페이지 즐겨찾기