[파이썬] aiohttp 서버의 Graceful Shutdown 처리

aiohttp는 파이썬으로 작성된 비동기 웹 프레임워크로, HTTP 서버를 간단하게 구현할 수 있습니다. 서버를 안전하게 종료하는 것은 서비스의 안정성과 신뢰성을 보장하기 위해 중요한 부분입니다. 이러한 종료 처리를 Graceful Shutdown이라고 합니다.

Graceful Shutdown은 현재 요청을 처리하는 동안 새로운 요청이 거부되지 않고 서버를 종료하는 과정입니다. aiohttp 서버에서도 Graceful Shutdown을 구현할 수 있습니다. 이 글에서는 aiohttp 서버의 Graceful Shutdown 처리 방법에 대해 알아보겠습니다.

aiohttp 서버 생성 및 실행

먼저 aiohttp 서버를 생성하고 실행하는 코드를 살펴보겠습니다.

import asyncio
from aiohttp import web

async def handle(request):
    return web.Response(text="Hello, World!")

app = web.Application()
app.router.add_get("/", handle)

web.run_app(app)

위의 코드는 aiohttp를 사용하여 간단한 웹 서버를 구현한 예입니다. ‘/’ 경로에 대한 GET 요청을 처리하는 핸들러를 등록하고, web.run_app(app)을 호출하여 서버를 실행합니다.

Graceful Shutdown 처리 구현

Graceful Shutdown을 위해서는 aiohttp 서버에 종료 시그널을 감지하고, 정상적인 종료 과정을 수행하는 로직을 추가해야 합니다.

import asyncio
from aiohttp import web

async def handle(request):
    return web.Response(text="Hello, World!")

async def shutdown(signal, loop):
    print(f"Received signal {signal.name} - shutting down")
    tasks = [t for t in asyncio.all_tasks() if t is not
             asyncio.current_task()]
    [task.cancel() for task in tasks]

    print(f"Cancelling {len(tasks)} outstanding tasks")
    await asyncio.gather(*tasks, return_exceptions=True)
    loop.stop()

app = web.Application()
app.router.add_get("/", handle)

loop = asyncio.get_event_loop()
for signal in (asyncio.SIGHUP, asyncio.SIGTERM, asyncio.SIGINT):
    loop.add_signal_handler(signal, lambda: asyncio.create_task(shutdown(signal, loop)))

web.run_app(app)

위의 코드는 aiohttp 서버의 Graceful Shutdown을 처리하는 방법을 보여줍니다. shutdown 함수는 종료 시그널을 인자로 받아 해당 시그널을 처리하는 로직을 수행합니다. 이 함수는 현재 실행 중인 모든 태스크를 취소하고, 이 외의 모든 태스크들이 완료될 때까지 기다린 후 이벤트 루프를 중지시킴으로써 서버를 Graceful Shutdown합니다.

shutdown 함수는 loop.add_signal_handler()를 통해 종료 시그널을 감지하도록 등록되어 있습니다. 이렇게 등록된 핸들러는 서버가 실행 중인 동안 해당 시그널을 감지하면 실행됩니다.

결론

aiohttp 서버에서 Graceful Shutdown을 처리하는 방법에 대해 살펴보았습니다. Graceful Shutdown을 구현함으로써 서버의 안정성과 신뢰성을 향상시킬 수 있습니다. aiohttp와 같은 비동기 웹 프레임워크를 사용할 때는 Graceful Shutdown 처리에 신경을 써야합니다.

앞으로 실제 서비스에서 aiohttp를 사용하는 경우, Graceful Shutdown을 구현하여 서버의 안정성을 높이는 것을 고려해 보세요.