클라우드 기반 응용서비스를 개발할 때 고려해야 할 점
씽플러스(Thing+)는 사물인터넷(IoT) 응용서비스를 위한 서비스형 소프트웨어(SaaS)입니다. 사용자에게 IoT 경험을 제공하려는 서비스 파트너에게 클라우드 인프라에서 수행되는 애플리케이션 뿐 아니라 임베디드 미들웨어와 클라이언트 애플리케이션까지 모두 제공해 쉽고 빠르게 서비스를 시작할 수 있도록 도와줍니다. 이번 글에서는 씽플러스 개발 경험을 바탕으로 클라우드 기반 응용서비스를 개발할 때 고려해야 할 점을 살펴보겠습니다.
확장성과 고가용성을 만족하기 위한 고려
씽플러스는 개발환경 구성을 위해 한 대의 VM에서 모든 서비스를 수행할 수도 있고, 상용 서비스를 위해 수십 대 이상의 VM에서도 수행될 수 있는 확장 가능한 구조를 가집니다. 또한, 장애조치(fail over)를 통해 고가용성을 유지하고 있습니다.
이러한 확장성과 고가용성을 만족하기 위해서는 다음과 같은 고려가 필요합니다.
- 하나의 인스턴스(instance)에서 문제가 있을 때 바로 다른 인스턴스에서 해당 기능을 수행할 수 있도록 장애조치(failover)가 가능한가
- 부하가 많이 걸리면 인스턴스를 더 늘려서 해결할 수 있도록 분산할 수 있는가
- 샤딩(sharding)을 할 수 있는가
- 작업큐(job queue)를 사용할 수 있는가
- 여러 개의 인스턴스를 어떤 형태(active/standby, active/active, master/slave)로 수행할 것인가
풀스택 개발자의 생산성 향상을 위한 고려
씽플러스는 단순한 기능 하나를 추가하더라도,
- 기기 연결을 위한 임베디드 미들웨어/라이브러리,
- 클라우드상의 다양한 서버 인프라,
- 사용자 인터페이스를 위한 포털 애플리케이션
등의 다양한 코드를 수정해야 하는 경우가 빈번합니다. 따라서 씽플러스의 풀스택 개발자들이 이러한 기능을 쉽게 추가할 수 있도록 가능한 동일한 개발 언어인 자바스크립트를 이용하고 동일한 라이브러리 및 코딩 표준(coding convention)을 유지하려고 노력하고 있습니다. 예를 들면 lodash 라이브러리를 임베디드 미들웨어, 서버 측과 웹 브라우저 클라이언트 코드에서 모두 동일하게 사용하고 있습니다.
자동화, 자동화 그리고 자동화
씽플러스를 운영하기 위해서는 여러 대 서버를 관리해야 하고 새로운 버전의 애플리케이션을 적용하기 위한 릴리즈 등 다양한 작업들이 필요합니다. 그러므로 이러한 작업을 자동화할 수 있도록 클라우드를 구축해야 합니다. 씽플러스에서는 노드 컨트롤(node control)과 셀 스크립트(shell script)등을 사용해 자동화 코드를 직접 작성하고 있으며 앞으로도 서버 애플리케이션 및 인스턴스의 자동 배포를 위해 ansible등과 같은 도구의 도입을 고려하고 있습니다.
또한, 복잡한 시스템을 항상 안정된 상태로 유지하기 위해 다음과 같은 자동화된 테스트를 수행하고 있습니다.
- 단위 테스트: 매 소스코드 커밋(commit) 시 CI(continous integration)가 수행되고 이때 단위테스트를 수행합니다.
- 사용자 인터페이스 인터액티브 테스트: 주기적으로 사용자 애플리케이션의 인터액티브 사용자 인터페이스 테스트를 수행합니다.
- 종단간(end to end) 테스트: IoT 기기에서 발생한 데이터가 서버에 저장되고 이에 의해 규칙이 수행되며 결과가 타임라인에 남는 전 과정을 지속적으로 확인합니다.
클라우드 인프라에 독립적인 아키텍처 및 사용비용의 최소화
씽플러스는 특정 클라우드 인프라에 의존적인 기능을 최대한 줄이기 위해 도커(docker)등의 컨테이너 기술을 이용하여 아마존웹서비스(AWS), 애저(Azure), 사설 클라우드에서도 씽플러스의 수행이 가능하도록 설계되었습니다. 그리고 클라우드 인프라의 사용 비용에 대한 과금 방식을 정확하게 이해해 최소 비용으로 씽플러스 기능이 동작하도록 구현되어 있습니다.