[python] FastAPI로 서비스간 메시지 전송 구현하기

이번에는 FastAPI를 사용하여 여러 서비스 간에 메시지를 전송하는 방법에 대해 알아보겠습니다.

개요

FastAPI는 빠르고 개발하기 쉬운 API를 만들 수 있도록 하는 웹 프레임워크입니다. ASGI(Asynchronous Server Gateway Interface)를 사용하며 asyncio 등의 비동기 코드를 간편하게 작성할 수 있습니다.

보다 빠르고 효율적인 서비스 간 통신을 위해서는 메시지 큐(Message Queue) 시스템을 사용하여 비동기적으로 메시지를 송수신할 수 있습니다.

FastAPI 및 메시지 큐 설정

먼저, FastAPI와 메시지 큐를 사용하기 위한 설정이 필요합니다. 이 예시에서는 RabbitMQ를 사용하여 메시지 큐 시스템을 설정합니다.

  1. FastAPI 설치

    pip install fastapi
    
  2. RabbitMQ 설치

    RabbitMQ는 각 운영체제에 따라 설치 방법이 다를 수 있습니다.

    Ubuntu에서는 다음과 같이 설치할 수 있습니다.

    sudo apt-get install rabbitmq-server
    
  3. Python에서 RabbitMQ 사용을 위한 라이브러리 설치

    pip install aio_pika
    

메시지 전송 API 구현

이제 FastAPI를 사용하여 메시지 전송을 위한 API를 구현해 보겠습니다.

from fastapi import FastAPI
import aio_pika

app = FastAPI()

async def send_message_to_queue(message: str):
    connection = await aio_pika.connect_robust("amqp://guest:guest@localhost/")
    channel = await connection.channel()
    queue = await channel.declare_queue("message_queue")
    await channel.default_exchange.publish(
        aio_pika.Message(body=message.encode()),
        routing_key="message_queue"
    )

    await connection.close()

@app.post("/send-message")
async def send_message(message: str):
    await send_message_to_queue(message)
    return {"status": "Message sent successfully"}

위의 코드는 /send-message 엔드포인트를 통해 메시지를 전송하는 API를 구현한 것입니다. 이 API는 클라이언트가 메시지를 전송하면 해당 메시지를 RabbitMQ 메시지 큐에 전송합니다.

메시지 수신 및 처리

메시지 수신 및 처리는 RabbitMQ에서 구독자(Consumer)를 생성하여 처리할 수 있습니다. 다음 예시는 RabbitMQ로부터 메시지를 수신하는 코드입니다.

import aio_pika

async def on_message(message: aio_pika.IncomingMessage):
    async with message.process():
        print(message.body.decode())

async def receive_messages():
    connection = await aio_pika.connect_robust("amqp://guest:guest@localhost/")
    channel = await connection.channel()
    queue = await channel.declare_queue("message_queue")

    await queue.consume(on_message)

# 메시지 수신 시작
await receive_messages()

위의 코드를 실행하면 RabbitMQ에서 메시지 큐에 쌓인 메시지들을 순차적으로 받아오고, on_message 함수에서 해당 메시지를 처리합니다.

메시지 큐를 사용하면 서비스 간의 통신에서 발생하는 지연과 부하를 줄일 수 있으며, 서비스들 간의 의존성을 최소화할 수 있습니다.

이상으로 FastAPI와 RabbitMQ를 사용한 서비스 간 메시지 전송 구현 방법에 대해 알아보았습니다.

참고 자료