Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

[Book] 마이크로서비스 아키텍처 구축

마이크로서비스 아키텍처 구축
책 표지 마이크로서비스 아키텍처 구축 - ⭐⭐⭐
샘 뉴먼 지음
정성권 옮김
한빛미디어

조직은 시스템(반드시 정보 시스템이라기보다는 더 넓은 의미의 시스템)을 설계할 때 필연적으로 그 조직의 의사소통 구조와 일치하도록 만든다.
- 콘웨이의 법칙

컴파일러 제작에 4개의 그룹이 참여한다면 4단계 컴파일러를 얻게 될 것이다.
- 에릭 S. 레이먼드 "The New Hacker's Dictionary" 중에서

코로나19 사태로 온라인으로 인프라 스터디를 하면서 읽은 책이다. 원서는 Building Microservices: Designing Fine-Grained Systems인데 2015년 나온 책이다. 읽으면서는 약간 코드로 인프라 관리하기를 읽을 때와 비슷한 느낌을 받았다. 특정 기술을 다루지 않고 개념을 위주로 다루다 보니 깊게 들어가지 못하고 실용적이기보다는 원론적인 얘기를 많이 하고 있다.

자율적인 수명 주기를 가지면서도 함께 협업하는 수많은 작은 부품으로 구성된 응집력 있는 시스템이 되어야 한다.

도메인에서 경계가 있는 콘텍스트들을 발견했다면 공유되고 감춰진 모델을 이용하여 그것들을 여러분 코드 내에서 모듈로 모델링 하라. 이들 모듈의 경계는 마이크로서비스의 훌륭한 후보다.

오케스트레이션 방식은 오케스트라 지휘자처럼 프로세스를 안내하고 구동하는 하나의 중앙 두뇌에 의존한다. 코레오그래피 방식은 발레 무용수들이 자신의 역할을 알고 주변의 다른 무용수에 반응하는 것처럼 시스템 각 부분에 작업 내용을 알리고 세부 사항을 수행하게 된다.

특정 기술이나 프레임워크를 다루는 것보다 어렵다고 생각하긴 하는데 개발, 테스트, 모니터링 등 모노리식 시스템과 마이크로서비스 시스템이 완전히 다른 것도 아니고 뭔가 설명을 하려면 모노리식에 대한 이해도 필요하고 마이크로서비스에 대한 이해도 필요하기 때문에 모든 걸 다 설명할 수는 없고 설명하다 보면 이미 알고 있는 내용일 가능성도 있고 원론적인 얘기라 적게 다가올 수도 있다고 생각한다.

그런 면에서 혼자 읽었으면 가볍게 수긍하면서 넘어갔을 텐데 그룹 스터디로 한 덕에 각자 환경에서 마이크로서비스나 개발에 대한 고민이나 어려움을 들을 수 있었고 더 많이 생각해 보게 되었다.

마이크로서비스의 원칙
- 비즈니스 개념에 따른 모델
- 자동화 문화의 적용
- 내부 세부 구현의 은폐
- 모든 것을 분권화
- 독립적인 배포
- 장애 격리
- 매우 식별 가능

CI는 빠르고 신속한 변경을 위한 핵심적인 실천 사항이므로 CI 없이는 마이크로서비스를 향한 여정이 고통스러울 것이다.

CI에 관해 정말로 이해하고 있는지 테스트하기 위해 제즈 험블(Jez Humble)의 3가지 질문을 자주 사용한다.
1. 하루에 한번씩 메인 브랜치에 체크인하는가?
2. 변경을 확인할 테스트 집합이 있는가?
3. 빌드가 깨졌을 때 팀이 그것을 최우선으로 해결하는가?

때로는 자동화된 기능 테스트를 더 추가하는 것보다 릴리스를 보수하는 데 같은 노력을 쏟는 것이 훨씬 더 유익할 수 있다. 웹 운영 분야에서 평균 무고장 시간mean time between failure(MTBF) 과 평균 수리 시간mean time to repair(MTTR) 사이에 최적화에 대한 균형으로 언급된다.

책을 안 좋게 얘기한 것 같은데 꼭 그런 건 아니다. 서비스를 어떻게 나누고 보통을 모노리식 시스템을 먼저 겪기에 여기서 어떻게 개선해 나가면서 배포, 테스팅, 모니터링, 보안 등을 신경 써야 하는지가 잘 나와 있고 다양한 예시를 통해 가능한 방법을 보여주고 있어서 지금 마이크로서비스를 설계를 고민하고 있다면 접근 방법을 정리하는 데 도움이 될 것으로 보인다. 실제로 마이크로서비스는 모노리식보다 훨씬 더 많은 고민이 필요하고 안정화하는 데도 노력이 많이 필요하다고 생각한다.

더 느슨히 결합된 조직일수록 모듈화가 더 잘되어 있으며 결합도가 낮은 시스템을 만들어낸 반면, 더 강력히 결합된 조직의 소프트웨어는 모듈화가 덜 되어있다는 것을 발견했다.

변경을 조율하는 비용이 증가하면 '조율 및 의사소통 비용을 낮출 방법을 찾거나 아니면 아예 변경하지 않는' 두 가지 현상 중 하나가 발생한다. 후자가 바로 결국 거대하고 유지보수하기 어려운 코드베이스가 되는 방식이다.

마이크로서비스 중 하나가 다운되었을 때 전체 웹 페이지를 이용할 수 없게 된다면 우리는 틀림없이 오직 한 서비스만 사용하는 시스템보다 회복력이 떨어지는 시스템을 만든 것이다.

제프 딘은 WSDM 2009 컨퍼런스에서 발표한 "대규모 정보 수집 시스템 구축에 대한 도전"에서 10배 성장까지 고려해서 설계하고 100배 성장 전까지 재작성을 계획해야 한다고 강조했다.

나 같은 경우는 조직에 대한 얘기가 더 많이 와닿았다. 마이크로서비스를 만드는 큰 이유 중에 하나는 다른 조직 혹은 팀과의 커뮤니케이션을 줄이면서 협업을 하고자 하기 때문이라고 생각하기 때문에 이러한 부분을 설명한 10장 "콘웨이의 법칙과 시스템 설계"은 흥미로웠다. 어떻게 보면 조직과 시스템이 커지면서 계속 빠른 개발, 배포를 유지하면서 개선하려면 마이크로서비스를 설계하면서 현재 조직의 구성과 변화에 대해서도 같이 고민해야 하는 것 같다.

한번에 모든 것을 바꾸려는 빅뱅 접근법을 취할 필요는 없고, 이 과정을 천천히 조금씩 진행되는 것으로 인식해야 한다.

우선 모놀리식으로 시작하고 안정화되면 분해하라.

마지막으로 일단 모놀리식을 먼저 시작하고 점진적으로 개선하라는 부분은 원래도 동의하던 부분이라서 맘에 들었고 마이크로서비스 책임에도 저 부분을 강조하는 점이 좋았다.

2020/04/27 23:41 2020/04/27 23:41

기술 뉴스 #148 : 20-04-15

웹개발 관련

  • In-Browser Performance Linting With Feature Policies : Feature-Policy 헤더를 이용해서 웹사이트의 성능을 검사하는 방법을 소개하는 글이다. Feature-Policyoversized-images, unoptimized-lossy-images, unoptimized-lossless-images, unsized-media를 이용해서 의도하지 않은 이미지를 찾아내서 브라우저가 차단할 수 있도록 할 수 있다. 현재 모든 브라우저가 지원하는 것은 아니지만 프로덕션에 내보내진 않고 크롬 익스텐션으로 만들어서 개발하면서 정책을 위반하는 미디어가 있는지를 검사한다.(영어)
  • 새로운 마크다운 파서가 필요한 이유 : 인기를 많이 끌고 있는 Toast UI 에디터에서 마크다운 지원을 강화하기 위해서 새로운 마크다운 파서를 만들게 되는 과정을 적은 글이다. 마크다운을 실시간 미리 보기와 함께 사용하고 있지만 여러 마크다운 라이브러리가 용도에 따라 나뉘어 있기 때문에 구문 강조가 다르게 되는 경우가 있고 마크다운을 수정할 때마다 미리 보기를 새로 갱신하기 때문에 성능에 대한 문제가 있다. 이런 부분을 이미 해결하려고 했던 시도가 IDE에 있는데 크게 트리시터(tree-sitter)와 언어 서버 프로토콜(LSP)로 나눌 수 있고 이에 대한 장단점을 설명한 뒤 Toast UI의 목적에 맞게 commonmark.js를 수정해서 ToaskMark를 만들었다고 한다.(한국어)
  • Profiling React.js Performance : Reactdml Profiler API를 이용해서 컴포넌트의 성능을 측정하고 클릭 등 인터렉션의 성능을 측정할 수 있는 Interaction Tracing API를 사용하는 방법을 설명하고 Puppeteer로 이를 자동화하는 방법을 소개한다.(영어)
  • Understanding (all) JavaScript module formats and tools : JavaScript의 모듈화 방식을 정리한 글이다. 순수 JavaScript로 모듈화하는 방식부터 CommonJS, AMD, UMD의 형식 및 사용법을 설명하고 지금의 ES module과 TypeScript에서의 모듈, Webpack과 Babel의 방식을 요약해서 비교하고 있다.(영어)
  • ECMAScript 2020: the final feature set : ECMAScript 2020에 포함될 명세가 나왔고 TC39가 이를 승인했다.
  • (번역) 세상은 왜 CSS개발자를 필요로 하는가? : CSS의 발전 과정을 설명하고 Bootstrap부터 CSS-in-JS까지 발전해오면서 CSS를 제대로 안 배우고 사용하는 방향으로 가고 있다고 하고 특히 CSS-in-JS에서 CSS 클래스를 기계적인 문자로 바꾸는 것을 비난하고 있다. 이렇게 했을 때 CSS가 꼬이면 문제가 되고 CSS 개발자라고 부르는 전문 인력이 따로 필요하다고 주장한다. 이 사람의 주장만큼은 아니어도 CSS가 중요하다는 부분에는 동의하기에 CSS 개발자를 따로 분리하기보다는 CSS도 중요한 이유를 더 자세히 설명했으면 좋았을 것 같지만 한번 고민해 볼 만한 이슈라고 생각한다.(한국어)

그 밖의 개발 관련

  • From 48k lines of code to 10—the story of GitHub’s JavaScript SDK : Gregor Martynus가 Node.js 초기에 GitHub SDK를 만들고 이후 GitHub에 고용되어 8천 라인짜리 라우트 파일과 TypeScript/Flow 타입 정의로 된 파일을 플러그인 형태로 바꾸고 테스트를 추가해서 현재의 안정적인 공식 SDK가 되는 과정이 나와 있다.(영어)
  • Moving from reCAPTCHA to hCaptcha : CloudFlare에서 Google의 reCAPTCHA를 계속 사용하고 있었고 그동안 프라이버시 문제로 얘기는 있었지만, 우선순위로 인해 작업은 진행되지 않다가 이번에 Google이 reCAPTCHA에 과금을 하기로 하면서 여러 솔루션을 비교한 뒤에 hCaptcha로 갈아타기로 했다고 한다.(영어)
  • 서머타임과 배치작업 : 서머타임이 있는 지역에서 크론 등의 작업을 돌릴 때 작업이 안 돌거나 혹은 두 번 돌거나 다른 시간에 도는 상황을 파악하기 위해서 crontab과 Spring scheduled task를 만들어서 비교해 본 결과이다. crontab은 문서에 서머타임에 대한 고려가 어느 정도 되어 있는 것으로 나와 있고 실제로도 실험 결과에서도 기대에 가깝게 결과가 나왔다. 출장 갔다가 비슷한 고민 한 적이 있는데 서머타임이 없는 우리나라에서는 겪기 힘든 경험이고 1년에 1번밖에 실험을 못 한다는 점에서도 재밌는 글이다.(한국어)
  • Go의 철학 : The Zen of Go를 번역한 글이다. Go의 패키지는 하나의 목적만 달성하고 에러는 명시적으로 처리하며 동시성은 호출자에게 맡긴다는 등 Go의 철학을 정리했다.(한국어)
  • Deno 1.0 : TypeScript 런타임인 Deno의 1.0 버전 릴리스가 5월 13일로 잡혔다.(영어)

인프라 관련

볼만한 링크

  • DevOps 팀은 원격근무를 추구하면 안되는 것일까? : HBSmith가 창업했을 때부터 15명이 넘는 지금까지 원격으로 업무를 진행하면서 어떻게 DevOps 문화를 유지하고 있고 업무를 진행하는지를 정리한 슬라이드와 이를 정리한 글이다. 2주 단위 스프린트를 진행하면서 각 이슈의 스토리 포인트를 부여해서 진행하고 매일 Did list를 작성해서 서로 간의 업무를 공유하고 있다. 스토리 포인트 부분에서 "점점 더 많은 이슈를 처리할 수 있게 되는 게 아니라, 동료와 자기 자신 모두가 납득할수 있는 기준을 스스로 세우고 지킬수 있게 되는 것이다" 부분이 인상적이었다.(영어)
  • 실리콘밸리 스타트업에서 성장하기 : 샌프란시스코에서 심플해빗이라는 스타트업에 Growth Lead로 합류해서 2년간 배운 것들을 정리한 글이다. 심플해빗을 성장시키기 위해서 어느 부분 최적화했는지에 관한 고민의 과정이 나와 있고 그에 따라 500%의 매출 성장을 이루면서 스스로 "문제를 정의하고, 해결하는 사람"으로 정의하고 원칙을 세워서 진행했다고 하는데 얼마나 많이 고민하면서 문제를 해결했는지를 알 수 있다.(한국어)

IT 업계 뉴스

  • GitHub is now free for teams : GitHub이 작년에도 많은 기능을 무료로 풀었지만, 아직 조직을 만들어서 비공개로 개발하려면 유료 결제를 해야 했는데 이번에 이 기능까지도 무료로 풀었다. 조직에서도 비공개 저장소와 협업자를 추가할 수 있고 코드 소유자 등의 유료 기능은 $9에서 $4로 인하되었다.(영어)
  • COVID-19 Kills Renowned Princeton Mathematician, 'Game Of Life' Inventor John Conway In 3 Days : 라이프게임을 만드신 John Conway 박사님이 지난 11일 코로나로 별세하셨다. 삼가 고인의 명복을 빕니다.(한국어)
  • Leaving pytest for now : pytest 한 메인테이너의 toxic behavior 때문에 pytest 메인테이너에서 물러난다고 밝혔다. 현재까지 3명의 메인테이너가 떠난 것으로 알려졌다.(영어)

프로젝트

  • Lens : Kubernetes IDE.
  • diff-so-fancy : diff CLI 프로그램.
  • markmap-lib : Markdown으로 마인드맵을 그리는 라이브러리.
  • HTML5 Accessibility : 각 브라우저가 기능별 접근성을 얼마나 지원하고 있는지를 보여주는 사이트.

버전 업데이트

2020/04/16 04:31 2020/04/16 04:31