마이크로 서비스 아키텍처에서 비즈니스 로직은 어디에 위치해야합니까?


12

모 놀리 식 접근법에 익숙하기 때문에 여전히 마이크로 서비스 아키텍처에 대해 머리를 감싸려고합니다.

매우 단순화 된 Uber 예약 시스템 을 구축하려고한다고 가정 합니다. : 일을 단순화하기 위해 우리의 우리가 3 개 서비스 및 클라이언트에 대한 게이트웨이 API가 있다고 가정 해 봅시다 Booking, Drivers, Notification우리는 다음과 같은 워크 플로우를 가지고 :

새로운 예약을 만들 때 :

  1. 기존 사용자가 이미 예약했는지 확인
  2. 사용 가능한 드라이버 목록 가져 오기
  3. 운전자에게 예약 알림을 보냅니다.
  4. 운전자가 예약을받습니다

모든 메시지가 kafka와 같은 메시징 버스가 아닌 http 호출을 통해 수행되어 간단하게 유지한다고 가정 해 봅시다.

이 경우 Booking서비스가 기존 예약을 확인할 수 있다고 생각했습니다 . 그렇다면 누가 사용 가능한 드라이버 목록과 알림을 받아야합니까? 게이트웨이 수준에서 수행하려고 생각하고 있지만 이제 논리는 두 부분으로 나뉩니다.

  • Gateway -사용 가능한 드라이버 목록 및 알림 보내기
  • Booking -기존 예약 확인

그리고 게이트웨이가 올바른 장소가 아니라고 확신하지만 Booking서비스 에서 게이트웨이를 사용하고 있다면 밀접하게 연결되고 있다고 생각합니까?

더 복잡하게하기 위해 예약 시스템을 재사용하고 싶지만 자체 비즈니스 로직을 갖춘 다른 프로젝트가있는 경우 어떻게됩니까? 그렇기 때문에 새 프로젝트 게이트웨이가 기존 비즈니스 로직과 별도로 자체 비즈니스 로직을 가질 수 있도록 게이트웨이 레벨에서 수행하려고 생각했습니다.

그것을 수행하는 또 다른 방법은 각 프로젝트에 자체 예약 서비스가있어 핵심 예약 서비스와 대화하는 것이지만 여기서 가장 좋은 방법은 무엇인지 잘 모르겠습니다 :-)


2
전체 상황이 없으면 대답하기가 정말 어렵습니다. 그리고 이것을 아는 것조차도, 마이크로 서비스에 비즈니스 로직을 전파하는 프로젝트를 시작하는 것이 항상 좋은 생각은 아니며 일부 사람들이 "Monolith First"를 채택하는 이유입니다. 너의 어플리케이션. 이것은 나중에 만 명확 해집니다.
Dherik

답변:


14

사람들은 종종 "마이크로 서비스"를 듣고 "나노 서비스"를 생각하며, 이는 약간의 혼란을 야기 할 수 있습니다. 이들은 마이크로 서비스이므로 모든 단일 엔터티에 대해 별도의 서비스가 필요하지 않습니다. 당신이하려고하는 모든 것은 bookingnotification서비스 에 있어야 합니다. driver서비스 가 필요하지 않습니다 (설명한 활동에 대해).

예약 할 수있는 드라이버 목록을 가져 오면 booking서비스에 속합니다 . 일반적인 함정은 관련 활동을 동일한 서비스로 그룹화하지 않는 것입니다.이를 일관성이 낮으며 매우 나쁩니다. 엔티티가 아닌 문제 도메인별로 서비스를 그룹화합니다.

이제 재사용과 관련하여 별도의 마이크로 서비스를 사용하는 이점은 이제 3 개의 개별 팀이 소비자를 대상으로하는 앱을 만들 수 있다는 것입니다. 표준 html 웹 앱, Android 앱 및 iOS 앱 팀 이러한 모든 다른 응용 프로그램은 완전히 다르게 구축 될 수 있으며 반복되는 코드없이 특정 플랫폼에 적합하게 보입니다. booking세 가지 응용 프로그램 대신 자신의 예약 코드를 갖는 서비스에 전화를 걸 HTTP 때문에 서비스 코드는 이러한 애플 리케이션의 세에 의해 다시 사용됩니다.

일반적인 예약 절차는 다음과 같습니다.

  1. 안드로이드 앱은 booking서비스를 호출하여 사용 가능한 드라이버 목록을 얻습니다.
  2. 예약 서비스는 드라이버 목록을 앱에 반환합니다.
  3. 사용자는 자신의 드라이버를 선택하고 앱이의 "책"메소드를 호출 booking서비스를
  4. booking서비스 서비스는 전화 notification예약 정보와 서비스를
  5. notification서비스는 예약 그를 알리는 운전자에게 알림을 보냅니다
  6. notification고객이 1 마일 이내에있을 때 드라이버 앱이 서비스에 메시지를 보냅니다.
  7. notification서비스는 고객에게 드라이버가 거의 있다는 경고를 보냅니다.

이것이 도움이 되었기를 바랍니다. 그것들은 나노 서비스가 아닌 마이크로 서비스이며 동일한 문제 영역을 나누려고 시도하지 마십시오. 따라서 질문 제목에 대답하기 위해 마이크로 서비스를 적절한 크기로 유지하거나 해당 문제 도메인에 대한 비즈니스 로직의 전부 또는 대부분을 마이크로 서비스 내에서 유지할 수 있습니다.


1

그것은 모두 당신의 정확한 요구 사항에 달려 있습니다.

예약을 수행하는 두 가지 응용 프로그램이 있다고 가정 해 봅시다.

  1. 첫 번째 경우 : 한 응용 프로그램은 한 사용자가 여러 번 예약 할 수 있고 다른 응용 프로그램은 한 번만 예약 할 수 있습니다. 이는 예약 제한이 응용 프로그램 수준에 있다는 것을 의미합니다. 예약 시스템에 2 개의 진입 점이 있거나 (하나는 다중 예약을 허용하고 다른 하나는 허용하지 않음), 해당 관련 마이크로 서비스에서 확인해야합니다. 신청.
  2. 두 번째 경우 : 사용자가 응용 프로그램이 무엇이든 여러 개를 가질 수없는 것은 "예약"의 정의의 일부입니다.이 규칙은 전체 시스템에 적용됩니다. 즉, 예약 마이크로 서비스에 수표를 넣을 수 있습니다.

알림 시스템의 경우, 새로운 예약을 수신하기 위해 예약 서비스에 가입 한 마이크로 서비스를 가질 수 있습니다. 따라서 예약 마이크로 서비스는 모든 가입자에게 알리고 그에 따라 행동합니다.

이러한 종류의 아키텍처에서 유일한 문제는 두 개의 마이크로 서비스가 동일한 데이터베이스 트랜잭션에서 실행되는 두 개의 함수처럼 작동하지 않으므로 오류를 정상적으로 처리하고 결국에는 프로세스를 재생해야하기 때문에 알림이 게시 된 후 문제가 발생하는 경우 발생합니다. 실패한 경우 (자동 또는 수동)


0

간단한 대답은 마이크로 서비스의 클라이언트가 '순수한'마이크로 서비스 아키텍처에서 비즈니스 로직을 관리하는 것입니다. 이해하기 쉽도록 더 간단한 예를 고려하십시오. URI를 기반으로 바이트 스트림을 반환하는 서비스입니다. 그 자체로는 그다지 유용하지 않습니다. 어떤 방법으로 어떤 URI가 어떤 URI를 가지고 있는지 알지 못하면 어디에서 잡아 당 길지 추측 할 수 있습니다. 이제 검색 기능을 제공하는 다른 마이크로 서비스가 있다고 가정하십시오. 쿼리 문자열과 함께 요청을 보내면 URI를 반환합니다. 이제 상황이 더 흥미로워집니다. 첫 번째 서비스의 URI에 대한 참조를 색인에 넣을 수 있습니다.

그러나 여전히 우리는이 두 가지를 어떻게 든 조정해야합니다. 간단한 대답이 있습니다. 브라우저를 사용하여 인덱스 서비스에서 URI를 검색 한 다음 데이터 서비스에서 데이터를 검색하십시오. 어느 서비스도 다른 것에 대해 '인식'하지 않으며 그들 사이에 전혀 결합이 없습니다. 인덱스 서비스를 다른 데이터 서비스와 함께 사용할 수 있으며 그 반대도 마찬가지입니다.

이것이 모든 시나리오에서 최선의 접근 방법 일 필요는 없지만, 현재 알려지지 않은 시나리오에서 이러한 방식으로 건물을 재사용하면 많은 이점이 있습니다.

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