데이터베이스 락 현상 완화를 위한 비동기 큐 활용하기

데이터베이스 락 현상 완화를 위한 비동기 큐 활용하기

python asyncio를 활용한 db writer queue

·

2 min read

서론

데이터베이스 락 현상은 동시에 많은 데이터베이스 요청이 발생할 때 종종 발생하는 문제로, 이로 인해 시스템의 성능이 저하되고, 최악의 경우 시스템이 완전히 멈출 수도 있습니다. 이 글에서는 이러한 문제를 완화하는 효과적인 방법 중 하나인 비동기 큐의 사용에 대해 알아보겠습니다.

비동기 큐의 이해

비동기 프로그래밍은 프로그램이 더 효율적으로 동시에 여러 작업을 처리할 수 있도록 해주는 기법입니다. 특히, 큐(Queue)는 데이터를 순차적으로 처리하는 데 사용되는 데이터 구조로, 비동기 프로그래밍에서 중요한 역할을 합니다.

구현 방법

Python의 asyncio 라이브러리는 비동기 프로그래밍을 위한 강력한 도구를 제공합니다. 여기서는 asyncio.Queue를 사용하여 비동기 큐를 구현하고, 데이터베이스 작업을 큐에 넣어 순차적으로 처리합니다.

실제 적용 사례

DartNoticeScraper 클래스는 비동기 큐를 사용하여 데이터베이스 작업을 관리하는 예입니다. 이 클래스는 여러 비동기 작업에서 발생하는 데이터베이스 쓰기 작업을 큐에 추가하고, 별도의 비동기 작업으로 큐에서 데이터를 가져와 순차적으로 데이터베이스에 씁니다.

import asyncio
from sqlalchemy.exc import SQLAlchemyError

class DartNoticeScraper:
    def __init__(self, collections_db):
        self._db_write_queue = asyncio.Queue()  # 데이터베이스 작업을 위한 큐
        self.collections_db = collections_db    # 데이터베이스 작업을 처리하는 객체

    async def _db_writer(self):
        while True:
            db_task = await self._db_write_queue.get()  # 큐에서 작업 가져오기
            try:
                self.collections_db.bulk_insert_collectdartnotice(db_task)  # 데이터베이스 쓰기 작업 수행
                self._db_write_queue.task_done()
            except SQLAlchemyError as e:
                self._logger.error(f"DB Write Error: {e}")

    async def _scrape_company_dart_notice(self, company_id, corp_code, semaphore):
        # 비동기 크롤링 로직 (생략)
        # ...
        if notice_data:
            await self._db_write_queue.put(notice_data)  # 큐에 데이터베이스 쓰기 작업 추가

    async def scrape_dart_notice(self):
        db_writer_task = asyncio.create_task(self._db_writer())  # DB Writer 코루틴 시작

        # 모든 회사에 대한 공시 정보 수집 (생략)
        # ...

        await self._db_write_queue.join()  # 모든 DB 작업이 완료될 때까지 대기
        db_writer_task.cancel()  # DB Writer 코루틴 종료

성능 및 안정성 향상

이러한 방식을 사용함으로써, 데이터베이스에 대한 동시 요청이 큐를 통해 관리되어 락 현상을 크게 완화할 수 있습니다. 또한, 시스템의 안정성이 향상되며, 데이터베이스 작업의 성능도 개선됩니다.

결론

비동기 큐를 사용하는 것은 데이터베이스 작업을 효율적으로 관리하고, 락 현상을 줄이며, 전반적인 시스템 성능을 향상시키는 효과적인 방법입니다. 실제 프로젝트에서 이러한 방법을 적용하면 많은 이점을 얻을 수 있습니다.

참조 및 추가 자료