여러 마이크로 서비스에서 교차하는 데이터 검색


13

마이크로 서비스와 레거시 데이터베이스간에 분산 된 특정 도메인에 대한 데이터가 있습니다. 레거시 데이터베이스와 마이크로 서비스 데이터베이스의 필드를 모두 포함하는 검색이 있습니다. 이전 (마이크로 서비스 분할 전)에는 1 개의 SQL 쿼리로 수행되었습니다. 이제이 검색 기능을 제공하기 위해 REST 호출과 레거시 데이터베이스에 대한 쿼리가 필요합니다. 우리는 여기서 몇 백만 행에 대해 이야기하고 있습니다. 이것을 어떻게 가장 잘 모델링 할 수 있습니까? 많은 양의 데이터로 인해 REST 호출은 일반적으로 페이지 매김 결과를 반환합니다. SQL 호출을 발생시키고 결과를 REST 응답과 결합 및 병합하는 순진한 접근 방식은 너무 느리고 실제로 실용적이지 않습니다.

답변:


21

검색 기능은 언급 한 두 서비스와 별도의 책임이있는 별도의 서비스로 모델링 될 수 있습니다. 따라서 여기에 접근하는 방법은 새로운 서비스 ( '검색')를 작성하고 두 서비스의 데이터 사본을 색인화 및 검색하기 쉬운 형식으로 저장하고 결과를 신속하게 제공하기 위해 비정규화할 수 있습니다. 원하는 형식

따라서 예를 들어 mySql을 사용하는 레거시 SQL 데이터베이스, MongoDB를 사용하는 다른 마이크로 서비스 및보다 편리한 액세스를 위해 이미 함께 붙여 넣은 (비정규 화 된) 데이터를 가진 elasticsearch를 사용하는 새로운 검색 서비스를 사용할 수 있습니다. 물론 세부 정보는 수행해야하는 검색 종류에 따라 다릅니다.

두 서비스의 데이터는 처리량을 늘리고 서비스 간 연결을 줄이기 위해 Kafka 또는 Hermes와 같은 이벤트 버스를 통해 검색 색인에 비동기식으로 전송하는 것이 가장 좋습니다. 두 서비스 중 하나를 변경하면 검색 서비스에 데이터를 업데이트하도록 알리는 이벤트가 전송됩니다.

물론 서비스와 검색 서비스의 변경 사이에 추가 지연 비용이 발생하지만 마이크로 서비스는 일반적으로 분산 된 시스템에서 사용되므로 일부 지연과 일시적인 불일치는 피할 수 없습니다. 추가 서비스가 있고 이미 다른 두 서비스에있는 데이터 사본에 추가 스토리지를 사용하는 것은 마이크로 서비스를 사용하여 고도로 분산되고 확장 가능한 시스템을 갖추는 데 드는 전형적인 비용이기도합니다.


이미 별도의 서비스를 만드는 것에 대해 알고 있습니다. 나에게 약간의 불편 함을주는 것만 – 검색을위한 또 다른 데이터베이스를 생성하는 것 (탄력성을 제공하는 것은 또 다른 옵션이지만, 우리에게는 인프라 병목 현상이있다)
senseiwu

7
@zencv 불행하게도, 마이크로 서비스는 이와 같은 비용이 듭니다. 수평으로 확장 할 수 있다는 것은 커플 링이 약해야 함을 의미하며 이는 종종 데이터 복제가 발생 함을 의미합니다. 또한 훨씬 더 많은 네트워크 트래픽이 발생합니다. 확장 성은 종종 하드웨어 단위당 성능 저하를 의미하며 다른 아키텍처 (예 : 마이크로 서비스 대 모노리스)를 통해 하나의 아키텍처를 선택하면 이러한 상충 관계를 고려해야합니다.
Michał Kosmulski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.