마이크로 서비스 아키텍처에서 서비스가 서로 직접 대화해야합니까?


10

웹 응용 프로그램을 구성하는 많은 웹 서비스가 있습니다. 클라이언트는 REST API 호출을 통해 이러한 서비스에 액세스 할 수 있습니다.

이러한 서비스가 서로 직접 대화 할 수 있어야합니까? 그렇다면 마이크로 서비스 개념에 반하는 커플이되지 않습니까?

클라이언트가 웹 페이지를 클라이언트에로드하는 데 필요한 데이터를 얻기 위해 클라이언트에서 하나씩 직접 호출해야합니까?

또는 클라이언트의 요청을 처리하고 해당 요청에 대한 데이터를 가져온 다음 클라이언트로 다시 보내는 다른 레이어가 서비스 위에 있어야합니까?


사물이 완전히 분리되면 완전히 분리 된 제품입니다. 따라서 사용자는 Contoso 로그인에 로그인 한 다음 Contoso 로그인에 "현재 로그인했습니다!"라고 표시 한 다음 Contoso 민감한 데이터 저장소로 이동하여 "예, 로그인했습니다. "... 그런 다음 그 데이터를 Contoso 데이터 프로세서에 복사하여 붙여 넣기 ...
user253751

답변:


16

당신의 서비스가이 그림처럼 보이기를 원한다면, 그렇습니다. 여기에 이미지 설명을 입력하십시오 그것은 할 수없는 것과 같지 않지만 대부분의 경우 나쁜 결과를 초래할 것입니다. REST를 통한 통신은 서비스를 크게 분리하지 않습니다. 일부 서비스 인터페이스가 변경되면 모든 종속 서비스를 변경하고 재배치해야합니다. 또한 서비스를 재배치하는 동안 모든 종속 서비스를 내려 놓아야합니다. 이는 고 가용성 표준에 적합한 디자인으로 간주되지 않습니다.

결국, 당신은 대체 모노리스 앱보다 느리지 만 거의 모든 문제가 동일한 마이크로 서비스 애플리케이션을 갖게 될 것입니다!

@Robert Harvey에 동의하지 않습니다

그러나 실제로는 하나 이상의 마이크로 서비스 (아마도 모두)가 SQL 데이터베이스와 같은 일부 중앙 데이터 저장소와 통신합니다.

통합 데이터베이스는 잘 알려진 반 패턴

보다 나은 솔루션은 서비스 간 통신을 비 동기화하기 위해 publish-subscribe 패턴을 사용하는 것입니다.

여기에 이미지 설명을 입력하십시오

이 커뮤니케이션 방법을 구현하는 CQRS / ES 방식을 살펴보십시오. Greg Young과 다른 사람들 이 주제에 대한 수많은 멋진 비디오 를 제공합니다. "CQRS / ES"키워드를 Google에 입력하십시오. 이 방식에서는 각 서비스가 동시에 게시자 및 가입자가되어 서비스를 훨씬 덜 결합시킬 수 있습니다.

다음은 주제와 관련된 논란에 빛을 비추는 마이크로 서비스에 대한 기사 시리즈입니다 . 멋진 삽화와 함께 매우 자세한 설명.


2
우선, Fowler를 제외한 다른 곳에서는 "통합 데이터베이스"라는 용어를 듣지 못했습니다. 한 사람이 말했기 때문에 복음으로 무언가를 가져 가지 마십시오. 둘째, 내가 "통합 데이터베이스"라고 기술 한 것을 호출 할 정보가 충분하지 않습니다. 셋째, Fowler는 실제로 링크 된 동일한 기사에서 올바른 환경에서 유용한 데이터베이스를 호출합니다. 이벤트 버스의 아이디어가 마음에 들지만 효율성을 높일 수 없다면 마이크로 서비스의 일반적인 API를 호출하는 것과 어떻게 다른지 알 수 없습니다.
Robert Harvey

Robert에게 감사합니다. 저는 Fowler의 기사를 연결하여 권위를 주장하지 않고 아이디어를 더 잘 설명했습니다. 이러한 접근 방식은 통합 데이터베이스와 매우 흡사합니다. 그것이 다르다면 전혀 분명하지 않습니다. 올바른 상황과 관련하여-데이터베이스를 통해 마이크로 서비스를 통합하는 것은 우리를 모 놀리 식 아키텍처로 되돌려 놓는 것이 좋지 않습니다.
IlliakaillI

1
물론 : 각 마이크로 서비스는 별도의 데이터베이스 나 다른 서비스 테이블과 관련이없는 동일한 데이터베이스의 테이블과 통신합니다. 이러한 방식으로 서비스는 데이터베이스를 통해 정보를 교환하지 않으므로 수평으로 쉽게 확장 할 수 있으며 병목 현상이 훨씬 줄어 듭니다. 그리고 동일한 테이블을 공유하지 않기 때문에 앱의 한 부분을 변경하면 다른 부분에 영향을 줄 가능성이 적습니다.
IlliakaillI

1
절대적으로 그것을 절대적으로 언급 할 수는 없습니다. 동일한 데이터베이스에 동일한 정보를 필요로하는 두 개의 서비스가있을 수 있습니다. 가끔씩 만 필요하며, 그러한 방식으로 액세스하기위한 확장 성 문제가 없으며, 두 서비스가 이미 다른 목적으로 데이터베이스에 액세스하고 있으므로 서비스 버스를 세우십시오. 또는 API 엔드 포인트가 그렇게하기 위해 터무니없는 일입니다.
Robert Harvey

1
그러나 비즈니스 가치를 달성하기 위해 다음과 같은 데이터를 결합하려고합니다. "아래에 오는 비에 대한 다음 레이더 데이터가 주어지면 저장 용량이 부족한 모든 하수도 시스템을 보여주고 결과를 사용하여이 지방 자치 단체의지도를 색칠하십시오." 모든 데이터를 서비스로 분할하면 나중에 데이터를 결합 할 수 있음을 의미합니다. 서비스가 서로 대화하는 것을 금지하는 경우 모든 데이터를 일부 클라이언트로 이동하고 해당 데이터를 조인하도록하십시오. 결국 응용 프로그램 값을 제공하므로 데이터를 어딘가에 연결하고 싶습니다.
RemcoGerlich

8

Udi Dahan이 SOA 에 대해 말한 것을 읽으면 많은 훌륭한 아이디어를 얻을 수 있습니다.

서비스는 특정 비즈니스 기능에 대한 기술 권한입니다. 모든 데이터 또는 규칙은 하나의 서비스 만 소유해야합니다.

이것이 의미하는 바는 서비스가 서로의 이벤트를 게시하고 구독하는 경우에도 모든 데이터 및 규칙에 대한 권위있는 진실 소스가 무엇인지 항상 알고 있다는 것입니다.

또한 비즈니스 기능의 렌즈에서 서비스를 볼 때 많은 사용자 인터페이스가 다양한 기능에 속하는 정보를 제공합니다. 즉, 제품 가격과 함께 제품 가격입니다. 위의 서비스 정의를 준수하기 위해 이러한 사용자 인터페이스는 실제로는 매시업이라는 것을 이해하게됩니다. 각 서비스는 UI의 조각을 통해 특정 데이터를 처리합니다.

UI 구성과 관련하여 Mauro Servienti의 UI 구성 에 관한 기사 는 좋은 출발점입니다. Udi의 비디오를 참조 하십시오 .

이러한 서비스가 서로 직접 대화 할 수 있어야합니까? 그렇다면 마이크로 서비스 개념에 반하는 커플이되지 않습니까?

두 서비스가 서로 메시지를 교환하면 몇 가지 연결이 발생합니다. 기본 답변은 다른 서비스의 API (서비스 내부가 변경 되어도 서비스가 안정적으로 유지되도록 약속하는 계약)와 연결되어 있다는 것입니다.

그 외에도 서비스 검색 과 같은 기술 은 특정 서비스 제공 업체에 대한 종속성을 완화 할 수 있으며 메시지 브로커는 생산자와 소비자를 분리 할 수 ​​있습니다 (여전히 서로의 메시지를 이해하고 메시지 브로커의 API와 상호 작용하는 방법이 필요함). ).


7

"직접"의 의미에 따라 다릅니다.

마이크로 서비스 아키텍처에 따르면 REST와 같은 인터페이스를 통해 자체 서버 또는 외부 서버에서 다른 마이크로 서비스를 호출하는 마이크로 서비스를 보유하는 것이 좋습니다.

좋지 않은 것은 하나의 마이크로 서비스가 직접 메소드 호출을 사용하여 다른 마이크로 서비스를 호출하는 것입니다. 그것은 두 마이크로 서비스를 동일한 단일체의 일부로 만들 것입니다.


그것은 좋지 않으며 나쁜 결과를 초래할 것입니다. 자세한 내용은 내 답변을 참조하십시오.
IlliakaillI

"마이크로 서비스 아키텍처에 따르면"괜찮습니다. 마이크로 서비스 아키텍처에 결과가 없거나 개선 할 수있는 것은 아닙니다. 여기서 질문은 "책에 의해 X입니까?"입니다. 정답은 X의 올바른 정의가 주어지면 책에 의한 것입니다.
Mike Nakis

실제 "마이크로 서비스 아키텍처"를 구축하는 방법을 알려주는 "레퍼런스 북"이 있습니까? 오늘날 마이크로 서비스는 화두가되고 있으며 많은 사람들이 REST를 기반으로 모놀리스를 만드는 방법에 관한 책을 썼습니다. 내 대답에서 첫 번째 다이어그램을 보아라. 그런 식으로 시스템을 구축하는 것은 의미가 없습니다. 이상한 이유가 있다면 분명히 잘못하고 있습니다. 대신 모노리스를 사용하는 것이 좋습니다. 일부 책을 맹목적으로 참조하여 디자인 선택을 뒷받침한다면 (권한을 주장함) 소프트웨어 디자인에 접근하는 올바른 방법이 아닙니다.
IlliakaillI

5

이러한 서비스가 서로 직접 대화 할 수 있어야합니까? 그렇다면 마이크로 서비스 개념에 반하는 커플이되지 않습니까?

커플 링은 나쁜 단어가 아닙니다. 모든 어플리케이션에는 이미 어느 정도의 결합이 있습니다. 마이크로 서비스와 통신하는 응용 프로그램은 이미 마이크로 서비스 와 연결 되어 있습니다. 그렇지 않으면 작동하지 않습니다.

마이크로 서비스를 통해 실제로 추구하는 것은 느슨한 결합입니다 . 하나의 마이크로 서비스가 공개 API를 통해 또는 이벤트 버스를 사용하여 다른 마이크로 서비스를 조사하도록함으로써이를 달성 할 수 있습니다.

그러나 실제로는 하나 이상의 마이크로 서비스 (아마도 모두)가 SQL 데이터베이스와 같은 일부 중앙 데이터 저장소와 통신합니다. 목표 달성 방법에 따라 하나의 마이크로 서비스가 어떤 방식으로 데이터베이스 데이터를 변경하도록 할 수 있으며, 다른 마이크로 서비스가 변경을 가져 오기 위해 쿼리 할 수 ​​있습니다.


3
"통합 데이터베이스"는 잘 알려진 반 패턴입니다. 자세한 내용은 제 답변을 참조하십시오.
IlliakaillI

2

일반적으로 SOA와 아키텍처에 대해 말할 때 사람들은 의미와 전문 용어에 얽매이는 것 같습니다. 서비스를 "마이크로"하게 만드는 것은 무엇입니까? 궁극적으로, 사용하는 "점수 시스템"에서 서비스를 "미시적"으로 만들지 않는 것은 몇 가지 특성입니다. 대법원 판결이 부정에 대해 말한 것은 무엇입니까? "볼 때 ​​알 수 있습니다."

나는 어떤 사람들이 이것이 대답이 아니라고 말할 것이라고 확신하지만, 요점을 놓치고 있습니다. 마이크로 서비스 아키텍처는 몇 가지 문제를 피하기 위해 고안되었으며, 그 중 "꽉 조이는"문제가 있습니다. 따라서 서로에 대한 너무 많은 세부 정보에 의존하는 얽힌 마이크로 서비스를 만들면 펍 / 서브 메시지 버스를 사용하든 직접 호출을 사용하든간에 조각에서 새로운 솔루션을 작성하고 전체 시스템을 중단하지 않고 개별 조각을 재구성하는 기능 등


1

클라이언트가 웹 페이지를 클라이언트에로드하는 데 필요한 데이터를 얻기 위해 클라이언트에서 하나씩 직접 호출해야합니까?

때에 따라 다르지; 그러나 클라이언트에게 직접 사용할 수있는 기능을 제공하고 결과가 어떻게 구성되는지에 대한 세부 정보를 숨기거나 (캡슐화) (예 : 여러 마이크로 서비스를 통해) 제안합니다.

클라이언트가 개별 마이크로 서비스 결과를 결합하는 데 너무 많은 로직이 포함 된 경우, 일부 비즈니스 로직이 클라이언트에 우연히 발생할 수 있습니다. 또한 원하는 것보다 더 많은 내부 아키텍처를 클라이언트에 노출시켜 나중에 마이크로 서비스 리팩토링을 방해 할 수 있습니다.

즉, 마이크로 서비스의 경우, 클라이언트에게 유용한 추상화가있는 엔드 포인트를 제공하고 다른 (아마도 더 내부적 인) 마이크로 서비스의 상위 레벨 조정을 수행하는 랩퍼 마이크로 서비스를 갖는 것이 도움이되는 경우가 있습니다.


(또한 클라이언트 왕복 요금은 마이크로 서비스에서 다른 왕복 요금보다 비쌉니다.)


예를 들어 GraphQL이 취한 방향을 살펴보면 엔드 포인트에 직접 관련 쿼리를 발행하는 클라이언트를 찾을 수 있습니다.이 서비스는 micrservices 컬렉션으로 구현되거나 구현되지 않을 수 있습니다. 마이크로 서비스의 아키텍처는 GraphQL 뒤에 숨겨져 있기 때문에 아키텍처를보다 쉽게 ​​리팩터링하고 클라이언트에게 친숙하게 만들 수 있습니다. 예를 들어 https://stackoverflow.com/a/38079681/471129를 참조하십시오 .


1

마이크로 서비스의 주요 목적은 응용 프로그램을 느슨하게 연결하는 것입니다. 따라서 서비스는 서로를 호출 할 수 없습니다. 그렇지 않으면 묶여 있습니다. 그러나 데이터를 공유해야하는 두 가지 서비스가있는 경우 어떻게해야합니까? 답은 Message Broker입니다. 따라서 클라이언트에서 데이터를 가져 오는 서비스는 중앙 메시지 브로커와 데이터를 공유 할 수 있으며 서비스는 해당 데이터를 사용하여 데이터를 소비하고 변환하여 자체 데이터 저장소에 넣을 수 있어야합니다. Kafka Stream을 사용하면 다른 주제의 데이터를 즉석에서 조인 할 수 있으므로 Kafka를 권장합니다. 추신. 기능별로 마이크로 서비스를 분리하는 것이 좋습니다.

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