WAS의 빈번한 IO 접근의 비효율을 타개하기 위한 느슨한 연결(큐와 워커를 활용한)에 대한 단상: 예제를 중심으로

Development / Thought / Decoupling / Asynchronous / Architecture

요즘 TPS가 높을 것으로 예상되는 많은 비즈니스 로직들을 WAS에서 WAS-메시지큐-워커로 이전하는 Decoupling 작업을 진행중인데, 문득 샤워하다 이러한 예제를 들면 느슨한 연결에 대한 구조를 누구나 쉽고 명확하게 이해하지 않을까 싶어, 또 나 스스로도 개념을 명확하게 정리하기 위해 짥게나마(쓸데없이..ㅎㅎ..) 글을 써보기로 했다.

--

영화관, 혹은 야구장에 어떠한 물품 보관함이 있다고 생각해보자. (나는 샤롯데 씨어터의 물품 보관함을 떠올렸다.) 물품 보관함의 역할은 고객의 물품을 받아 락커에 보관하고, 차후 고객이 물건을 찾을 때 참조할 락커 번호를 고객에게 알려주는 것이다.1 더불어 고객의 목적은 당연하게도 물품을 '신속'하고 '안정'적으로 보관하는 것이다. 그를 위한 프로세스는 물품 보관함에 줄을 서서 담당 직원에게 물건을 인계하고 락커 번호표를 찾아가는 것일 테고.

이 물품 보관함은 카운터와 실제 락커가 50걸음 정도 떨어져있고, 한 명의 직원이 카운터를 보고 있다. 손님이 와서 짐을 맡아달라고 하면, 이 직원은 물건을 받아 50걸음을 걸어 락커에 물건을 넣고, 락커 번호를 확인한 뒤에 다시 50걸음을 걸어 카운터로 돌아가 손님에게 락커 번호를 알려줄 것이다. 그 동안 손님은 멍하니 카운터에 서있어야 할 것이다. 고객의 목적인 '신속'과 '안정' 중 '신속'이 결여되고 만것이다. 성격이 본래 천하태평으로 느긋한 손님이면 상관이 없다. 하지만 지금 바로 시작하는 영화에 늦은 상태라면? 배가 너무 아파서 짐을 맡기고 화장실에 갈 예정이었다면? (똥 앞에 장사 없다.) 이야기는 달라질 것이다.

더 심각한 문제는 이 손님 뒤에 계속해서 다른 손님들이 줄을 서게 될 것이라는 점이다.2 그래도 앞에서 지금 짐을 맡기고 있는 사람이야 내 일을 하고 있으니 괜찮겠지만, 뒤에서 기다리고 있는 사람들은 얼마나 짜증이 나겠는가? 이 물품 보관함에서의 짜증이 결국에는 이 영화관에서의 불만스러운 기억으로 남게 될지도 모른다.3 자, 이 기다림을 어떻게 타개하면 좋을까. 50걸음을 단숨에 왔다갔다 할 수 있도록 달리기를 잘 하는 사람으로 물품 보관함 직원으로 채용할까? 그래봤자 인간은 최대 달리기 속도가 제한되어 있다.4 카운터 직원을 따블로, 아니 따따블로 늘리는건 어떨까? 뒤에서 기다리는 손님들은 확실히 줄어들 것이다. 그럼에도 불구하고 실제 짐을 락커에 맡기고 오는 시간은 그대로 일테니, 손님 한 명이 카운터에서 기다리는 시간은 기존과 동일할 것이다. 더불어 월급이 따블, 따따블로 나가는 것은 당연히 예견된 결과이다.5

물품 보관함 슈퍼바이저는 다음과 같은 아이디어를 떠올렸다. 카운터와 락커 사이의 50걸음의 공간에 컨베이어 벨트6를 설치하고, 기왕 카운터에 직원을 늘리는 월급으로 아에 락커에서 짐만 넣는 직원을 채용하기로 한 것이다.7 (어제 밤에 국부론을 읽고 온 모양이다.) 개선된 구조는 다음과 같다. 카운터에 손님이 짐을 맡기러 오면, 카운터 직원은 짐을 받은 뒤 기존에 약속된 규칙에 따라 락커 번호를 직접 할당하고, 꼬리표를 붙여 짐을 컨베이어 벨트 위에 올린다. 손님은 그냥 그 번호를 받고 가면 된다. 손님은 이제 아주 짧은 시간만 카운터에서 기다리면 될 것이다. 컨베이어 벨트 끝에 있는 락커 직원은 짐에 붙은 꼬리표에 맞게 짐을 락커에 넣으면 된다. 컨베이어 벨트에 짐이 미친듯이 쏟아져 온다고? 이제 락커 직원만 더 뽑으면 된다. 힘이 더 쎈 친구를 뽑을 수도 있을 것이고. 심지어 영화가 2시간 후에 끝날 예정이고, 지금 당장 고객이 이 짐들을 찾아갈 일이 없다면 한 명의 락커 직원이 느긋하게 짐을 락커에 보관해도 문제 없을 것이다.8 (이제 약간 공항 체크인 수화물 보관 같은 느낌이 되었다.) 말 그대로 모든 작업이 비동기(非同期, 단어 그대로 '같은 때가 아니'라고 한다.)화되었다. '카운터->보관->번호표 주기'가 하나로 연결되어 있던 프로세스가 나눠지면서 느슨하게 되었다(Decoupling)고 해도 맞는 말일 것이다.

하지만 안타깝게도 모든 프로세스가 '신속'해지긴 했지만, '안정'성은 조금 떨어졌을지도 모른다. 카운터에서 락커 번호를 잘못 썼을 수도 있고, 컨베이어 벨트가 고장이날 수도 있고, 락커 직원이 까먹고 짐을 제대로 처리하지 않을지도 모른다. 분명 예전에는 카운터 직원이 직접 물품이 락커까지 잘 들어간 것을 확인하고 고객에게 락커 번호를 알려주었으니까 문제가 없었는데 말이다.9 더불어 컨베이어 벨트를 설치하고 운영하는데 드는 비용, 락커 직원을 따로 고용하는데 드는 비용이 생각보다 많을 것이다. 물품 보관소에 손님이 끊임없이 쏟아진다면 문제가 없겠지만, 간혹가다가 한 명.. 정말 하루에 한 명만 물품을 보관하는 물품 보관소의 경우에는 그냥 한 명의 카운터 직원이 직접 물품을 보관하는게 훨씬 유리할 수도 있다.

구조를 만드는 사람, 이 영화관의 슈퍼바이저가 '신속'과 '안정', 그리고 '비용' 3개의 축에서 가장 효율적인 방안을 찾는 것. 그것이 바로 내가 할 일이 아닐까 싶다. 자! 이제 일하자!

--

  1. 물품 보관함의 비즈니스 로직이다.

  2. 대기열

  3. 기술과 UX

  4. WAS 자체의 로직을 개선한다.

  5. 병렬 프로세스, WAS 자체의 Scale-out.

  6. 메시지 큐

  7. 워커

  8. 워커 Scale-up/out, batch

  9. 무결성이 보장된 Transaction

Share on : Twitter, Facebook or Google+