Python

카우치베이스로 파이썬 마이크로서비스 구축 - 1부

마이크로서비스에는 확장 가능하고 지속 가능한 구성 요소 집합이 필요합니다. 이 글에서는 Python과 Couchbase를 사용하여 마이크로서비스를 구축하여 완전히 확장 가능한 솔루션을 제공하는 방법을 소개합니다.

모놀리식 애플리케이션은 많은 과제를 안고 있습니다. 모놀리식 애플리케이션은 모든 것이 하나의 시스템, 보통 메인프레임이나 미니컴퓨터에서 실행되던 시대에 탄생했습니다. 서비스 지향 아키텍처 애플리케이션을 출시하여 스케일아웃 공유 무공유 서버 모음을 사용할 수 있게 되었습니다. 이를 통해 애플리케이션 환경의 일부를 필요에 따라 개별적으로 확장할 수 있었습니다. 오늘날에도 서버가 가상 머신이나 클라우드 인스턴스로 대체되었다는 점을 제외하면 비슷한 패턴을 유지하고 있습니다. 

일부 서비스 지향 아키텍처는 상호 운용이 필요한 소규모에서 대규모 애플리케이션의 모음입니다. 이 경우 어느 정도 분리 및 수평적 확장이 가능하지만 각 서비스가 모놀리식 애플리케이션인 경우가 많기 때문에 글로벌 클라우드 확장성을 달성하는 데 따르는 모든 문제를 해결하지는 못합니다. 대규모 애플리케이션은 확장하기 어려울 뿐만 아니라 개발하기도 어렵습니다. 많은 코딩과 유지 관리가 필요합니다. 간단한 코드 업데이트에도 완전한 회귀 테스트가 필요할 수 있으며, 이는 상당한 노력이 필요합니다. 

입력란에 마이크로서비스 아키텍처. 이 아키텍처 패턴은 각 애플리케이션 구성 요소를 독립적으로 확장할 수 있는 작은 조각으로 나눕니다. 일반적으로 상태 비저장형이기 때문에 필요에 따라 가동 및 종료할 수 있습니다. 가장 큰 문제는 네트워크 지연 시간이지만 오늘날에는 고속 네트워크가 보편화되어 있기 때문에 일반적으로 문제가 되지 않습니다.

마이크로서비스 디자인

좋은 마이크로서비스는 가볍고 상태 저장소가 없어야 합니다. 마이크로서비스의 목표는 마이크로서비스 아키텍처 애플리케이션 기능을 독립적으로 작동하는 개별 구성 요소로 분리하는 것입니다. 각 마이크로서비스는 전체 애플리케이션의 한 가지 기능 영역에 서비스를 제공해야 합니다. 가장 중요한 것은 각 마이크로서비스가 나머지 애플리케이션 환경과 독립적으로 발전할 수 있어야 한다는 것입니다. 이는 애자일 개발 방법론를 통해 팀은 전체 애플리케이션에 영향을 주지 않으면서 새로운 기능을 신속하게 제공할 수 있습니다.

마이크로서비스는 실패를 염두에 두고 설계해야 한다는 말이 있습니다. 처음에는 이상하게 들릴 수 있지만 마이크로서비스의 특성과 수명 주기를 고려하면 완벽하게 이해가 됩니다. 좋은 마이크로서비스는 임시적이어야 합니다. 마이크로서비스는 상태가 저장되지 않으므로 애플리케이션에 영향을 주지 않고 마이크로서비스 인스턴스를 추가하고 제거할 수 있어야 합니다.

마이크로서비스는 끊임없이 변화할 것이므로 마이크로서비스와의 모든 상호작용은 이 환경에서 잘 작동하는 API 스타일을 통해 이루어져야 합니다. 따라서 RESTful 인터페이스 는 API 설계에 좋은 선택입니다. REST 호출은 일시적이며 네트워크 로드 밸런서(REST 기반 마이크로서비스를 고가용성 및 확장성으로 만드는 방법 중 하나) 뒤에서 잘 작동합니다.

마지막으로, 널리 사용되는 DevOps 도구로 쉽게 배포하고 자동화할 수 있어야 합니다. 각 서비스는 다른 서비스와 함께 시스템에서 실행하거나 컨테이너에서 실행할 수 있어야 합니다. 컨테이너 오케스트레이션 기술인 Kubernetes는 기본적으로 마이크로서비스를 위해 만들어졌습니다.

사용자 프로필 마이크로서비스 구축

전체 애플리케이션을 마이크로서비스로 만드는 것은 어렵습니다. 핵심 비즈니스 로직은 마이크로서비스로 재작성할 수 없는 일부 애플리케이션에서 제공해야 하는 경우가 많습니다. 예를 들어, 상용 ERP 또는 CRM 애플리케이션 스택과 상호 작용해야 할 수 있습니다. 하지만 웹 및 모바일 애플리케이션의 경우, 이러한 대규모 시스템을 마이크로서비스로 프론트엔드하여 최종 사용자 환경을 제어하는 것이 일반적인 패턴입니다.

기술 소비자는 웹 또는 모바일 애플리케이션과 상호 작용할 때 빠르고 개인화된 경험을 원합니다. 마이크로서비스를 사용하면 프레젠테이션 레이어에서 가장 자주 사용되는 요소를 최종 사용자와 지리적으로 가까운 곳에 전 세계적으로 배포할 수 있습니다. 또한 사용 패턴에 따라 이러한 구성 요소를 독립적으로 확장할 수 있습니다.

웹 또는 모바일 애플리케이션에서 자주 사용되는 구성 요소 중 하나는 사용자 프로필이라는 개념입니다. 이는 일반적으로 사용자 인터페이스의 오른쪽 상단에 있는 '사람의 실루엣' 아이콘입니다. 사용자 프로필은 기본적인 인구 통계 정보로 단순하게 구성될 수도 있고, 선호도 및 기록에 대한 풍부한 정보로 매우 상세하게 구성되어 사용자 경험에 개인화된 변화를 유도할 수도 있습니다.

이 블로그 게시물 시리즈에서는 Python을 사용하여 Couchbase 데이터베이스에서 호스팅되는 사용자 프로필 데이터에 RESTful 인터페이스를 제공하는 방법에 대해 설명합니다. 설명하기 위해 기본 스키마가 포함된 간단한 예제를 사용하겠습니다. 그러나 이 예제는 '실제' 애플리케이션에 맞게 얼마든지 개선할 수 있습니다.

마이크로서비스에 Couchbase를 사용하는 이유는 무엇인가요?

Couchbase는 여러 데이터 처리 요소를 통합 데이터 플랫폼으로 결합합니다. Couchbase에는 키-값 엔진, 관계형 스키마 지원, 전체 SQL 쿼리 엔진, 전체 텍스트 검색 엔진, 이벤트 엔진 및 분석 엔진이 포함되어 있습니다. 마이크로초 단위의 응답 시간을 제공하며 조직이 워크로드에 따라 서로 다른 시스템을 선택할 필요가 없습니다.

사용자 프로필 서비스는 일반적으로 자주 액세스하는 서비스입니다. 최소한 권한 부여 및 인증과 함께 사용자가 애플리케이션에 로그인할 때마다 액세스됩니다. 하지만 사용자가 애플리케이션과 상호 작용하는 동안 여러 번 액세스해야 하는 경우가 더 많습니다. 따라서 성능과 지연 시간은 설계의 필수적인 특성이 될 것입니다. 

카우치베이스는 메모리 우선 아키텍처를 통해 놀라울 정도로 빠른 성능을 제공합니다. Couchbase의 성능은 클러스터가 확장되어도 처리량과 지연 시간을 유지할 수 있는 스케일아웃, 공유 없음 아키텍처를 통해 거의 선형에 가깝습니다. 마이크로서비스 아키텍처도 스케일아웃, 공유 없음이기 때문에 Couchbase는 마이크로서비스 요소와 함께 확장할 수 있습니다.

Couchbase는 기존의 많은 관리 작업을 제거하도록 설계되었습니다. Couchbase는 데이터의 자동 샤딩 및 리밸런싱, 인덱스 관리와 데이터 관리의 분리로 동적 데이터 격리 모델을 활용합니다. 그리고 카펠라 카우치베이스 클라우드 서비스또는 온프레미스에서 Terraform 또는 Kubernetes와 같은 도구 및 카우치베이스 자율 운영자를 통해 데이터베이스 변경 및 마이크로서비스 변경을 프라이빗 및 퍼블릭 클라우드 전반에서 자동화하고 오케스트레이션할 수 있습니다.

왜 파이썬인가?

이 글을 읽으면서 가장 궁금한 점이 바로 이것일 것입니다. 가장 먼저 떠오르는 언어가 Node.js와 같은 것일 수 있습니다. 실제로 버클리 자바스크립트는 가장 수요가 많은 언어이지만, 파이썬은 두 번째로 수요가 많은 언어입니다. Python은 Linux 및 macOS용 소프트웨어 배포에 포함되어 있어 접근성이 매우 뛰어나며 Windows에도 쉽게 설치할 수 있습니다. 여러 버전의 언어를 설치할 수 있으며 가상 환경 기능을 사용하면 다양한 버전의 언어를 사용하여 여러 사용자 지정 환경을 쉽게 만들 수 있습니다. Python은 멀티스레딩을 지원하지만 스레드 성능이 Java와 같은 언어만큼 뛰어나지는 않습니다. 하지만 Python은 가볍기 때문에 멀티프로세싱과 함께 잘 확장되며 스레드나 프로세스를 쉽게 디스패치할 수 있는 패키지가 있습니다. 파이썬의 가장 큰 장점은 배우기 쉽고 코딩하기 쉽다는 점입니다.

샘플 애플리케이션 워크스루

개념을 설명하기 위해 샘플 Python 마이크로서비스(코드는 깃허브에 있습니다.) 사용자 프로필 정보에 액세스할 수 있는 매우 간단한 RESTful 인터페이스를 제공합니다. Couchbase는 JSON, UTF-8(문자열) 또는 바이너리(원시) 문서 형식을 지원합니다. JSON 형식은 기본 형식으로 간주되며 플랫폼에서 많은 풍부한 기능을 사용할 수 있으므로 이 문서 형식을 사용합니다.

매우 간단한 사용자 프로필에는 사용자의 이름과 계정에 관한 기타 기본 정보가 포함되어 있습니다. 프로필에는 Base64로 인코딩된 이미지 파일이 포함된 별도의 레코드를 참조하는 사진이 포함되어 있습니다. RAW 문서 유형을 사용할 수도 있었지만 이 예제에서는 이미지를 JSON 값으로 넣었습니다. 

또한 Couchbase Server 7에 도입된 범위 및 컬렉션 기능도 활용합니다. 사용자 프로필 문서는 user_data 컬렉션에 저장되며 이미지는 사용자_이미지 컬렉션에 대해 설명합니다:

User profile sample data model

사용자 프로필 문서 형식:

사용자 사진 문서 형식:

Python 마이크로서비스는 화면(터미널)에 출력이 울리는 포그라운드에서 실행하거나 로그 파일로 출력이 전송되는 '데몬'으로 백그라운드에서 실행하는 옵션이 있습니다. 이 코드는 대부분의 작업을 수행하기 위해 Python 객체 지향 클래스 기능을 사용합니다.

그리고 dbConnection 클래스는 카우치베이스 데이터베이스 연결과 관련된 객체에 대한 포인터를 보유하도록 설계되었습니다. 이를 통해 다른 클래스와 함수에 쉽게 전달할 수 있습니다.

그리고 카우치베이스 드라이버 클래스는 데이터베이스와의 상호 작용을 처리합니다. 데이터베이스의 연결 함수는 Couchbase 클러스터에 대한 연결을 시작합니다. 함수에 전달된 버킷, 범위 및 컬렉션에 액세스하기 위한 객체를 생성합니다. 그리고 이러한 객체를 dbConnection 클래스에 저장된 객체입니다. 클래스의 get 함수는 설정된 연결을 활용하여 참조된 컬렉션에서 함수에 전달된 키의 키-값 검색을 수행합니다. 이 함수의 쿼리 함수는 SQL 선택 를 참조한 컬렉션의 JSON 필드에서 지정한 값과 동일한 JSON 키를 검색합니다.

그리고 restServer 클래스는 Python http.server 모듈을 사용합니다. RESTful 인터페이스를 구현합니다. 여기에는 GET 엔드포인트를 사용하여 닉네임, 사용자 아이디 또는 사용자 이름에 따라 사용자 프로필 데이터를 찾을 수 있습니다. 또한 JSON 문서를 검색하거나 이미지 자체를 반환하여 프로필 사진을 가져오는 엔드포인트도 있습니다. 이는 종종 JSON 콘텐츠로 REST 엔드포인트에 응답하는 것만 지원하는 다른 REST 개발 프레임워크에 비해 이점이 있습니다.

마지막으로 마이크로서비스 클래스는 HTTP 서버를 시작하고 중지합니다. 이 클래스는 다음에서 호출됩니다. 메인 를 사용하는 카우치베이스 드라이버 를 사용하여 데이터베이스에 연결하고 마이크로서비스를 시작합니다. 전체 마이크로서비스는 몇 백 줄의 코드에 불과하며, 어디에나 쉽게 배포할 수 있고 모든 Couchbase 클러스터에 연결할 수 있습니다.

다음 단계

이 시리즈의 다음 파트에서는 마이크로서비스 스키마 및 성능 테스트를 위한 무작위 테스트 데이터 생성에 대해 설명합니다.

이러한 주제에 대해 자세히 알아볼 때 이러한 리소스를 참조하세요:

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 마이클 미니치노

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.