프로젝트 중 Redis를 사용하기 위해 Java의 Redis Client인 Lettuce와 Jedis를 비교하게 되었다. 각 라이브러리들의 특징을 비교하기 위해 도큐먼트을 보는 도중 Jedis는 동기 방식만을 지원하며, Lettuce는 비동기 방식 또한 지원하기 때문에 발생하는 성능차이에 대한 내용들이 주를 이루었는데 아무리봐도 이해하기가 쉽지 않았다.
이해하기 어려운 이유는 동기와 비동기 그리고 블로킹과 논블로킹에 대한 나의 배경지식이 너무 얇고, 각 개념들이 혼재되어있기 때문이라는 생각에 한번 정리해보고자 포스트를 작성하게 되었다. 워낙 의견이 갈리기도 하며 추상적인 개념이 존재하여 가볍지 않은 주제라고 생각되지만 최대한 가볍게만 정리하고자 한다.
동기(Synchronous)와 비동기(Asynchronous)
동기와 비동기는 함수를 호출했을 때 호출된 함수의 작업 완료 시점을 호출한 함수와 호출된 함수 중 어느쪽에서 신경쓰는 가에 따라 구분된다.
동기 방식에서 함수를 호출했을 때에는 호출한 함수에서 호출된 함수의 작업 완료를 신경써야 하기 때문에 작업 완료 후의 반환을 기다리거나 또는 바로 반환을 받았다고 하더라도 지속적으로 호출된 함수의 작업 완료 여부를 신경쓰게 된다.
비동기 방식에서는 반대로 함수를 호출했을 때에는 호출한 함수에서는 호출된 함수의 작업 완료를 신경쓰지 않는다. 단지 함수를 호출할 때 callback을 전달하여 호출된 함수가 종료될 때 callback을 실행하게 된다.
Blocking과 Non-Blocking
블로킹과 논블로킹은 함수를 호출했을 때 호출한 함수로 다시 제어권을 넘기는가(바로 return하는가)에 따라서 구분된다.
블로킹은 호출된 함수가 작업을 모두 처리했을 때 return 하며 작업 동안 제어권을 가지고 있으므로 호출한 함수는 그 동안 대기하여야 하는 방식이다.
논블로킹은 호출된 함수가 바로 return하여 호출한 함수에게 제어권을 넘겨주어 호출한 함수가 다른 작업을 처리할 수 있는 방식이다.
조합
블로킹 동기
함수를 호출한 후 호출된 함수가 작업을 시작한다. 호출된 함수의 작업이 진행중일 때 호출한 함수는 block되며, 호출된 함수가 작업을 모두 끝내고 return하면 호출한 함수도 다음 작업을 시작할 수 있다.
논블로킹 비동기
함수를 호출한 후 호출된 함수는 바로 return한다. 그리고 호출한 함수와 호출된 함수가 각자의 일을 처리한다.
논블로킹 동기
함수를 호출한 후 호출된 함수는 바로 return한다. 그리고 호출된 함수가 작업 완료될 때까지 계속해서 호출된 함수에게 작업 완료 여부를 묻는다. 호출된 함수가 작업을 완료했다면 다음 작업을 시작한다.
블로킹 비동기
함수를 호출한 후 호출된 함수가 작업을 시작한다. 호출된 함수의 작업이 진행중일 때 호출한 함수는 block되며, 호출한 함수는 호출된 함수의 작업 완료 여부를 신경쓰지 않는다.
'etc.' 카테고리의 다른 글
Spring Boot 프로젝트에서 FCM을 이용한 웹 푸시 구현하기 (5) | 2021.05.04 |
---|