Asynchronism
- 출처: https://github.com/donnemartin/system-design-primer?tab=readme-ov-file#asynchronism
GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Inclu
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. - donnemartin/system-design-primer
github.com
- 개요
비동시 워크플로우는 비싼 연산에 대한 요청 시간을 줄이는데 도움을 준다. 또한 정기적인 데이터 집계와 같은 시간이 걸리는 작업을 사전에 수행함으로써 효율성을 높일 수 있다.
- Message queues
메시지큐는 메시지를 수신하고 보관하며 전송한다. 만약 연산이 너무 느리다면 메시지큐를 다음과 같이 사용할 수 있다.
- Application 이 작업을 큐에 넣고 유저에게 작업의 상태를 알린다.
- 워커는 큐로부터 작업을 가져와서 처리하고 작업이 완료되었다는 신호를 전송한다.
유저는 작업을 기다리지 않아도 되며, 작업은 백그라운드에서 실행된다. 이 시간동안 클라이언트는 작업이 완료된것처럼 보이기 위해 선택적으로 작은 업무를 수행할 수 있다. 예를 들어 만약 트윗을 포스팅할 때 트윗은 즉시 타임라인에 포스팅되지만 실제로는 트윗이 팔로워들에게 도달하기까지는 시간이 소요될 수 있다.
Redis는 간단한 메시지 브로커로서는 유용하지만 메시지가 유실될 수 있다. RabbitMQ 는 일반적으로 널리 사용되지만 AMQP 프로토콜을 적용해야 하며, node 를 관리해야 한다. Amazon SQS 는 호스팅되지만 latency 가 높을 수 있으며 메시지가 두번 전송될 가능성이 존재한다.
- Task queues
Task queue 는 task 관련된 데이터와 task 를 수신하며, 이를 실행하며 결과를 전송한다. 스케줄링을 지원하고 백그라운드에서 연산 집약적인 작업을 실행하는데 사용될 수 있다.
- Back pressure
만약 큐가 갑자기 많이 사용되기 시작하면 큐의 크기가 메로리를 넘어서면서 캐시 미스, 디스크 읽기 그리고 성능 하락이 올 수 있다. Back pressure 는 큐 크기를 제한함으로써 높은 처리량을 유지하고 큐에 존재하는 작업의 응답시간을 좋게 유지하는데 도움을 준다. 한번 큐가 차면 클라이언트는 server busy 나 503 http status 를 받는다. 클라이언트는 exponential backoff 방싱그로 요청을 일정시간 후에 재시도하게 된다.
- 단점
비싸지 않은 연산과 실시간 업무 흐름과 같은 use case 에서는 동기 연산이 더 적절하며 큐를 도입하면 지연과 복잡성이 증가한다.