구축하는 경우 마이크로 서비스,당신은 필요가 무엇인지 이해하기 위해 제한된 컨텍스트가

Mar16, 2020·19 분 읽

사진에 의해 국립암연구소에무 것도 주 다운로드 파

의 성장 microservice 채용가 발생에서 부활의 인기부전-간과 소프트웨어 디자인 패턴이 있습니다. 이러한 패턴의 대부분은 에릭 에반스’도메인 중심의 디자인,이 소프트웨어 아키텍처에 관한 것만큼이나 팀 구조에 대한 많은의 책에서 채굴되었다.이러한 패턴 중 경계 컨텍스트는 아마도 이해하는 것이 가장 중요합니다. 엔지니어로서 우리는 제한된 컨텍스트를 소프트웨어 아키텍처 디자인 패턴으로 간주하게되었습니다. 그러나 그것은 우리가 원래 사용법에서 조금 공동 선택했기 때문입니다. 에반스에 의해 사용 된 바와 같이,제한된 컨텍스트는 기술적 인 것만큼이나 조직적인 패턴입니다.그래서 나는 제한된 컨텍스트 패턴을 마이크로 서비스를 이해하는 데있어 린치 핀으로 보게되었습니다. 뿐만 아니라 그들을 구축하는 방법,하지만 정말 왜 우리는 처음에 그들을 구축,그들은 우리의 조직을 더 성공적으로 만들 수있는 방법. 경계 컨텍스트가 무엇인지 이해한다면-기술적으로나 조직적으로 경계 컨텍스트 사고 방식을 채택한다면 마이크로 서비스 아키텍처를 구축하는 데 진정으로 성공할 수 있습니다.왜 마이크로 서비스로 이동합니까?시작하려면 약간의 운동을 해 봅시다. 이 질문을 물으십시요: 왜 우리는 처음에 마이크로 서비스를 구축 할 수 있습니까?그것에 대해 생각하기 위해 잠시 시간을내어. 먼저 마음에 오는 혜택은 무엇입니까? 우리가 해결하기를 희망해야 할 주요 문제는 무엇입니까? 그냥 정직 자신을 유지하기 위해,몇 가지 답변을 적어.당신은 당신의 대답이 있습니까? 좋아 너자신등을맞댄 그것을 읽으십시요. 당신은 표준 기술 혜택을 명중 했습니까? 지속적인 전달,확장 성,수개 국어 환경,컨테이너 및 클라우드,그리고 그 모든 좋은 것들? 좋아요그러나 귀하의 최고 답변에는 조직을보다 효율적으로 운영 할 수 있도록하는 것이 포함되어 있습니까? 그것은해야. 마이크로 서비스를 구축하는 것은 기술적 이점을 실현하는 것이 아니기 때문입니다. 실제로 조직의 이익을 얻는 것입니다. 다른 모든 것은 구현 세부 사항입니다.우리의 모노리스가 점점 더 커짐에 따라 생산성은 약해지기 시작합니다. 적어도 두 가지 주요 이유가 있습니다.첫째,모든 엔지니어링 팀은 하나의 거대한 코드베이스에 기여하고 있습니다. 따라서 팀은 자신의 코드가 다른 사람의 코드와 충돌 할 가능성이 점점 커지고 있습니다. 이로 인해 발생할 수있는 잠재적 인 문제를 완화하기 위해 코드 정지,품질 보증 테스트 기간,릴리스 열차 등의 절차를 수립합니다. -그것은 문자 그대로 우리의 생산성을 늦추기 위해 고안되었습니다.물론 이러한 절차는 기능 및 개선 사항이 적시에 배포되는 것을 방지합니다. 그들은 또한 엔지니어가 팀의 우선 순위에 집중할 수있는 능력에 혼란을 야기합니다. 테스트 기간 동안 버그가 발견되면 담당 팀은 컨텍스트를 전환하고 해당 버그를 해결하는 데 집중해야합니다. 프로덕션에서 심각한 버그가 발견되면 팀은 버그를 수정할뿐만 아니라 다음 릴리스 기차에서 배포하기 위해 농구를 뛰어 넘어야합니다.통화 중 근무가 엉망이됩니다. 우리의 모노리스에 뭔가 잘못되면 문제를 해결하기 위해 누군가 밤낮으로 사용할 수 있어야합니다. 하지만 누구? 큰 모노리스를 가진 대규모 조직은 일반적으로 두 가지 선택에 직면:그 유일한,슬픈,죄송 작업 조직 내에서 사고 관리 팀은 다른 엔지니어의 코드로 인한 문제에 대응하고,이를 해결하는 방법을 파악하는 것입니다.매주 어떤 임의의 엔지니어가 가장 가능성이 다른 엔지니어링 팀에,다른 엔지니어에 의해 작성된 코드에 의해 발생하는 문제를 해결하기위한 책임이되는 슬픈,죄송 작업을 할당함으로써 회전 통화 일정.우리 팀을 조직하는 것은 또 다른 방법으로 우리 조직과 모노리스를 혼란스럽게합니다. 우리의 전체 조직은 동일한,큰 제품에 일하고 있다. 그러나 우리는 여전히 조직을 관리 가능한 팀으로 나눌 필요가 있습니다. 그래서 우리는 팀 경계를 찾기 위해 기능적 역할을 찾는 경향이 있습니다:

불행하게도,이런 종류의 조직 구조 제한 협업 작품이다. 실제 문제를 해결하기 위해 함께 작업하는 대신(예:기능을 어떻게 설계,구축 및 유지 관리합니까?)다른 기능 영역의 구성원은 단순히 자신의 부분에 초점을 맞추고,완료되면 은유 적으로 울타리 위에 작업을 던집니다. 협업과 시너지를 위한 잠재력—팀의 노력의 결합된 질이 개별 팀원들의 합보다 훨씬 더 큰 경우-는 상실된다.또한 병목 현상이 발생합니다. 우리는 기능 영역에 의해 우리의 팀을 구성 할 때,우리는 자연스럽게 우선 순위의 정렬 불량이있을 것이다. 의 제품 관리 팀은 우리의 모노리스의 체크 아웃 프로세스가 개편 될 필요가 있다고 가정 해 봅시다. 그들은 함께 몇 가지 모의를 넣어 디자인 팀과 함께 시간을 예약 할 수 있습니다. 어떤 시점에서,모의 완료 및 구현하기 위해 프론트 엔드 팀에 넘겨 될 것입니다. 물론 프론트 엔드 팀은 백엔드 팀에 의해 구현 될 필요가 있으므로 완료 될 때까지 차단됩니다. 백엔드 팀이 새로운 체크 아웃 서비스에 대한 작업의 우선 순위를 정하면 데이터베이스 관리 팀의 도움이 필요하다는 것을 알게됩니다. 물론 자체 우선 순위가 있습니다. 따라서 백엔드 팀은 데시벨이 해제될 때까지 차단됩니다.2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 12 월 1 일,2018 년 방법,이 조직 구조는 잘못 설계된 지나치게 결합 된 소프트웨어 아키텍처처럼 보입니다…반면 마이크로서비스 아키텍처는 팀의 자율성을 가능하게 합니다. 독립적이고 효율적으로 함께 작업하며 다른 팀에 대한 종속성에 의해 지속적으로 차단되지 않는 팀을 구성하는 것이 훨씬 쉬워집니다.팀은 설계에서 개발,배포에 이르기까지 작업에 대한 완전한 소유권을 가질 수 있습니다. 각 구성원은 팀의 목표 달성에 대한 책임을 공유하므로”자신의 부분”이상에 참여하도록 인센티브가됩니다. 저는 제품 관리자,디자이너,프런트 엔드,백엔드 및 모바일 엔지니어가 제품 기능을 설계하기 위해 함께 모여 한 사람이 달성 할 수있는 것보다 훨씬 더 나은 결과를 산출 한 팀과 협력했습니다.팀은 프로덕션에 배포되면 자체 아티팩트에 대한 책임을 집니다. 이는 일반적으로 문제를 해결하기 쉬운 더 높은 품질의 코드로 이어집니다. 왜 그럴까요? 모노리스와 달리 팀은 자신이 소유한 마이크로 서비스에 대한 전체적인 관점을 갖는 경향이 있습니다. 따라서 팀이 문제를 예상하고,문제가 발생할 때 문제를 해결하기 위해 좋은 로깅 및 메트릭을 추가하고,문제를 피하는 데 도움이되는 탄력성 패턴(예:재시도,회로 차단기 및 폴백 등)을 적절하게 사용하는 것이 훨씬 쉽습니다.또한 팀은 작업에 대한 완전한 소유권을 가지고 있기 때문에 서비스를 건강하게 유지하고 생산에서 운영하는 것은 악몽 같은 출시 일정에 관한 것이 아니며 창조물을 육성하는 것에 관한 것입니다.마지막으로,팀은 같은 타임 라인에서 같은 목표를 향해 노력하고 있습니다. 즉,다른 기능 영역에있는 사람이 확보 할 때까지 기다릴 때 더 이상 한 사람을 차단하지 않습니다.그러나 우리는 단순히 우리의 모노리스를 마이크로 서비스로 분해함으로써 이러한 혜택을 무료로 얻지 못합니다. 마이크로서비스 아키텍처의 첫 번째,순진한 뷰를 살펴보겠습니다.////////////////////////////////////이 시점에서,우리는 우리가 구축하고자하는 마이크로 서비스 및 응용 프로그램의 다른 유형을 정의했습니다. 좋아요 그러나 우리는 여전히 팀 자율성 측면에서 많은 진전을 이루지 못했습니다. 모든 마이크로 서비스는 일부 팀이 소유해야합니다. 그래서 질문이 생깁니다:어떤 팀이 어떤 마이크로 서비스를 소유 할 것입니까?

기 팀

우리의 첫째,순진한 방법을 구성하는 우리의 팀을 모방하여 우리의 모노리스 조직 구조

여기에서,우리 팀에서(자주색) 주최기능:UX 디자인,프론트 엔드 엔지니어링,백 엔드 엔지니어링,데이터 엔지니어들은 Dba 는,QA,etc.이것은 적어도 처음에는 옳다고 느낄 수 있습니다. 하지만 한 걸음 뒤로 물러서서 우리가 고객에게 제공하려는 가치를 살펴 보겠습니다. 고객을 위해 다음과 같은 것을 만드는 것이 우리의 목표입니까?데이터베이스 스키마의 무리 사용자 인터페이스 모형의 무리 마이크로 서비스의 무리?실제로. 이들은 우리가 우리의 고객을 위한 가치를 창조하기 위하여 이용하는 다만 공구이다. 우리가 고객/사용자에게 제공하는 실제 가치는 다음과 같은 특징과 기능의 형태로 제공됩니다:쇼핑 카트에 항목을 배치하고 이후에 그들을 구입하는 메커니즘 마찬가지로,우리는 기능 영역에 의해 우리의 팀을 구성하고 싶지 않아요. 오히려,우리는 고객을 위해 창조하는 가치에 의하여 우리의 팀을 정의해야 한다;다시 말하면,기능저 쪽에에,(적절하 지명된)교차 기능 팀안에.크로스 기능 팀과 함께,모두가 처음부터 끝까지,특정 제품이나 기능을 구축하기 위해 함께 노력하고 있습니다. 팀의 모든 사람이 동일한 목표와 우선 순위를 가지므로 다른 사람이 기능 영역을 차단하지 않습니다. 새 백엔드 서비스에 일부 데이터베이스 디자인 작업이 필요합니까? 팀의 백엔드 엔지니어와 데시벨 모두 함께 작업의 우선 순위를 지정할 수 있습니다.최선을 다해 교차 기능 팀은 회원들이 프로젝트의 각 단계에서 공동 작업을 수행하도록 권장합니다. 각 팀 구성원은 기능의 전반적인 디자인에 기여합니다. 프론트엔드,백엔드 및 모바일 엔지니어가 공동으로 계약을 정의합니다. 모두가 테스트합니다. 그리고 모두가 자신의 특정 도메인에 정통한되기 시작합니다.따라서,우리 팀 구조는 다음과 같은 것을 찾기 시작할 수 있습니다.에반스는 자신의 책에서 자주 경계 컨텍스트를 논의하는 동안,그는 정말 명시 적으로 패턴을 정의하지 않습니다. 그래서 나는 여기에서 그것을 시도 할 것이다.:내부적으로 일관된 시스템은 신중하게 설계된 경계로 시스템에 들어갈 수있는 것과 시스템을 종료 할 수있는 것을 중재합니다.즉,경계 컨텍스트는 컨텍스트(본질적으로 협력 구성 요소를 캡슐화하는 시스템)를 나타내며 시스템에 들어갈 수있는 것과 종료 할 수있는 것을 제어하는 명확하게 정의 된 경계를 나타냅니다.1.”회사”는”회원”이”서비스”에 접속하여 이 약관에 따라”회사”가 제공하는 서비스를 받는 회원 및 비회원을 말합니다.살아있는 존재)는 좋은 비유를 제공합니다. 세포 내에는 모든 종류의 구성 요소(핵,리보솜,세포질,세포 골격 등)가 모두 세포 자체 내에 캡슐화되어 있습니다. 그러나 각 세포를 둘러싼 것은 세포 내부와 나머지 유기체 사이의 장벽 역할을하는 막입니다. 막은 그 환경으로부터 세포를 보호하고,특정 영양소가 그것에 들어갈 수있게하며,다양한 부산물이 떠날 수있게합니다.같은 맥락에서 제한된 컨텍스트는 다양한 구성 요소(마이크로 서비스,웹 응용 프로그램,모바일 앱,데이터베이스,메시지 큐 등)로 구성됩니다. 또한 이러한 구성 요소를 캡슐화하는 논리적 장벽 역할을합니다. 내부적으로 구성 요소를 결합 할 수 있으며 데이터를 서로 자유롭게 전달할 수 있습니다. 그러나 제한된 컨텍스트는 느슨한 커플 링을 외부 적으로 적용하여 명시적인 점을 정의하는 데 도움이됩니다:외부 데이터(아마도 소비자가 카프카 주제에 가입을 통해)입력 할 수 있습니다 내부 데이터(어쩌면 다른 카프카 주제를 통해,또는 잘 디자인을 통해 종료 할 수 있습니다 팀은 다양한 팀 구성원(디자이너,프론트 엔드/백엔드/모바일 엔지니어,제품 관리자,데이터 엔지니어 및 품질 보증 엔지니어 등)으로 구성됩니다. 내부적으로,이 회원들은 동일한 일관된 목표를 향해 협력 적으로 일합니다. 또한 이러한 팀 구성원은 다른 팀에 최소한의 종속성을 갖도록 캡슐화됩니다(또는 캡슐화되어야합니다).따라서 조직 수준에서 시작하여 우리가 구축 할 것으로 예상되는 모든 응용 프로그램과 마이크로 서비스를 정의하는 대신 하위 도메인 주위에 팀을 구성하여 해당 팀이 하위 도메인을 성장시키고 구축해야 할 사항을 정의 할 수 있습니다. 제대로 수행,우리는 유기적으로 성장으로 조직의 다양한 경계 컨텍스트를 참조하는 경향이,오히려 엄격한,미리 정의 된 구조보다.콘웨이의 법칙은 조직이 조직의 의사 소통 구조를 모방 한 소프트웨어 시스템을 설계한다는 것을 말해줍니다. 이는 종종 사실임이 입증되므로 마이크로 서비스 구축을 시작할 때 조직을 구성하는 방법에 대해 신중해야합니다.실제로,지금쯤은,그림은 너의 마음안에 떠오르고다. 모노리스에서 마이크로 서비스로 이동함에 따라 수평(모노리스를 기능 레이어로 나누기)대신 수직으로(모노리스를 하위 도메인으로 나누기)생각하기 시작해야합니다.

우리는 나누어지 않는 것처럼 우리가 왼쪽에서, 하지만 우리가 오른쪽에는

에서 다른 말로 하면,우리는 없을 시작으로 교체하 모노리스의 데이터 액세스를 레이어와 데이터 마이크로 서비스. 오히려 전체 기능(예:체크 아웃 프로세스 또는 제품 검색)을 분할하여 시작해야합니다. 각 기능은 제한된 컨텍스트를 나타냅니다. 그리고 각각은 전담 교차 기능 팀에 의해 분리 될 것입니다.또한,그 팀은 중 하나입니다 손에 자신의 작업에 초점을 맞추어야한다:프로세스의 일환으로 팀은 노력에 가장 적합한 시스템을 설계해야합니다.예를 들어,우리는 우리의 모노리스에서 우리의 제품 검색 기능을 벗겨 결정할 수 있습니다. 제품 검색 팀은 궁극적으로 다음을 포함하는 시스템을 설계할 수 있습니다:외부 카프카 주제의 숫자를 듣고 카프카 소비자는 기록의 자신의 내부 시스템을 업데이트(소르)제품에 대한.

  • 카프카의 게시자는 변경 SoR 에 내장 카프카의 항목
  • 또 다른 카프카의 소비자는 수신하는 내 항목 및 업데이트 탄성 검색 index
  • GraphQL 끝점에 대한 자유로 검색하는 쿼리를 탄력 있는 검색
  • 나머지 부분 끝점 검색하는 개별 제품 ID
  • 새롭게 디자인 된 웹 응용 프로그램을 사용하는 사람들의 끝점을 허용하는 고객은 제품에 대한 검색 및 탐색 제품 상세 정보
  • 유사한 화면 집에서 우리의 모바일 애플 리케이션을 사용하는 사람들의 끝점
  • 카프카의 게시자는 푸시 메시지, 고객이 수행한 고유한 쿼리를 외부 카프카 토픽에 나타내어 관심이 있을 수 있는 다른 제한된 컨텍스트(예:분석)에서 사용할 수 있습니다.우리는 우리의 모노리스의 더 많은 수직 부분을 벗겨 시작으로,다른 팀은 자신의 경계 컨텍스트를 구축 할 수 있습니다. 이러한 경계 컨텍스트는 서로 상당히 다르게 보일 수 있습니다.각 팀은 가장 손에 그 작업을 해결 빌드하는 방법을 결정합니다.
  • 답글 남기기

    이메일 주소는 공개되지 않습니다.