FastAPI와 Kafka를 사용하여 이벤트 기반 마이크로서비스 아키텍처 구축하기

마이크로서비스는 독립적으로 배포되고 스케일링할 수 있는 유연한 아키텍처입니다. 이벤트 기반 아키텍처는 강력한 비동기 통신을 통해 마이크로서비스 간의 상호작용을 가능하게 합니다. 이번 블로그 포스트에서는 FastAPI와 Kafka를 사용하여 이벤트 기반 마이크로서비스 아키텍처를 구축하는 방법을 알아보겠습니다.

1. FastAPI 소개

FastAPI는 Python 기반의 빠르고 (fast), 간단하며 (easy) 확장 가능한 (scalable) 웹 개발 프레임워크입니다. 비동기 지원과 자동 문서화 기능을 갖춘 FastAPI는 웹 애플리케이션 개발에 매우 유용한 도구입니다.

2. Kafka 소개

Kafka는 실시간 스트리밍 데이터 처리를 위한 분산 메시지 큐 시스템입니다. 이벤트 기반 아키텍처를 구현할 때 신뢰성 있고 확장 가능한 데이터 파이프라인을 구축하는 데 많이 사용됩니다. Kafka는 고성능, 내결함성, 확장성, 지속성 등의 특징을 갖고 있어 대규모 애플리케이션에서 사용하기에 적합합니다.

3. FastAPI와 Kafka를 통합하기

먼저, FastAPI 애플리케이션에 Kafka를 통합하기 위해 kafka-python 라이브러리를 설치해야 합니다. 다음 명령어를 사용하여 설치할 수 있습니다:

pip install kafka-python

3.1 Kafka Producer 만들기

Kafka Producer는 이벤트를 생성하고 Kafka 토픽에 이벤트를 전송하는 역할을 수행합니다. 아래는 FastAPI 애플리케이션에서 Kafka Producer를 생성하는 예제입니다:

from kafka import KafkaProducer
from fastapi import FastAPI

app = FastAPI()
producer = KafkaProducer(bootstrap_servers='localhost:9092')

@app.post("/events")
async def create_event(event: dict):
    producer.send('event_topic', value=event)
    return {"message": "Event created and sent to Kafka"}

3.2 Kafka Consumer 만들기

Kafka Consumer는 Kafka 토픽에서 이벤트를 소비하고 처리하는 역할을 수행합니다. 아래는 Kafka Consumer를 생성하여 이벤트를 처리하는 FastAPI 애플리케이션의 예제입니다:

from kafka import KafkaConsumer
from fastapi import FastAPI

app = FastAPI()
consumer = KafkaConsumer('event_topic', bootstrap_servers='localhost:9092')

@app.get("/events")
async def get_events():
    events = []
    for message in consumer:
        event = message.value
        events.append(event)
    return {"events": events}

4. 마이크로서비스 아키텍처 구현

이제 FastAPI와 Kafka를 통합하여 이벤트 기반 마이크로서비스 아키텍처를 구축하는 방법을 알아보겠습니다. 각 마이크로서비스는 별도의 FastAPI 애플리케이션으로 구축되며, Kafka를 사용하여 이벤트를 전송하고 수신합니다.

아래는 예를 들어 사용자 관리 서비스와 주문 관리 서비스를 구현하는 방법입니다:

4.1 사용자 관리 서비스

# app.py
from kafka import KafkaProducer
from fastapi import FastAPI

app = FastAPI()
producer = KafkaProducer(bootstrap_servers='localhost:9092')

@app.post("/users")
async def create_user(user: dict):
    producer.send('user_topic', value=user)
    return {"message": "User created and sent to Kafka"}

4.2 주문 관리 서비스

# app.py
from kafka import KafkaConsumer
from fastapi import FastAPI

app = FastAPI()
consumer = KafkaConsumer('user_topic', bootstrap_servers='localhost:9092')

@app.get("/orders")
async def get_orders():
    orders = []
    for message in consumer:
        order = message.value
        orders.append(order)
    return {"orders": orders}

마이크로서비스 간의 통신은 Kafka를 통해 이루어지며, 비동기적으로 이벤트를 생성하고 처리합니다. 이를 통해 각 마이크로서비스는 독립적으로 작동하면서도 쉽게 확장할 수 있습니다.

결론

FastAPI와 Kafka를 사용하여 이벤트 기반 마이크로서비스 아키텍처를 구축하는 방법을 소개했습니다. 이 아키텍처는 높은 확장성과 독립성을 제공하여 복잡한 애플리케이션을 쉽게 구축할 수 있게 합니다. FastAPI와 Kafka의 조합은 웹 개발에 강력한 도구가 될 수 있습니다.