앞서 포스팅한 글에서 언급한 문제에 대해서 자세히 설명을 하려고 한다.

 

아마도 Google Apps Engine은 아마존이나 MS와는 다르게 초기 진행은

완전 무료로 진행되기 때문에, 어중이 떠중이(필자를 포함한) 다양한 사람들이 접근하기 때문에,

CPU에 큰 무리가 될 작업은 아예 배제하고 출발한 것 같다.

(아니면 단순히 설계에서 고려 사항에서 제외하고 출시 한 것일지 모른다.)

 

지금 현재 관점으로 바라볼때 Google Apps Engine은 다음과 같은 구조를 가지고 있다.

아주 단순한 모양인데, GAE 위에 얹어 놓은 모든 응용 프로그램은 Request/Response 기반으로

동작하게 된다.

 

자 여기서 함정이다.

즉 Request와 Reponse 사이에 Web Browser에서는 Time-Out을 결정하게 된다.

만일 GAE에 올려놓은 응용 프로그램 내에 처리해야 되는 내용이 많은 경우에는

Web Browser에 Response를 줄 수 없는데, 이러면 응용 프로그램 오류가 발생한다.

 

물론 응용 프로그램의 설계를 웹 중심으로 다시 생각하여 하나씩 재 설계하면 가능하다.

 

하지만, 로직을 만들다 보면, 내부적으로 처리되야 하는 경우가 있다.

무언가 작업의 Flow가 있을때, 중간에 끊기면 다음 작업의 완성도에 대한 장담이 어려운 경우가

있는데, 이런 응용 프로그램은 참 곤란하다.

예전에 아마존 클라우드 서비스에 대한 소개 내용 중 이런게 있었다.

한 대중 매체 사이트에 담긴 모든 형태의 파일 형식을 바꿀 일이 있었는데,

이 때 아마존의 클라우드 서비스를 이용하여 임대 식으로 해당 자원을 활용하여 변환했다고 한다.

만일 고도의 계산이나 많은 부하가 필요한 변환 작업이라고 할때, 한번 변환 작업이 5분 걸린다면?

이거 Timeout으로 Exception 뿜고 죽는다.

 

 

그렇다면? Back-end에서 처리하는 방법은?

안그래도 Azure를 하면서 그런 기능을 찾아보았다.

Azure에서는 Worker라는 개념이 있어서, 사용자의 특정한 Request가 없이도 실행할 수 있는

로직이 있었다. 게다가, 이 개념에서 시작과 끝에 대해서는 완전 비동기로 동작할 수 있도록 했다.

즉 사용자의 Request는 그 Worker를 동작시켜주세요!!!! 이 정도로 끝내고,

나중에 필요할 때 그 결과값을 얻을 수 있었다.

 

그러나 이 GAE 안에는 그런 개념은 없었다.

비슷한 기능이라고 생각한 기능을 찾기는 했는데....

바로 Cron이였다. 아 뭐 특이한건 아니고, Linux에 있는 그 Cron이다.

일정 시간이 되면 실행하는 그 데몬. 그런데 웃기는건 이 Cron도 위의 한계를 그대로 안고 있다는

것이다. 즉, 사용자가 직접 액션을 안한다 뿐이지, 실제로는 그 동일한 한계를 들어낸다.

위와 같은 꼴이니, 만일 GAE안의 응용 프로그램이 Timeout에 빠진다고 한다면?

동일한 오류를 뿜고 끝!

 

그래서 방법은 한가지 밖에 없다고 판단한다.

클라이언트가 복잡해지는 수 밖에 없다는 생각이다.

 

 

뭔가 복잡한 그림이 됐지만, 원리는 간단하다.
즉 Client 쪽에 로직을 세우면 된다.

 

프로그램을 시작한 뒤, 그 다음 단계에 뭐하고 그 다음 단계의 다음 단계에 뭐하고 하는 것을

Client에서 구현한 뒤, 실제 데이터 입출력이나 처리 작업만 일부분만 넘기는 것이다.

GAE에서는 단지 그 일부분을 처리하기 위한 로직 만을 세우면 되는 것이다.

 

위의 예를 가지고 사용자의 클릭 한번에

     Action1 -> Action 2 -> Action 4

의 작업을 수행한다 가정하자.

그러면 다음과 같은 순서로 실행될 것이다.

  1. Action 1 실행
  2. Action 1에서 GAE의 Action1에 해당하는 루틴 Requst.
  3. GAE의 Response 내용을 받음.
  4. Action 2 실행.
  5. Action 2에서 GAE에 Action2에 해당하는 루틴 Request.
  6. GAE의 Response 내용을 받음
  7. Action 4 실행
  8. Action 4에서 GAE에 Action2에 해당하는 루틴 Request.

 

즉 GAE에서는 웹 서비스의 단위 메소드,

이른바 Web 2.0의 한 유행인, 공개 API와 같은 꼴로 구성하면 어떻게든 된다.

 

 

아직은 구성에 대해서 다양한 시도와 파악 중이다.

현재까지 이 Google Apps Engine을 통해 무언가를 만든다는 개념은

위의 형태에서 벗어나게 되면 이래 저래 힘들듯 싶다는 생각이다.

 

지금까지 파악한 방법에서 성공한 방법은

클라이언트 측은 Rich 하게 만들고, GAE에서는 가볍게 만들어

GAE에 데이터를 저장하고 가공하는 정도?

그것도 Time-out 걸리지 않을 정도로, 아주 가볍게 처리해야 한다는 것이다.

 

UPDATE 2010-01-30   21:40

Auzre의 Worker의 비동기 개념을 탑재 시켜준 거와 비슷한 기능이 있다.

Task Queue Java API다.  그런데, Time Out 레벨의 작업 역시 못하리라 생각은 든다.

Workflow 형태로 뭔가 Back-end에서 실행은 할 수 있을지는 모르겠는데,

역시 동작에 필요한 무언가의 작업은 Google Apps 내 웹을 부르는 작업을 수행한다.

하지만 아직 이 부분에 대해서 실험은 안 해봤다.

(게다가 이 동작 Java 에서는 베타 테스트 중이다. )

 

아직은 개발 도상 단계인듯. 조금 더 살펴봐야 겠다.

728x90

+ Recent posts