마이크로 서비스로 전환하면 어떻게 런타임 문제가 발생합니까?


104

다음 주석 가는 다음과 같이 작성합니다 .

마이크로 서비스는 조직의 기능 장애를 컴파일 시간 문제에서 런타임 문제로 전환합니다.

주석자는 다음 과 같은 문제를 확장 합니다.

기능은 버그가 아닙니다. 런타임 문제 => 자극 문제 => 기능 장애에 대한 강력하고 빠른 피드백 책임자

이제 나는 마이크로 서비스 통해 그것을 얻습니다 .

  • 생산량과 런타임 문제인 처리량의 지연 시간을 늘릴 수 있습니다.
  • 구문 분석 오류가 발생할 수있는 코드의 "네트워크 인터페이스"수를 늘리십시오.
  • 청록색 배포를 수행 할 수 있습니다. 인터페이스 불일치로 인해 지연 될 수 있습니다 (네트워크 인터페이스 참조). 그러나 청록색 배포가 작동하면 런타임 문제가 더 많습니다.

내 질문은 : 마이크로 서비스로 전환하면 런타임 문제가 발생한다는 것은 무엇을 의미합니까?


13
만약 A가 monolyth로 B와 대화한다면, 실제 인터페이스는 (정적 타이핑을 통해) 호환되는 것으로 입증 될 수 있으며, 이는 또한 그것이 정확할 가능성이 높습니다. 보통 마이크로 서비스는 이러한 컴파일 시간 검사없이 무언가를 통해 통신합니다
Richard Tingle

마이크로 서비스 사용과 관련된 문제를 연구하는 경우 Fowler 기사를 반드시 읽어보십시오. martinfowler.com/articles/microservices.html @Richard Tingle이 말한 것처럼 컴파일 시간과 런타임의 경우가 아니라고 생각합니다. 실제로 생산 문제가 개발 문제보다 낫다는 데 동의하지 마십시오. 그러나 마이크로 서비스는 다른 방법으로 큰 프로젝트를 확장하는 데 도움이 될 수 있습니다. (그리고 대부분의 작은 프로젝트에는 과잉입니다)
Borjab

2
그 해설자는 근시안적입니다. 런타임 문제 => 자극 문제 => 불행한 사용자 => 돈 손실.
Philipp

@ 필립 : 그게 요점입니다. 조직 기능 장애로 인한 컴파일 시간 문제 => 아무도 신경 쓰지 않습니다. 조직의 기능 장애로 인한 돈 손실 => 해당 조직의 기능 장애를 담당하는 사람들을 정확하게 아프게합니다. 희망 : 조직 기능 장애가 더 빨리 해결됩니다.
Jörg W Mittag

답변:


194

문제가 있습니다. 마이크로 서비스를 사용하자! 이제 13 개의 분산 문제가 있습니다.

시스템을 캡슐화, 응집 및 분리 된 구성 요소로 나누는 것이 좋습니다. 다른 문제를 개별적으로 해결할 수 있습니다. 그러나 모 놀리 식 배포에서는 완벽하게 수행 할 수 있습니다 ( Fowler : Microservice Premium 참조 ). 결국, 이것은 OOP가 수십 년 동안 가르쳐 온 것입니다! 구성 요소를 마이크로 서비스로 전환하기로 결정한 경우 아키텍처상의 이점이 없습니다. 기술 선택과 관련하여 약간의 유연성과 확장 성이있을 수 있습니다 (그러나 반드시 그런 것은 아닙니다!). 그러나 (a) 시스템의 분산 특성 및 (b) 구성 요소 간의 통신으로 인해 두통이 발생합니다. 마이크로 서비스를 선택한다는 것은 이러한 문제에도 불구하고 마이크로 서비스를 기꺼이 사용할 수있는 다른 문제가 있다는 것을 의미합니다.

구성 요소로 깔끔하게 분할 된 단일체를 설계 할 수없는 경우 마이크로 서비스 시스템도 설계 할 수 없습니다. 모 놀리 식 코드베이스에서 고통은 분명합니다. 이상적으로 코드는 끔찍하게 손상되면 컴파일되지 않습니다. 그러나 마이크로 서비스를 사용하면 각 서비스를 다른 언어로도 개별적으로 개발할 수 있습니다. 구성 요소를 통합 할 때까지 구성 요소의 상호 작용에 문제가 발생하지 않으며, 그 시점에서 이미 전체 아키텍처를 수정하기에는 너무 늦었습니다.

버그의 1 번 원인은 인터페이스 불일치입니다. 누락 된 매개 변수와 같은 눈에 띄는 실수가 있거나 오류 코드 확인을 잊어 버리거나 메소드를 호출하기 전에 전제 조건을 잊어 버리는 등의 미묘한 예가있을 수 있습니다. 정적 타이핑은 코드가 실행 되기 전에 IDE 및 컴파일러에서 가능한 빨리 이러한 문제를 감지 합니다. 다이나믹 시스템에는이 사치품이 없습니다. 결함이있는 코드가 실행될 때까지 폭발하지 않습니다.

마이크로 서비스에 대한 시사점은 무섭습니다. 마이크로 서비스는 본질적으로 역동적입니다. 공식적인 서비스 설명 언어로 이동하지 않으면 인터페이스 사용법의 정확성을 확인할 수 없습니다. 당신은 테스트, 테스트, 테스트해야합니다! 그러나 테스트는 비용이 많이 들고 철저하지는 않으므로 프로덕션 환경에서 여전히 문제가 발생할 수 있습니다. 그 문제는 언제 명백해 집니까? 프로덕션에서 해당 경로가 잘못된 경우에만 실행됩니다. 자극 문제가 더 빠른 피드백으로 이어질 것이라는 생각은유쾌하게 데이터 손실 가능성에 만족하지 않는 한 위험합니다.


13
@JacquesB "조직 기능 장애"는 시스템을 개발할 수 없다는 것을 의미한다고 확신합니다. 내 대답의 대부분은 그러한 결론에 도달 할 수있는 방법을 설명하기위한 맥락이지만 내 전문적인 의견이며 트윗에서 가져 오지 않았습니다.
amon

10
"구성 요소로 깔끔하게 분리 된 모노 올리 스"-대체 무슨 뜻입니까?

10
인터페이스의 버전 관리 (시간이 지남에 따라 인터페이스가 변경됨)는 말할 것도 없습니다.
피터 Mortensen

12
@mobileink Monolith는“아키텍처 없음”을 제안하기 때문에 이상적인 용어는 아닙니다. 그러나 제가 전달하려는 것은 시스템의 일부가 독립적으로 배포 될 수있는 서비스 지향 아키텍처와 달리 단일 시스템으로 개발 및 배포 된 시스템입니다. 제발 편집 당신이 더 나은 용어를 알고 있다면 ... 포스트
아몬

7
@amon Monolith라는 단어를 듣는 것이 "아키텍처가 없다"는 생각을 즉시 불러 일으키지는 않습니다. 대부분의 건물은 이집트의 피라미드와 다른 많은 항목들과 마찬가지로 단일체입니다. 분명히 그들은 설계되어 전체적으로 제공되었습니다. 많은 소프트웨어 시스템에는 아키텍처가 부족합니다. 그러나 좋은 아키텍처의 부족은 배포 방식과 무관 한 것으로 보입니다. 다른 프로젝트의 스캐 폴딩 중 일부를 빌려서 아키텍처 (3 계층, 2 계층, n 계층, 마이크로 서비스 등)라고 부르더라도 그렇게한다고해서 확실하지는 않습니다.
Edwin Buck

215

첫 번째 트윗은 내 것이 었으므로 확장하겠습니다.

모 놀리 식 응용 프로그램을 작업하는 100 명의 개발자가 있다고 가정합니다. 서로 효과적으로 의사 소통하기에는 너무 많은 사람들이 있으므로 회사는 작은 팀으로 나누고 그들 사이에 좋은 의사 소통 패턴을 만들기 위해 열심히 노력해야합니다. 조직이 "역기능 적"일 때 팀은 서로 대화하지 않고 더 큰 목표에 부합하지 않으며 우선 순위 등에 동의하지 않으므로 결과적으로 무언가를 배송하는 데 시간이 오래 걸립니다. 소프트웨어가 생산되기 전에 기능 장애가 명백하다는 점에서 "컴파일 시간 문제"입니다. 이 프로젝트는 아마도 죽음의 행진이거나 결코 출항하지 않을 것입니다 ( "컴파일").

저는 많은 사람들이 기술 / 건축 적 이점이 아니라 조직의 기능 장애를 무시할 수 있기 때문에 마이크로 서비스에 관심을 갖고 있으며 이들로 이동하고 있다고 생각합니다. 그들은 개발자 100 명을 조율하는 대신 작은 팀이 사일로에서 일할 수 있기를 희망하며 각각 작은 마이크로 서비스에 중점을 두었습니다. 당신이 그런 역기능적인 조직에 있다면, 이것은 매우 매력적입니다. 그것은 당신이 좋아하지 않는 사람들을 피하고, 의사 소통하지 않기 위해 훨씬 더 큰 허가를줍니다.

안타깝게도 소프트웨어가 프로덕션 환경에서 실행되면 통신이 중요해지기 때문에 "런타임 문제"가됩니다. 조직의 문제 (팀과 팀의 구성 및 의사 소통 방법)는 "런타임"에 나타납니다.

내 트윗의 요점은 당신이 가진 것이 사람들의 문제라면 새로운 아키텍처는 도움이되지 않습니다. 문제의 영향을 지연시킬뿐입니다. 많은 사람들에게 마이크로 서비스의 매력은 이러한 사람들의 문제를 마술처럼 해결할 것이라는 희망이라고 생각합니다.


67
+1. 이것은 트윗보다 스택 교환 답변으로 훨씬 좋습니다. :-)
ruakh

3
모든 동적 시스템에서도 마찬가지입니다. 다이나믹 한 타이핑은 매우 유용하지만 원하는 사람이있는 경우에만 유용합니다. "자유형 데이터베이스"는 매우 유용하지만 적절한 사람이있는 경우에만 유용합니다. 적절한 사람이 없다면 문제를 해결하지 않고 위임하는 것입니다.
Luaan

2
나는 이것이 타우 톨 로지라고 생각한다. 사람들이 문제 일 때 문제는 어느 곳에서나 나타날 수 있습니다. 적절한 통합 테스트없이 솔루션을 마이크로 서비스로 실행하는 것을 상상할 수 없습니다. 이러한 경우 지원되는 작업 흐름으로 솔루션을 배송 할 수있는 방법이 없습니다. 흐름 테스트없이 특히 문제를 숨기려고 마이크로 서비스로 이동하는 사람은 문제입니다. 테스트되지 않았거나 고장난 바이너리를 배송 할 수도 있습니다. 기병 수준의 프로그래머가 더 높은 곳에서 문제를 제기합니다.
luk32

10
@ luk32 일부는 그렇습니다.하지만 나쁜 팀에게 매력을 느끼게하는 마이크로 서비스의 요점은 기술과 의사 소통 부족을 더 오랫동안 눈에 띄지 않게한다는 것입니다. 문제가 생기거나 문제가되지는 않습니다. 언제
T. Sar

18
아주 좋은 대답입니다. 트위터에 대한 나의 의견을 사람들을 자극하는 것 외에는 전혀 쓸모없는 것으로 확인해 주셔서 감사합니다.
Robert Harvey

43

내 질문은 : 마이크로 서비스로 전환하면 런타임 문제가 발생한다는 것은 무엇을 의미합니까?

그것은 그 트윗이 말하는 것이 아닙니다 ! 그들은 마이크로 서비스로의 전환 대해 아무 말도하지 않으며 문제 를 만드는 것에 대해 아무 말도하지 않습니다 . 그들은 변화하는 문제 에 대해서만 말을합니다 .

그리고 그들은 자신의 주장에 대해 문맥 상 제한을 두었습니다. 즉, 조직이 제대로 작동하지 않는다는 것입니다.

그래서, 무엇 첫번째 트윗은 기본적으로 말하고있는 것은 두 가지이다 :

  • "귀하의 조직이 현재 마이크로 서비스없이 복잡한 시스템을 엔지니어링 할 수없는 경우에는 마이크로 서비스를 사용하여 복잡한 시스템을 마술처럼 엔지니어링 할 수 없습니다."
  • "컴파일 타임 중에, 즉 개발 중에 런타임에 나타나는, 즉 생산 중에 나타날 수없는 문제로 인해 발생하는 문제"(기술적으로는 테스트 중에도 나타날 수 있지만 견적은 그 자체로 제한됨 하위 표준 테스트 제도가있을 가능성이있는 기능 장애 조직에)

번째 트윗은 문제가 프로덕션 환경에서만 나타납니다. 즉 고객이 문제를 보는 위치가 버그가 아니라 기능이라는 사실입니다. 조직의 기능 장애에 대해 무언가를 할 수있는 장소 (예 : 높은 수준의 관리) 조직의 기능 장애는 일반적으로 높은 수준의 관리에 실패하기 때문에 불만족스러운 고객은 해당 불만족에 대해 궁극적으로 책임을지는 사람에게 크게 반영하지 않는 반면, 높은 수준의 관리 실패로 인한 낮은 코드 품질은 일반적으로 개발자에게만 반영됩니다. 그러나 잘못이 아니고 그것에 대해 무언가를 할 수 없습니다.

따라서 첫 트윗은 마이크로 서비스가 나쁜 관리로 인한 문제를 컴파일 시간에서 개발자 만 보는 런타임에서 고객이 보는 런타임으로 이동 시킨다고 말합니다. 두 번째 트윗은 그것이 좋은 일이라고 말합니다.


6
@Michael 코드 품질에 어떤 영향을 미치는지 알 수 없다면 경영진이 비즈니스가 창출하는 제품 품질 에 어떤 영향을 미치는지 고려 하십시오.
wjl

30
@Michael : 모든 것은 궁극적으로 높은 수준의 관리로 인해 발생합니다. 마감 시간이 짧아 코드 품질이 낮습니까? 누가 마감일을 정합니까? 마감일을 정한 사람에게 마감일을 정하는 사람은 누구입니까? 무능한 개발자가 코드 품질이 낮습니까? 무능한 개발자를 누가 고용 했습니까? 무능한 개발자를 고용 한 사람들을 누가 고용 했습니까? 공구가 부적절해서 발생합니까? 누가 그 도구를 사나요? 이 도구를 구매할 예산을 누가 승인합니까? 어리석은 아키텍처로 인해 발생합니까? 건축가는 누가 고용 했습니까? 누가 그를 담당 했습니까? 그 트윗은 특별히 문맥에 있었다 ...
Jörg W Mittag

13
… 조직 ​​기능 장애. 음, 조직의 기능을 꽤 많이 높은 수준의 관리 작업. 그것이 경영진 입니다 .
Jörg W Mittag

4
아마도 장기적으로 효과가 있을지 모르지만, 고객에게 영향을 미침으로써 회사의 문제를 해결한다는 아이디어는 옳지 않은 것처럼 보입니다.
Stijn de Witt

1
@ JörgWMittag 나쁜 개발자가 작성한 나쁜 코드는 나쁜 개발자가 아닌 나쁜 개발자를 고용 한 사람들의 잘못이라고 주장하는 것이 합리적이라고 생각하지 않습니다. 궁극적으로 관리 책임이 될 수도 있지만 개발자 가 원인 입니다.
Miles Rout

9

컴파일 타임 문제 와 달리 런타임 문제가 발생합니다.

모 놀리 식 앱은 컴파일하기 어렵고 비용이 많이 듭니다. 그러나 일단 컴파일되면 유형 시스템이이를 잡을 수 있기 때문에 구성 요소간에 멍청한 비 호환성이 존재하지 않는다는 것을 합리적으로 확신 할 수 있습니다. microservive 시스템에서 동일한 오류는 두 가지 특정 구성 요소 가 특정 방식으로 실제로 상호 작용할 때까지 표시되지 않을 수 있습니다 .


9
이것은 "단일체 (monolithic)"응용 프로그램이 항상 정적으로 유형이 있다고 가정하는 것 같습니다. 동적으로 입력 된 언어는 어떻습니까? 정적으로 유형이 지정된 서비스 인터페이스는 어떻습니까?
JacquesB

1
@JacquesB OTOH, 나는 동적으로 유형이 지정된 컴파일 된 언어를 정확히 0으로 생각할 수 있습니다.
immibis

2
@JacquesB JavaScript와 Python은 컴파일되지 않습니다. 내부 인터프리터 구조를 컴파일 대상으로 계산하지 않으면 모든 언어 가 컴파일됩니다.
immibis

3
@immibis : 현재 존재하는 모든 ECMAScript 구현에는 하나 이상의 컴파일러가 있습니다. 예를 들어 V8에는 두 개의 컴파일러와 정확히 제로 인터프리터가 있으며 해석 하지 않으며 항상 이진 기본 기계 코드로 컴파일됩니다. SpiderMonkey에는 4 개의 컴파일러가 있고 하나의 인터프리터가 있지만 해당 인터프리터는 ECMAScript를 해석하지 않습니다. SpiderMonkey 는 ECMAScript를 해석 하지 않으며 항상 SpiderMonkey 바이트 코드로 먼저 컴파일 한 다음 이진 기본 머신 코드로 컴파일 할 수 있습니다. 현재 존재하는 모든 Python, Ruby 및 PHP 구현에는 컴파일러가 있습니다.
Jörg W Mittag

12
@LieRyan 형식 유추가 동적 형식과 동일하거나 Haskell 이 동적 형식 이라고 생각하면 심각하게 혼동됩니다 .
데릭 엘 킨스

2

모 놀리 식 시스템과 마이크로 서비스 모두 서브 시스템 간의 인터페이스를 정의해야합니다. 인터페이스는 잘 설계되고 문서화되어 있고 가능한 한 안정적이어야합니다. 이것은 OOP와 동일합니다.

조직에서이를 수행 할 수 없으면 마이크로 서비스도 문제를 해결하지 못합니다. 마이크로 서비스에는 공용 웹 인터페이스가 있습니다. 따라서 인터페이스 디자인에 더 많은 노력을 기울여야합니다.

인터페이스가 올바르게 설계되지 않으면 두 가지 종류의 런타임 문제가 발생합니다.

  1. 인터페이스가 올바르게 사용되지 않으면 컴파일 타임이 아닌 런타임시 오류가 발생합니다.
  2. 웹 인터페이스 호출은 상당히 느리므로 성능 문제가 발생할 수 있습니다.

나는 런타임 문제를 일으키는 것이 책임있는 사람들에게 의사 소통하는 조직적인 문제가 아니라고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.