[MSA] 동기 VS 비동기, 블럭 VS 논블럭의 차이?

Jae Eon·2021년 11월 7일
0

백엔드 공부

목록 보기
13/17

MSA 구조를 공부하면서 가장 먼저 등장한 비동기처리에 대해 알아보고 유사한 용어들을 정리하기 위해 작성한 포스트.

🍎 동기(Synchronous) 방식

어떤 작업을 요청하는 클라이언트(함수, 어플리케이션)를 A, 작업을 수행해서 결과를 돌려주는 쪽을 B라고 할 때,
동기와 비동기는 수행하는 작업의 주체성을 누가 가지고 있는지가 중요하다.

동기(Sync)는 작업의 주체성을 A(호출하는 쪽)가 가지고 있습니다.

A가 B에게 작업을 요구하면, A는 B의 행위가 완전히 끝나거나, B가 결과를 돌려줄 때까지 기다렸다가 자신의 남은 일을 수행.
혹은 당장 결과를 받았더라도 해당 작업이 완료되지 않은 상태라면, B에게 지속적으로 물어보면서 작업 완료 여부를 조사.

즉, B가 언제 결과를 돌려주는지는 상관 없고, A 입장에서는 B의 작업 수행 완료 여부를 아는 것이 중요.

  • Synchronous: 호출된 함수의 수행 결과 및 종료를 호출한 함수가(호출된 함수뿐 아니라 호출한 함수도 함께) 신경씀

🍓 비동기(Asynchronous) 방식

비동기(Async)는 작업의 주체성을 B가 가지고 있습니다.
비동기 상황에서는 A가 B에게 작업을 요구하면서, 결과가 준비된다면 수행해달라고 요청하는 콜백 함수도 같이 넘깁니다.
A는 B에게 작업을 요청한 후 요청한 작업에 대해서는 아무것도 신경쓰지 않고, 자신의 남은 일을 이어서 처리.

동기 상황에서는 해당 작업에 대한 완료 책임을 A가 가지고 있었다면, 비동기 상황에서는 요청을 받은 B가 오히려 해당 작업에 대한 책임을 가지고 있음.
요청을 받은 B가 A에게서 받은 콜백 함수로 해당 작업을 처리하고 완료(다시 A에게 알려줌)합니다.

  • Asynchronous: 호출된 요청의 수행 결과 및 종료여부를 호출된 요청을 처리하는 쪽(B)에서 신경 쓰고 처리(as a callback finish.)

🍑 블럭(Blocking)

Blocking과 Non-Blocking은 로직의 흐름이 멈추는지, 멈추지 않는지를 생각해야 합니다.
A는 작업을 요청한 후 B의 행위가 끝나기를 계속 기다립니다.

만약 동기(Sync-Blocking) 상황이라면 B가 작업을 완료하고 결과를 돌려주기를 오매불망 기다릴 것이고, 비동기(Async-Blocking) 상황이라면 A가 넘겨준 콜백 함수를 B가 실행하고 완료하는 것을 기다릴 것입니다.

그래서 Blocking 상황에서는 작업의 책임을 누가 가지고 있냐에 관계 없이 일단 A쪽에서 흘러가던 로직의 흐름이 멈춥니다.

Blocking은 A가 B를 무작정 기다리는 것이다, 혹은 B가 A를 기다리게 함.

  • Blocking: 호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서 호출한 함수에게 바로 돌려주지 않음

🍋 논블럭(Non-Blocking)

Non-Blocking은 B가 A에게 일단 바로 어떤 결과던 간에 결과를 리턴함.
요청한 작업에 대한 결과가 요청과 동시에 처리되었다면 바로 결과를 리턴 할 수도 있지만, 보통은 결과를 주기에 시간이 걸리기 때문에 아직 준비가 덜 됐다는 실패했다는 신호라도 리턴해줌.
아니면 나중에 결과가 완성되면 여기에 꽂아줄게! 라고 하면서 빈 껍데기를 넘길 수도 있음.

중요한 것은 A가 가던 길을 멈추지 않도록 한다는 것입니다.
A는 진짜 결과든 가짜 결과든 일단 뭔가 리턴받긴 받았으니까, 자기가 해야할 나머지 일들을 계속 이어서 해 나갈 수 있음.

  • Non-blocking: 호출된 함수가 자신이 할 일을 채 마치지 않았더라도 바로 제어권을 건네주어(return) 호출한 함수가 다른 일을 진행할 수 있도록 해줌

참고: https://wbluke.tistory.com/49

🍊 MSA에서는 Async Non-Blocking

MSA에서는 비동기 방식을 사용하는데, 그 이유는 작업을 수행하는 각각의 서비스들이 작업에 대한 책임을 가지는게 일반적이기 때문입니다.

일반적으로 각각의 서비스들이 컨테이너로 존재 하고 이들이 작업을 완료 한 후 알려주게 됩니다.

  • Async-Non-Blocking : MSA구조는 이 형태로 처리되며 A가 B1에게 작업 완료 후 실행하기를 원하는 콜백 함수를 같이 넘겨준다면,
    A는 해당 B1 작업에 대해 신경쓰지 않고 다른 서비스(B2,B3,B4...)에게 작업을 요청하고,
    B들은 작업이 완료된 후 A가 넘겨준 콜백 함수를 수행합니다.
    A는 B에게 요청한 일에 대해 요청만 한 후 신경 끄고 자기 일을 계속 할 수 있고, B도 알아서 요청 받은 일이 끝나면 콜백 함수로 작업의 마무리를 지으면 되기 때문입니다.
    동기가 아니기에 서로 계속 신호를 주고 받으며 완료 여부를 체크하는 리소스도 필요 없게 됩니다.

  • Sync-Non-Blocking은 A가 해당 작업의 완료 책임을 가지고 있고 A는 주기적으로 B의 작업 완료 여부를 체크합니다.
    A가 작업의 주체성을 가지고 있기 때문에 B가 작업을 완료할 때까지 계속 핑퐁하면서 확인합니다.
    A는 결국 하나의 B작업이 끝나기 전까지 서로 계속 신호를 주고 받으며 완료 여부를 체크하는 리소스를 사용하게 됩니다.
    50개의 B들에게 작업을 시킨다면 50개의 B 각각에게 완료 여부를 체크 해야 합니다.

profile
🖋정리를 안하면 잊어버린다.👣한 발자국씩 가보자!

0개의 댓글