2017-11-23 4 views
0

마이크로 서비스 A와 B를 각각 가지고 있으며 각각은 자체 코드와 자체 데이터베이스 인 C *와 오라클을 가진 독립적 인 모듈입니다.적은 네트워크 홉으로 마이크로 서비스를 설계하는 방법

서비스 B에는 T1, T2, T3 테이블이 여러 개 있습니다.

서비스 A의 각 POST 요청에 대해 테이블 ​​T1에서만 일부 메타 정보를 얻으려면 서비스 B에 문의해야합니다. 서비스 A는 중요한 경로에 있고 트래픽이 매우 많기 때문에 모든 단일 POST 호출에 대해 서비스 B의 정보를 얻는 것이 병 목이 될 것입니다. 더 빨리 될 것 같은 정보가 캐시로부터 꺼낼 수 있도록 서비스 A의 서비스 B에서 호스팅

  1. 캐싱 데이터 - 강한 일관성이 다른 기타 비즈니스 요구 사항입니다 :

    나는 2 개 옵션의 생각 캐시에서 오래된 데이터를 사용할 수있는 위험이 있습니다.

  2. T1의 정보를 서비스 A로 완전히 이동시켜 네트워크 홉을 만들 필요가 없습니다.이 방법의 문제점은 T1, T2, T3에 영향을주는 데이터 생성 중에 서비스 B가 트랜잭션 경계를 가지므로 모든 데이터 서비스 B에서 함께 있어야합니다.

이러한 일관성 높은 일관성 시스템을 계속 설계하여 확장 할 수있는 더 좋은 방법이 있습니까?

감사 및 감사

+0

"서비스 A가 중요한 경로에 있고 트래픽이 매우 크기 때문에 POST 호출마다 서비스 B의 정보를 얻는 것이 병 목이 될 것입니다."라고 말합니다. 그 물고기는 냄새가 난다. 마이크로 서비스 아키텍처는 일반적으로 서로를 호출하는 마이크로 서비스를 포함하므로 네트워크 대기 시간이 문제가되어서는 안됩니다. 서비스 B가로드를 처리 할 때까지 더 많은 인스턴스를 추가 할 수없는 이유는 무엇입니까? 로드를 처리 할 수없는 DB라면 서비스 B가 memcache를 사용하여이를 지원할 수 있습니다. –

+0

@MattTimmermans - 답변 해 주셔서 감사합니다. 이것이 현재 아키텍처가있는 방식이며 주변의 성능 문제를 발견했습니다. 이 하나의 REST 경로에 대해서만 성능을 향상시키기 위해 중요한 경로에서 서비스 B를 제거하려고합니다. 이 시점에서 시스템을 일관성있게 유지하려면 A와 B를 모노리스로 병합하는 옵션 만 볼 수 있습니다. 그러나 더 나은 옵션이 있는지 알고 싶습니다. –

답변

0

하나의 옵션은 이벤트를 사용하는 것입니다.

서비스 B가 테이블 T1에서 데이터를 변경하면 도메인 이벤트 (메시지 브로커 또는 서비스 버스에 메시지 게시)가 발생합니다.

서비스 A는 해당 이벤트를 구독합니다. 메세지를 수신하면, 테이블 T1의 로컬 사본을 갱신합니다. 이것은 기록 시스템이 아니지만 항상 최신 상태입니다 (브로커/버스의 대기 시간과 메시지 대기열을 처리하는 시간 내에). 그런 다음 서비스 A가 데이터를 필요로 할 때 로컬 T1에서 서비스 A를 제공합니다.

이 기술 및 기타 기술에 대한 자세한 내용은 Randy Shoup의 Managing Data in Microservices, 특히 마이크로 서비스 기술 : 공유 데이터 섹션을 참조하십시오.

+0

아이디어를 제공해 주셔서 감사합니다. 그래서 기본적으로 # 2 옵션을 제안하고 데이터를 업데이트 된 상태로 유지합니다. 높은 일관성도 비즈니스 요구 사항이므로 일관성 및 대기 시간 측면에서 서비스 B를 직접 최신 상태로 유지하기 위해 로컬 복사본을 업데이트하는 것이 더 낫다고 생각하십니까? –

+0

@DevDev 글쎄, 모든 POST에서 B를 호출하는 것이 병목 현상이라고 말할 수있다. 데이터를 캐싱하지 않으면 일관성을 잃게됩니다. 어쨌든 마일리지가 다를 수 있습니다. 결과를 측정하고 요구 사항과 비교해야합니다. – TrueWill

+0

답변 해 주셔서 감사합니다. 나는 그것을 측정 할 것이다. –

관련 문제