-
비동기 asynchronous📖 개발 공부 2023. 7. 2. 16:52
쉬운코드님의 유튜브 영상 보면서 정리한 내용입니다.
3가지 관점으로 asynchronous의 개념을 알아보자.
1. programming 관점에서
Synchronous (동기)
Synchronous programming: 여러 작업(task)들을 순차적으로 실행하도록 한다.
Asynchronous (비동기)
Asynchronous programming: 여러 작업(task)들을 독립적으로 실행하도록 한다. 이는 시간을 단축시킬 수 있다.
Asynchronous programming과 Multi-threading은 다르다.
- Asynchronous programming: 여러 작업을 동시에 실행하는 프로그래밍 방법론
- Multi-threading: asynchronous programming의 한 종류
multi-threads
요리사 각각을 thread라 할 수 있다. → 여러 작업을 여러 명이 나눠가져서 동시 실행할 수 있도록 한다.
- 멀티코어를 활용할 수 있는 장점이 있지만, 스레드를 너무 많이 만들면 context switching 비용을 많이 쓸 수 있다. 그리고 동시에 race condition이 발생할 수 있다.
non-block I/O
이는 하나의 싱글 스레드가 I/O 작업을 하고, I/O 작업을 blocking 모드로 하는 것이 아니라, 또 다른 I/O 작업을 하고 blocking 하는 게 아니라 또 다른 cpu를 사용하는 여러 작업을 하도록 한다.
→ CPU와 I/O 작업을 동시에 할 수 있게 한다.
즉, 적은 스레드로도 좋은 성능을 낼 수 있는 그런 프로그래밍을 할 수 있다.
백엔드 프로그래밍의 추세는 스레드를 적게 쓰면서도 non-block I/O를 통해 전체 처리량을 늘리는 방향으로 발전 중이다.
2. I/O 관점에서
I/O 관점에서 sync/async 개념은 문맥에 따라 3가지로 분류한다.
case1
- synchronous I/O = block I/O
- asynchronous I/O = non-block I/O
case2
- synchronous I/O = 요청자가 I/O 완료까지 챙겨야할 때
- asynchronous I/O = 완료를 noti 주거나 callback으로 처리
case3
asynchronous I/O = block I/O를 다른 thread에서 실행할 때
thread B만 blocking 되고, thread A는 계속 실행할 수 있게 하여서
thread B의 결과를 최종적으로 합쳐서 처리하도록 동작하게 한다.
2. 백엔드 아키텍처 관점에서
하나의 서비스는 기능과 역할에 따라 여러 개의 마이크로 서비스로 구성되고, 이들 사이에는 빈번하게 커뮤니케이션이 발생한다.
Synchronous communication
만약 C에서 예상치 못한 일이 발생해서 응답 불능 상태가 되면, 자칫 잘못해서 B에도 영향을 주고, 또 A까지 영향을 줄 수 있다.
→ 서비스 전체 장애가 확대되는 불상사가 나올 수 있다.이를 해결하기 위해 비동기로 커뮤니케이션을 할 수 있도록 구조를 짜는 게 중요하다.
Asynchronous communication
이 방식은 C에서 장애가 나더라도 이 영향이 A, B 까지 파급되지 않는다. 중간에 Message Q라는 버퍼가 있기 때문에 B, C는 Message Q만 바라보기 때문이다. A는 A안에서, B는 B안에서 C는 C안에서만 장애가 난다.
신속하게 B로부터 데이터를 읽어와서 처리해야할 때는 메세지 큐는 상대적으로 처리가 느릴 수 있어서 이때는 API를 쓰는 게 좋을 수 있다. (단, A가 최대한 영향을 덜 받을 수 있도록 개발해야함.)
728x90반응형'📖 개발 공부' 카테고리의 다른 글
CQRS 패턴 (0) 2023.07.25 [Kubernetes] sidecar pattern (사이드카 패턴) (0) 2023.07.10 intellij로 디버깅 하기 (0) 2023.06.06 배포 전략 (Rolling Update, Blue/Green, Canary) (0) 2023.04.09 Eventual Consistency (0) 2023.04.01