파이썬과 Node.js를 연동하면서 겪은 문제점

이번에는 몇년전 했던 프로젝트에서 겪은 문제점을 정리해봤습니다. 이때 발생한 문제점은 아직도 원인을 모르겠습니다만… 한가지 배운것은 프로젝트 시작시 “Survey 제대로 하지 않으면 망한다” 였습니다…

몇년전 파이썬으로 백그라운드 서비스(데몬)을 만들고, Node.JS를 웹서버로 하는 프레임워크를 만드는데 참여했었다.

우선 전체 서비스 구조는 Node.JS의 Express3를 이용해서 API 서버를 만들었고, 특정 API가 호출되면 데몬으로 동작중인 파이썬 서비스의 함수를 XML-RPC로 호출하는 것이다.

전체 서비스 구조

Node.js 구현을 최소한으로 하기 위해서 Route 페이지를 파이썬 서비스가 매칭 되도록 구현했다. 즉 serv1/A라는 api를 호출하면 파이썬 서비스중 1번의 A라는 함수가 호출되도록했다. 아래 그림은 Node.JS 쪽 함수 일부이다.

파이썬 서비스를 작성하면 대응하는 자바스크립트 코드가 자동으로 위와 같이 만들어지게 했다. 그리고 생성된 자바스크립트 파일을 Node.js의 Route폴더에 저장하면 끝이었다.

아니… 어쩌면 비극의 시작이었을 것이다.

잘 동작했고, 문제가 없었지만… 실시간성 기능을 추가하면서 문제점이 나왔다. 웹 화면에서 2초에 한번씩 데이터를 ajax로 Call하면서 데이터를 갱신하는 기능을 만들었다. 이런 기능이 하나 둘씩 늘어가면서, 다른 함수들이 호출이 안되는 현상이 나타났던 것이다.

크롬 개발자 도구에서 확인해 본 결과 실시간으로 호출되는 함수들이 계속 Pending이 걸렸다. 크롬은 한 탭당 http Connection을 최대 6개만 연결하기 때문에 접속하고 시간이 지남에 따라 계속 느려지게 되었고, Connection Timeout이 발생하면서 사이트가 제대로 동작하지 않았다. 이 현상은 사용자 접속이 늘어날수록 발생했다. 5명이후 부터는 로그인 Request도 Pending이 되면서 접속조차 안되는 현상이 나타났다.

파이썬으로 작성된 XML-RPC 서버쪽을 Non-blocking 으로 동작하게 코딩을 했다. 하지만 의도했던 대로 동작하지 않았고, XML-RPC로 통신하는 구간에서 계속 병목이 발생했다.

XML-RPC 테스트
XML-RPC 테스트

아래 그림은 같은 동작을 하도록 만든 Tonado기반의 서비스와 우리의 XML-RPC 기반의 서비스의 성능을 측정한 결과이다. (측정은 Jmeter로 사용자 수를 늘려가며 했다)

사용자 증가에 따른 Response time 변화

아직도 원인은 잘 모르겠지만 막연히 GIL때문이 아닐까 추측하고 있다. 백그라운드 서비스는 실시간으로 데이터 수집 및 처리까지 하고 있고, 그 중간에 함수 요청을 받았기 때문에 느려진건 아니었을까? 라는 추측만 하고 있다.

추정하는 원인

처음에는 백그라운드 서비스를 포함하는 사용하기 쉬운 MVC프레임워크를 만들어 보자는 것이었다. 하지만 모델 뷰 컨트롤러의 개념을 모호하게 이해하고 있었고(지금도 그렇지만…) 파이썬으로 하면 쉽게 될것이라는 안일한 생각도 했었다.

결국 토네이도 + Nginx (+ 기존 구조)를 도입하여 간신히 해결하긴 했는데 결국 비대해진 프로젝트는 관리가 힘들어졌다. ㅠㅠ

지금이라면 그냥 백그라운드 모듈은 그냥 작성하고, 장고같은걸로 MVC프레임워크 대체해서 썼을듯하다. 혹은 Nginx + Node.JS (웹서비스)+ 토네이도(RESTful API)로 사용하던가…

PS. 그림같은건 옛날에 그려놓은거라 지금 생각해보면, 용어 선택도 잘못됬고, 그림도 잘못 된거 같지만… 안고치고 그냥 올립니다. 잘못된 부분은 마구마구 지적해 주세요~~


수정이력

2017년 3월 20일 : 제목만 보면 Node와 Python을 사용하면 안될것 같은 느낌이 들어 제목 수정

Show your support

Clapping shows how much you appreciated hans mj’s story.