파이썬으로 살펴보는 아키텍처 패턴 - 10장 (이벤트를 사용한 마이크로서비스 통합)

이동욱

2022/01/17

분산된 진흙공, 명사로 생각하기


분산 시스템에서 오류 처리하기


대안 : 비동기 메시징을 사용한 시간적 결합


이러한 구조가 더 좋은 이유

레디스 발생 / 구독 채널을 통합에 사용하기


레디스는 메시지 버스를 감싸는 다른 얇은 어댑터


r = redis.Redis(**config.get_redis_host_and_port())

def main():
    orm.start_mappers()
    pubsub = r.pubsub(ignore_subscribe_messages=True)
    pubsub.subscribe('change_batch_quantity')

    for m in pubsub.listen():
        handle_change_batch_quantity(m)

def handle_change_batch_quantity(m):
    logging.debug('handling %s', m)
    data = json.loads(m['data']) # 시스템 진입점에서 해야할 일은 JSON을 역직렬화 하고 역직렬화한 객체를 Command로 변환해서 서비스 계층으로 넘기는 일이다.
    cmd = commands.ChnageBatchQuantity(ref=data['batchref'], qty=data['qty'])
    messagebus.handle(cmd, uow=unit_of_work.SqlAlchemyUnitOfWork())
r = redis.Redis(**config.get_redis_host_and_port())


def publish(channel, event: events.Event):  # 여기서는 하드 코딩한 채널을 사용하지만, 이벤트 클래스 / 이름과 적절한 채널을 맵핑하는 정보를 저장할 수도 있다. 이렇게 하면 메시지 유형 중 일부에 대해 다른 채널을 사용할 수도 있다.
    logging.debug('publishing: channel=%s, event=%s', channel, event)
    r.publish(channel, json.dumps(asdict(event)))

외부로 나가는 새 이벤트


@dataclass
class Allocated(Event):
    orderid: str
    sku: str
    qty: int
    batchref: str

내부 이벤트와 외부 이벤트 비교


정리


참고 문헌


>> Home