마이크로 서비스 : MonolithFirst?


9

나는 모든 장단점,시기 및 이유에 대한 높은 수준의 개요를 얻으려고 노력하는 마이크로 서비스 아키텍처를 연구하고 있습니다. 제가 읽고 /보고있는 많은 정보는 ThoughtWorks (Martin Fowler, Neal Ford, et. al).

이 주제에 대한 Martin Fowler의 작업의 대부분은 마이크로 서비스 (일반적으로 실습은 아니지만 가정의 이름으로)가 아직 젊었을 때 몇 년이 지났으므로 소금 한 알을 많이 사용합니다.

특히 한 가지는 다음과 같습니다.

마이크로 서비스 아키텍처를 사용하는 팀에 대한 이야기를 들으면서 일반적인 패턴을 발견했습니다.

  • 거의 모든 성공적인 마이크로 서비스 사례는 너무 커져서 부서진 모놀리스로 시작되었습니다.
  • 처음부터 마이크로 서비스 시스템으로 구축 된 시스템에 대해 들어 본 거의 모든 경우에 심각한 문제가 발생했습니다.

이 패턴 덕분에 많은 동료들이 마이크로 서비스로 새로운 프로젝트를 시작해서는 안된다고 주장 했습니다. .

(참조 : https://martinfowler.com/bliki/MonolithFirst.html- 강조)

이제 3 년 후 마이크로 서비스를보다 보편적으로 사용하는 것은 일반적으로 새로운 서비스가 더 큰 (마이크로 서비스보다 작지만 모노 로닉스보다 작은) 서비스 청크를 가지고 더 나은 서비스를 제공한다는 것이 일반적으로 동의 하는가? 진화론 적 측정의 일부로 더 세분화되어 있습니까?

또는 위의 설명과 달리 세분화 된 마이크로 서비스 아키텍처로 프로젝트를 처음부터 시작하는 표준이 있습니까?

제정신의 일반적인 접근 방법처럼 보이지만 커뮤니티의 생각에는 궁금합니다.

답변:


2

회사에서 마이크로 서비스를 한동안 수행 한 경우 일부 조각이 이미 구축되어 있으므로이를 통합하기 만하면됩니다. 서비스 인증 또는 Blob 데이터 저장 등의 예가있을 수 있습니다. 이 경우 이미 경계를 정의했으며 새 응용 프로그램에서 코드를 재사용하고 있습니다. 좋은 일입니다.

경계가 어디에 있는지 확실하지 않은 새 코드의 경우 하나의 서비스로 빌드하십시오. 모듈 형으로 유지하면 필요에 따라 마이크로 서비스를 분리 할 수 ​​있습니다. 특히 다른 서비스와 다르게 확장해야하는 서비스를 찾을 때.

마이크로 서비스의 이점은 인스턴스를 추가하여 필요에 따라 수행되는 작업을 확장 할 수 있다는 것입니다. 일부 작업이 갑자기 발생하는 경우 자체 마이크로 서비스로 분리하는 것이 좋습니다.

일반적으로 :

  • 이미 마이크로 서비스를 구축 한 경우 재사용하십시오
  • 새로운 것을 만들고 있다면 아이디어가 먼저 작동하도록하십시오
  • 구축 할 때 일부 서비스를 쉽게 분리 할 수 ​​있도록 모듈 식으로 유지하십시오.
  • 구축 할 때 서비스의 일부를 다른 요율로 주문형 확장 할 수 있어야하는 경우이를 자체 서비스로 분리

너무나 자주, 우리 는 Martin Fowler와 같은 좋은 평판을 가진 똑똑한 사람들로부터 유용한 지침을 들은 후 어떤 식 으로든 흔들리지 않는 어려운 교리로 바꿉니다.

당신은 그런 진술을해야 정신에 그들이 의미하는 방법. Martin Fowler는 분석을 통해 사람들을 마비로부터 구하기 위해 노력하고 있으며 먼저 효과가있는 것을 만들라고 말합니다. 응용 프로그램의 실제 작동 방식에 대한 자세한 내용은 나중에 나중에 분리 할 수 ​​있습니다.


13

간단한 코드 모듈화를 통해 마이크로 서비스의 가장 중요한 이점을 얻을 수 있습니다. 보유하고있는 모듈 시스템 (maven, npm, nuget 등)을 사용하여 기능 그룹을 모듈로 분리 할 수 ​​있습니다. 각 모듈은 단일 목적을 수행하고 자체 저장소를 저장하고 자체 DB 스키마를 사용하며 자체 구성을 관리하고 자체 기능 백 로그 및 릴리스 일정을 가질 수 있습니다. 그것들은 여전히 ​​모놀리스에 함께 배치 될 수 있습니다. 이는 매우 관리하기 쉬운 오버 헤드이며 몇 가지 좋은 이점을 제공합니다. 더 큰 오버 헤드는 배포를 분리 할 때 발생합니다. 배포를 필요로 할만큼 충분한 규모가 확보 된 경우에만 가치가 있습니다. 코드가 이미 모듈식이라면 시간이 다가 오면 더 쉽게 마이그레이션 할 수 있습니다.


약간의 개선 된 코드베이스 관리와 혼합 된 일반적인 코딩 모범 사례의 건전한 소리처럼 들리지만 "소규모 서비스 업데이트시 전체 단일체를 업데이트 할 필요가 없습니다"경로에는 미치지 못합니다. 빛나다. 어쨌든 좋은 조언, 감사합니다.
jleach

1
답변에 완전히 동의하십시오. 잘 구축되고 올바르게 모듈화 된 모놀리스는 마이크로 서비스가 갖는 대부분의 이점을 제공합니다. 반면에 마이크로 서비스는 자체적으로 큰 문제가 있습니다.
Milos Mrdovic

@jleach 우수한 모듈화의 한 가지 품질은 독립적 인 배포 가능성입니다. 사소한 모듈 업데이트를 수행하기 위해 전체 모노리스를 다시 컴파일하고 재배치해야하는 경우 무언가 잘못한 것입니다.
Milos Mrdovic

2
이것은 좋은 접근 방법입니다. 마이크로 서비스를 위해 마이크로 서비스를 구축하지 마십시오. 마이크로 서비스 아키텍처는 문제를 해결하는 데 사용해야하지만 자체 문제도 함께 제공되므로 이러한 트레이드 오프에 대해 준비 / 인식을하지 않는 경우 마이크로 서비스를 처음부터 개발하는 데 실제로주의해야합니다.
Lie Ryan

1
@MilosMrdovic은 모듈 접근 방식을 사용하더라도 전체 모놀리스를 다시 테스트 할 필요가없고 업데이트하는 모듈 만 사용하므로 배치 효율성이 여전히 향상 될 수 있습니다. 모듈이 모든 품질 게이트를 통과하면 모듈을 제작하여 배송 할 수 있습니다. 그런 다음 모놀리스는 의존성 버전을 업데이트하고 재배치하면됩니다. 다른 모듈을 다시 만들 필요가 없습니다.
jiggy

2

제 생각에는 모놀리스를 먼저 개발하는 것이 좋습니다 (또는 더 나은 방법 : 모놀리스로 응용 프로그램의 일부를 개발하는 것).

도메인과 문제의 경계에 대해 잘 모르는 경우가 있습니다 (예 : 선박 관리 사이트를 구축하거나 선박 서비스와 함대 서비스가 필요합니까, 아니면 선박 서비스로 충분합니까?). 모놀리스는 개발하기가 더 쉬울 수 있습니다.

다른 기술을 혼합 해야하는 경우 (예 : 기존 부분은 C #으로 작성되지만 yoyur 새로운 문제에는 기계 학습이 필요하며 Python으로 가장 잘 수행됨)이 작업을 중지해야합니다. 예를 들어, 모든 사람들이이 모놀리스를 구축하고 별도의 서비스 개념을 과시합니다.


1
“이러한 경우 마이크로 서비스를 개발하기가 더 쉬울 수 있습니다.”– 모놀리스 에 대해 이야기하고 싶습니까?
amon

@amon 감사합니다, 나는 문장을 수정했습니다-내 아들이 34235 번 방해하여 혼란 스러웠습니다.)
Christian Sauer

당신의 첫 문장에 동의하는 동안, 당신은 당신의 모놀리스조차도 이미 "모듈 형"이어야한다고 생각해야합니다.
Walfrat

@Walfrat 나는 동의하는 경향이 있지만, 기존 코드를 재사용하려는 유혹은 모놀리스에서 훨씬 더 크며 덜 쉬워진다. 예를 들면 "오 보면, 누군가는은 widgetid 정의, I 것이다 단지 재사용 나의 FormId에 대한"또한, 당신은 쉽게 정말 생각 "모든 사람들이 공통의 도구를 사용해야합니다"육성 프로젝트, 다른 언어 / DB를 사용할 수 없습니다
기독교 사우어

1

MF의 정확한 기사에 대해 몇 가지 질문이 있다고 확신합니다.

내 취향은 이것입니다 :

유지 관리 또는 확장 성 문제가있는 Monolith는 마이크로 서비스로 세분화하여 향상됩니다. 이러한 프로젝트는 작은 섹션을 분해하더라도 측정 가능한 이득을 얻을 수 있고 행복 할 때 그 아래에 선을 그릴 수 있으므로 거의 항상 '성공적'입니다.

절반의 단일체 + 메시지 대기열 및 몇 개의 작업자 프로세스가 '마이크로 서비스 아키텍처'로 간주되는 것은 술집을 낮추는 논쟁이지만 , 프로젝트에 대해 이야기 할 때 분명히 호출 할 것입니다.

반면, 선택한 아키텍처에 관계없이 새로운 프로젝트는 기대치를 충족하지 못할 위험이 있으므로 당연히 성공률이 낮아질 것입니다. 또한 모든 것을 '최상의 실습 마이크로 서비스 아키텍처'를 처음부터 목표로 삼기 시작했다면, 새로운 기술과 더 어려운 마이크로 서비스에 집중할 수 있습니다.

또한 우리는 MF가 큰 OOP 관점에서 작성한다는 것을 기억해야합니다. 그는 자연스럽게보다 현대적인 분산 접근법에 회의적입니다.

요즘 나는 대기업 솔루션이 마이크로 서비스 요소를 통합 할 것으로 예상하고 단일 데스크탑 스타일의 응용 프로그램을 배포하지 않는 한 어리석은 사람이 하나의 거대한 단일 응용 프로그램을 만드는 것이 좋습니다.


감사. MF가 약간 편향되는 경향이 있다면, 반대쪽에서 연구를 통해 원근감을 얻을 수있는 사람이 있습니까?
jleach

나는 '웹 유명인'을 학습 자료로 추천하지 않을 것입니다. 몇 가지 일화와 재미있는 이야기가 가능하지만 내 경험상 성공과 실패의 모든 차이를 만드는 세부 사항이 있습니다.
Ewan

0

제 경험은 기술 문제보다는 사람 문제로 인해 더 많은 프로젝트가 실패하는 것을 목격했습니다. 불행히도 사람들은 실패를 좋아하지 않으므로 실패 이유를 잘못보고하고 기술을 비난하는 경향이 있습니다.

필자의 영역에서, 금융 분야에서 오늘날 대부분의 새 프로젝트는 마이크로 서비스 아키텍처를 따르고 있으며 TCO (총 소유 비용) 관점에서이기는 아키텍처 인 것 같습니다. 이러한 프로젝트는 자주 실패하지 않는 것으로 보이며 주어진 이유로 인해 응용 프로그램 아키텍처를 문제로 자주 나열하지는 않습니다.


마이크로 서비스는 실제로 많은 조직 문제를 해결합니다. 각 서비스에 소유자가 있으면 작동하지 않을 때 질식하는 방법을 알고 있습니다.
jiggy

@jiggy : 코드가 잘 모듈화되어 있다면, 누가 질식해야하는지 알기 위해 여러 서비스로 분할 할 필요는 없습니다.
Lie Ryan

@Ryan, 누군가 마이크로 서비스와 모듈화가 동의어라고 생각한다면, 그 요점을 완전히 놓친 것입니다.
소프트웨어 엔지니어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.