Mee6aaS

워크플로 인지 저지연 서버리스 플랫폼


GoLang TypeScript Node.js Docker gRPC Pinned Awarded Published
시스템 구조 개요
시스템 구조 개요

연구목적으로 개발한 서버리스 플랫폼으로, 목표하는 바는 서버리스 환경에서 실행되는 워크플로에서 함수 간 메시지 전달 비용과 데이터 의존성이 발생할 때 외부 스토리지에 접근하는 비용을 최소화하는 것입니다. 본 프로젝트와 관련한 두 개의 논문을 각각 IEEE MASS 2019ICICPE 2019에 개재했습니다. 또한 연구실에서 수행하는 IITP 연구 과제에 활용되었습니다.

Mee6aaS의 핵심 아이디어는 지역성을 활용하는 것입니다. 기존 서버리스 플랫폼은 서버리스 함수로 구성된 워크플로 실행을 고려하지 못했습니다. 워크플로를 실행하는 오케스트레이터는 워크플로의 함수들을 플랫폼에 차례대로 실행 요청을 하는 것 뿐으로, 각 실행요청은 로드벨런서에 의해 클러스터의 여러 노드에 분산됩니다. Mee6aaS는 오케스트레이터에 의해 실행되는 모든 함수를 하나의 노드에 배치함으로써 워크플로 실행에 이점을 줍니다. 그뿐만 아니라 워크플로의 패턴을 인지하여 Cold Start를 완화할 수 있습니다.

Zeep은 Worker 노드마다 하나씩 실행되는 로컬 에이전트로, 함수 실행이 요청되면 유휴 컨테이너에 해당 함수의 실행 명령을 보냅니다. 컨테이너마다 하나씩 실행되는 에이전트 대리자인 Kyle이 실행 명령을 수신합니다. KyleZeep과 같은 역할을 하지만 함수 실행이 요청되면 유휴 런타임 프로세스에 해당 함수의 실행 명령을 보냅니다. 즉, Mee6aaS 에서는 하나의 컨테이너에서 다수의 런타임 프로세스가 실행될 수 있습니다. 하지만 각 함수 인스턴스의 성능 격리를 위해 순차적인 함수만 같은 컨테이너를 공유하도록 구현하였습니다

물론 런타임 프로세스들을 관리하는 Kyle의 역할까지 Zeep이 수행할 수도 있습니다. 하지만 만약 Kyle이 없다면 Zeep은 컨테이너에 메시지를 전송하기 전에 항상 상태를 확인하는 과정을 거쳐야 해서 메시지 전달 지연시간이 증가하게 됩니다. 왜냐하면 Cold Start를 고려해서 최근에 실행된 함수 인스턴스의 삭제 보류를 하게 되면서 함수 인스턴스가 정지상태에 있을 수 있기 때문입니다.

핸드오버 과정
핸드오버 과정

Mee6aaS는 Cold Start 완화를 위해 미리 컨테이너를 생성시켜 Kyle을 실행합니다. 하지만 워크플로가 아닌 하나의 함수, 또는 병렬로 실행되는 함수의 경우 하나의 컨테이너에 하나의 런타임 프로세스만 실행되므로 Kyle은 의미가 없어지며 오히려 오버헤드로 작용됩니다. 그래서 이 경우에 Kyle은 런타임 프로세스를 Zeep으로 직접 연결되도록 핸드오버를 수행합니다. 이를 위해 ZeepKyle은 런타임에 대하여 완전히 동일한 서비스 인터페이스를 제공하도록 설계되었습니다.