모놀리스에서 해방

그리고 마이크로 서비스를 통해 진화 한 방법

(2018 년 7 월 19 일)

A Monolith 지배 코드 원숭이

Conio에서는이 모든 것이 일반적으로 “모놀리스”라고 불리는 것으로 시작되었습니다. 즉, 프런트 엔드 구성 요소, 백엔드 구성 요소, API 서비스, 백그라운드 작업 등 전체 애플리케이션의 모든 것을 포함하는 단일 코드베이스입니다. 지옥, 심지어 devops 스크립트. 그리고 처음에는 아주 잘 작동했습니다. 코드베이스의 별도 영역에서 작업하는 몇 명의 소프트웨어 엔지니어 만 (코드 변경 충돌 가능성이 거의 없음) 배포가 쉽습니다. 다른 많은 걱정없이 응용 프로그램 기능 작성에 전적으로 집중합니다. 배포에 어떻게 접근 했습니까? 소수의 베타 고객 만이 계속되는 진행 상황을 알고 있었기 때문에 잠시 동안 서비스를 종료하고 전체 코드베이스를 롤아웃하는 것은 실제 문제가 아니 었습니다 (전체 변경 사항이 얼마나 작든 크든, 데이터베이스 마이그레이션 포함 여부에 관계없이). 그런 다음 서비스를 다시 제공합니다.

제품이 처음부터 모양을 갖추는 것을보고 최종 고객으로부터 감사를받는 것은 확실히 만족 스러웠습니다. 그러나 우리는이 접근 방식이 현대의 Fintech 회사에 적합하지 않다는 것을 잘 알고있었습니다.

그럼 무엇입니까?

대부분의 소프트웨어 애플리케이션에서 고객은 매우 관대합니다. 예, Whatsapp이 작동을 멈추고 몇 시간 동안 중단이 지속될 수 있습니다. 확실히 성가신 일이지만 인식 된 문제는 아닙니다. Pokemon Go 또는 좋아하는 게임 앱도 마찬가지입니다. 그러나 돈이 관련된 경우는 아닙니다. : 은행 계좌에 로그인 할 수 없거나 로그인 할 수 없으면 기분이 바뀝니다. 무역 운영. 이는 암호 화폐 애플리케이션의 경우 더욱 악화됩니다. 대부분의 사람들은 과거의 악명 높은 실수를 기억하고 있으며, 짧은 시간 동안에도 암호 화폐 자금에 액세스 할 수 없을 때마다 추측이 발생합니다. 공정 해. 그것은 당신의 돈이며 당신이 그것을 사용하고 싶을 때 문제가 거의 또는 전혀 없을 것입니다.

위의 Monolith는 그러한 시나리오에 적합하지 않습니다. 프로덕션의 코드베이스를 변경하려면 전체 배포가 필요합니다. 관련 다운 타임이 있습니다. 매일 우리는 버그를 수정하고, 인터페이스를 더욱 친숙하게 만들고, 오래된 기능을 제거하고, 더 잘 사용되는 새로운 기능을 추가하여 서비스를 개선하기 위해 노력합니다. 고객이 즉각적인 혜택을받을 수 있도록 이러한 업데이트를 매일 릴리스하는 경우가 많으며 고객의 경험에 영향을 미치지 않도록 노력하고 있습니다. 즉, 우리가 배후에서 짜는 공식이 무엇이든 외부 세계에는 보이지 않아야합니다 (적어도 대부분의 경우). 그래서 우리는 Monolith에서 벗어나 일반적으로 “마이크로 서비스 아키텍처”라고 불리는 것을 선택했습니다.

마이크로 서비스를 통한 진화

단단하게 접착 된 대규모 단일 코드베이스는 이제 더 작은 부분으로 분해되며 각 부분은 특정 서비스를 나타냅니다. 실행될 때마다 서비스는 표준 HTTP 프로토콜을 통해 동 기적으로 그리고 대기열 (예 : RabbitMQ 및 Apache Kafka에서 처리)을 통해 비동기 적으로 서로 통신합니다.

마이크로 서비스 아키텍처의 상호 작용

모놀리스를 더 작은 구성 요소로 나누는 것은 매우 어렵지만 그만한 가치가 있습니다. 노력. 군사적으로는 줄리어스 카이사르가 갈리아의 넓은 영토를 꾸준히 지배하기 위해 한 것과 매우 유사합니다.“ 분할하고 정복 ”.

1) 제품은 지속적으로 배포 할 수 있습니다. 이제 코드 업데이트는 마이크로 서비스에만 적용됩니다. 대부분의 경우 프로덕션에 즉시 배포하고 고객에게 영향을주지 않고 릴리스 할 수 있습니다.

2) 코드를 관리하기가 더 쉽습니다. 회사 조직의 관점에서 2 명의 소프트웨어 엔지니어 팀이 10 명의 소프트웨어 엔지니어 팀이되면 상황이 바뀝니다. 각 팀원이 자신의 마이크로 서비스를 담당 할 때 더 효과적이며 코드 충돌이 적습니다.

3) 코드를 유지하기가 더 쉽습니다. 마이크로 서비스 아키텍처는 본질적으로 외부 세계 (프런트 엔드 앱 또는 다른 백엔드 서비스)와 통신하기위한 인터페이스의 정의를 필요로하며 다른 관점에서 완전히 격리됩니다. 이를 통해 애플리케이션의 단일 구성 요소를 나머지에 영향을주지 않고 검토, 재 설계 또는 처음부터 완전히 다시 작성할 수 있습니다 (편리한 경우 다른 언어로도).

4) 성능을 향상시킬 수 있습니다. 이제 각 마이크로 서비스는 가장 적절한 언어를 사용할 수 있습니다. 예를 들어 무거운 암호화 계산 구성 요소는 C에서 최적화되는 반면 Python의 API 서비스 및 Go의 장기 실행 작업입니다.

5) 향상된 코드 격리 및 보안. 각 마이크로 서비스는 고유 한 Docker 컨테이너에서 실행될 수 있으므로 권한 격리, 네트워크 및 데이터 분리를 제공하며 성장 단계에서 가장 중요한 것은 막대한 확장 가능성을 제공합니다.

그럼 마이크로 서비스가 답일까요?

물론 공짜 점심 같은 것은 없습니다. 마이크로 서비스 아키텍처에는 다음과 같은 어려운 과제도 있습니다.

1) 운영 복잡성. DevOps 엔지니어는 새로운 배포 프로세스의 복잡성을 완화하기 위해 반드시 필요합니다.

2) 하드웨어 팽창. 마이크로 서비스는 종종 Docker 컨테이너에서 실행됩니다. 마이크로 서비스 수가 급증하자마자 전과 동일한 하드웨어에서 전체 애플리케이션을 실행하는 것이 점점 더 어려워집니다.

3) 상호 통신 오버 헤드 : 각 요청은 하나 이상의 다른 것과 상호 작용해야 할 수 있습니다. 네트워크를 통한 마이크로 서비스. 이로 인해 지연 시간이 증가하고 일시적인 오류가 발생할 수 있습니다. 탄력적 인 서비스를 구현하고 전체 시스템의 확장 성을 개선하려면 상호 작용을 비동기 메시징으로 이동해야합니다 (예 : Apache Kafka 및 / 또는 RabbitMQ 사용)

4) 최종 일관성. 이것은 아마도 마이크로 서비스 아키텍처에서 가장 어려운 과제 일 것입니다. 단일 마이크로 서비스가 주어지면 경계 내에서 RDBMS 트랜잭션을 생성 할 수 있습니다. . 하지만 불행히도 분산 아키텍처의 일반적인 문제는 동일한 경계 내에 있지 않은 여러 트랜잭션을 처리하는 것입니다. 그 결과 시스템이 불법적이고 복구 불가능한 상태가 될 수 있습니다. 이러한 문제를 완화하기 위해 Conio는 다음과 같은 다양한 전략을 채택합니다.

  1. 도메인 기반 디자인의 관행에 따라 상위 도메인을 하위 도메인으로 분해하고 개별적으로 제한된 컨텍스트 ; 각 경계 컨텍스트는 트랜잭션 경계가 적용되는 마이크로 서비스로 구현됩니다. 이렇게하면 특정 하위 도메인에 대한 불일치 가능성이 해결됩니다.
  2. 조만간 불일치를 해결하는 멱등 비동기 상호 작용을 구현합니다.
  3. 가능하면 여러 하위 도메인이 포함될 수있는 작업은 피하십시오.

5) 복잡한보고. 각 하위 도메인은 특정 제한된 컨텍스트 내에 있기 때문에 여러 하위 도메인이 포함 된 복잡한 보고서는 여러 데이터 소스에서 데이터를 쿼리해야 할 수 있습니다. 이는 도메인의 표현 성과 시스템의 확장 성 모두에 부정적인 영향을 미칠 수 있습니다. Conio에서 백 오피스 활동 및 비즈니스 분석 보고서를 지원하기 위해 CQRS 아키텍처 를 채택했습니다.

6 ) 로깅 시스템. 분산 시스템의 각 요소는 전체 시스템의 로그 생성에 기여합니다. 그러나 각 상호 작용에 대한 통합 로그를 갖기 위해서는 이러한 모든 분리 된 로그간에 필요한 연결을 생성 할 수있는 도구를 구현해야합니다. Conio에서는 ELK (ElasticSearch, Logstash, Kibana) 스택을 사용하여 로그 데이터를 저장하고 쿼리합니다. 각 로그는 위에서 언급 한 통합 로그를 허용하는 필수 상관 관계 ID로 보강됩니다.

진화를 멈추지 마십시오.

우리의 견해는? 초기 단일 코드베이스를 분해하는 것은 지속적으로 개선되는 장기적인 작업 으로 간주되어야합니다. Conio에서는 1 개의 대규모 코드베이스에서 100 개 이상의 마이크로 서비스로 단계적으로 이동하는 데 몇 년이 걸렸습니다. . 우리는 결과에 자부심을 느끼는 지점에 도달했지만 동시에 계속 탐구하고 있습니다. 여러 가지 가능한 새로운 최적화가 있습니다. Docker Swarm에서 Kubernetes로 이동 하시겠습니까? 프런트 엔드 용 백엔드 서비스를 서버리스 람다 함수로 마이그레이션 하시겠습니까? 전체 연속 배포 작업 흐름으로 전환 하시겠습니까? 가능성은 무궁무진합니다.

여기에서 많은 주제와 기술을 다루었습니다. 다음 기사에서는 조사 결과와 진행 상황에 대한 자세한 내용을 공유 할 것입니다. 원하시면 언제든지 의견을 말하고 경험을 알려주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다