이번에는 FastAPI를 사용하여 여러 서비스 간에 메시지를 전송하는 방법에 대해 알아보겠습니다.
개요
FastAPI는 빠르고 개발하기 쉬운 API를 만들 수 있도록 하는 웹 프레임워크입니다. ASGI(Asynchronous Server Gateway Interface)를 사용하며 asyncio 등의 비동기 코드를 간편하게 작성할 수 있습니다.
보다 빠르고 효율적인 서비스 간 통신을 위해서는 메시지 큐(Message Queue) 시스템을 사용하여 비동기적으로 메시지를 송수신할 수 있습니다.
FastAPI 및 메시지 큐 설정
먼저, FastAPI와 메시지 큐를 사용하기 위한 설정이 필요합니다. 이 예시에서는 RabbitMQ를 사용하여 메시지 큐 시스템을 설정합니다.
-
FastAPI 설치
pip install fastapi
-
RabbitMQ 설치
RabbitMQ는 각 운영체제에 따라 설치 방법이 다를 수 있습니다.
Ubuntu에서는 다음과 같이 설치할 수 있습니다.
sudo apt-get install rabbitmq-server
-
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를 사용한 서비스 간 메시지 전송 구현 방법에 대해 알아보았습니다.