웹 서비스 배포 플랫폼 Luidium 개발기 - 3
Go 개발기
Bucket storage를 다루는 서버 등 3개의 microservice를 Go로 완성하면서 느낀 점은 Rust에 비해 개발 속도가 월등히 빨랐고, 가속된 개발 속도에 비해 퍼포먼스 저하는 거의 보이지 않았다는 점이다. 내장된 각종 편리한 기능과, npm 못지않은 풍부한 라이브러리 생태계가 활성화되어 있기에, 웹서버를 짜기에 최적화된 언어라고 느꼈다.
Architecture 확장
Go를 이용한 Micro Service Architecture가 개발 속도도 빠를 뿐더러 유지 보수 및 확장성에 강점 있다고 판단하여 이를 충분히 활용한 아키텍쳐를 이용하기로 확정하였다. 최종 아키텍쳐는 다음과 같다.
위와 같이 새롭게 Sentinel 서버를 추가하여 유저 로그인 등 인증, 애플리케이션 각각에 대한 유저의 권한 관리, 그리고 로깅 등의 역할을 수행하도록 하였고, REST API를 이용하여 다른 서버 혹은 클라이언트에서 편리하게 사용할 수 있도록 하였다. 특히 애플리케이션을 유저가 만들고, 다른 유저에게 읽기 / 쓰기 / 배포 권한을 주고, 애플리케이션 내부에서도 각각의 서비스(블록)마다 다른 권한을 가질 수 있기 때문에 이러한 복잡한 권한을 관리하기 위하여 구글의 Zanzibar라는 서비스의 Concept를 차용하여 권한을 편리하게 관리할 수 있도록 하였다. 일례로 Docker Bridge Network 내부에서, Main server가 Sentinel 서버에 GET “/authority/{user_id}/{application_id}” 와 같이 요청을 보내면 해당 유저의 애플리케이션에 대한 접근 권한을 알려준다. 따라서 CLI, 혹은 웹 클라이언트에서 업로드 / 다운로드 / 배포 요청이 발생하면 해당 요청에 맞는 권한을 유저가 가지고 있는지 먼저 확인하고, 요청을 수행하거나 차단하는 절차를 매우 편리하게 구현할 수 있었다.
Builder Server는 Kafka의 topic들을 consume 하여 요청에 맞게 block에 해당하는 코드 베이스를 storage에서 다운로드 받아 이를 빌드한 image를 storage에 저장하거나, container를 running하는 서버이다. Host machine의 Docker Engine과 연결되어 있으며, docker engine api를 이용하여 각종 작업을 수행한다. 일반적인 http 통신 방식으로 api를 expose 하지 않은 이유는 docker image 빌드 과정이 40초에서 길게는 90초까지 걸릴 정도로 오랜 시간이 걸리는 작업이며, docker engine을 이용하기 때문에 동시에 너무 많은 작업을 수행할 시 host server의 resource를 과도하게 소모하며, 오작동을 일으킬 수 있겠다는 판단이 있었기 때문이다. 이에 Kafka와 같은 Message Queue 시스템을 도입하여 Main server의 빌드 요청을 효율적이고, 느슨하게 실행시킬 수 있도록 설계하였다.
Storage Server의 경우 파일 업로드 부분을 담당한. 차후 파일 업로드에 있어 오버헤드가 증가할 경우 쉽게 storage server 의 instance 개수를 늘리는 방식으로 scale up 할 수 있으며, 인증 로직이 sentinel server에 분리되어 있으므로 파일의 소유권자에 대한 validation도 도입이 쉬울 것으로 예상하였다.
또한 CLI 개발을 위해 Rust 도입을 추진하였으나, 파일 업로드 고속 병렬 처리에 더 적합했던 Go 언어의 Cobra라는 프레임워크를 이용하게 되었다. 초기 CLI는 web에서 발급한 cli token을 이용해 local machine에서 initializing, 수정된 코드 업로드를 통한 자동 배포 기능만을 구현할 예정이다. CLI configuration 파일로는 toml 형식을 채택하였고, 다음과 같은 정보들을 담을 예정이다. cli_token은 좀더 감춰진 곳에 저장할 예정이다.
# This file is used to configure the Luidium CLI
# You can download template configuration from Application Dashboard
# Block configuration (Do not modify)
application = "myapp"
version = "1.0.0"
name = "main-server"
# If this option is disabled, luidium cli will upload all files in the project directory
# Use this option to specify which files should be uploaded
use_gitignore = true
# If this option is enabled, it will load the .env file from given path (default is project root)
# This will *override* the environment variables you set in Application Dashboard
use_dotenv = false
# Paste your Luidium-CLI token here
cli_token = "YOUR_LUIDIUM_TOKEN"
마지막으로 시간적 여유가 있을 때에 데스크탑 애플리케이션과 랜딩페이지를 완성해볼 예정이다. 기존에는 데스크탑 앱 개발을 위해 Electron을 이용했으나, Rust 진영의 Tauri가 강력한 대체제로 떠오르고 있고, 로컬 머신의 웹뷰를 이용한 렌더링으로 훨씬 더 작은 번들 크기, 그리고 rust 런타임으로 인한 퍼포먼스 향상이 눈에 띄는 점이었다.
현재 CLI, Desktop application, Landing Page를 제외하고 Prototype 구현을 마쳤다. 다만 현재도 자잘한 에러가 발생하고 있어 실제 다수에게 배포되기에는 위험이 매우 큰 상황이다. 앞으로도 지속적인 테스트를 통해 잠재적인 에러를 잡아내고, 의도적으로 과도한 트래픽을 발생시켜 micro service들의 결합 안정성을 검증해나갈 예정이다.
Enjoy Reading This Article?
Here are some more articles you might like to read next: