[파이썬] Psycopg2에서 Connection recovery strategies

소개

Psycopg2는 Python에서 PostgreSQL 데이터베이스를 사용하기 위한 강력한 라이브러리입니다. 그러나 네트워크 불안정성이나 데이터베이스 서버 장애로 인해 연결이 끊길 수 있습니다. 이러한 상황에서는 연결을 자동으로 복구해야 합니다. 이 블로그 포스트에서는 Psycopg2를 사용하여 연결 복구 전략을 구현하는 방법에 대해 알아보겠습니다.

연결 복구 전략

1. 재시도(retry) 전략

가장 간단한 연결 복구 전략은 재시도(retry)입니다. 연결이 끊어지면 일정 시간간격을 두고 연결을 다시 시도합니다. 이를 구현하기 위해 try-except 문을 사용하여 연결이 실패하면 예외를 처리하고 재시도 로직을 추가합니다. 아래는 재시도 전략을 구현한 예시 코드입니다.

import psycopg2
import time

def connect():
    while True:
        try:
            conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword",
                                    host="myhost", port="myport")
            return conn
        except psycopg2.OperationalError:
            print("Connection failed. Retrying in 5 seconds...")
            time.sleep(5)

위의 코드에서 psycopg2.OperationalError는 연결 실패 예외를 나타내는 특정 예외 클래스입니다. 연결이 실패하면 5초 후에 다시 시도하게 됩니다.

2. 백오프(backoff) 전략

재시도 전략은 간단하지만 과도한 요청을 발생시킬 수 있습니다. 때로는 연결이 장기간 유실된 경우를 대비하여 재시도 간격을 점진적으로 증가시키는 백오프(backoff) 전략이 더 효과적일 수 있습니다. 아래는 백오프 전략을 구현한 예시 코드입니다.

import psycopg2
import time

def connect():
    interval = 1
    while True:
        try:
            conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword",
                                    host="myhost", port="myport")
            return conn
        except psycopg2.OperationalError:
            print("Connection failed. Retrying in {} seconds...".format(interval))
            time.sleep(interval)
            interval *= 2

위의 코드에서는 interval 변수를 사용하여 재시도 간격을 점진적으로 증가시킵니다. 처음에는 1초로 시작하고, 연결 실패할 때마다 이전 재시도 간격의 두 배로 증가합니다.

3. 최대 재시도(Max Retry) 전략

백오프 전략에서는 서버에 너무 많은 요청을 보낼 수 있습니다. 이를 방지하기 위해 최대 재시도(Max Retry) 횟수를 설정하는 것이 좋습니다. 아래는 최대 재시도 전략을 구현한 예시 코드입니다.

import psycopg2
import time

def connect():
    interval = 1
    max_retry = 5
    retry_count = 0
    while retry_count < max_retry:
        try:
            conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword",
                                    host="myhost", port="myport")
            return conn
        except psycopg2.OperationalError:
            print("Connection failed. Retrying in {} seconds...".format(interval))
            time.sleep(interval)
            interval *= 2
            retry_count += 1
    print("Max retry count reached. Connection failed.")
    return None

위의 코드에서 max_retry 변수를 사용하여 최대 재시도 횟수를 설정하고, retry_count 변수를 사용하여 현재 재시도 횟수를 추적합니다. 최대 재시도 횟수에 도달하면 연결 실패를 출력하고 None을 반환합니다.

결론

Psycopg2를 사용하여 연결 복구 전략을 구현하는 것은 데이터베이스 상황에서 예외 처리를 처리하는 중요한 부분입니다. 이 블로그 포스트에서는 재시도, 백오프, 최대 재시도 전략을 사용하는 방법에 대해 소개했습니다. 이러한 전략을 적절하게 조합하여 프로덕션 환경에서 안정적인 연결 처리를 보장할 수 있습니다.