다중 테넌트 마이크로 서비스 디자인


13

모 놀리 식 애플리케이션을 마이크로 서비스 아키텍처로 마이그레이션하는 중입니다. 일부 규제 요건으로 인해 여러 국가의 고객 데이터를 별도의 (국가 별) 데이터베이스에 보관해야합니다. 즉 미국 고객의 경우 미국 DB, 영국 고객의 경우 영국 DB ...

고려중인 다음과 같은 디자인은 다음과 같습니다.

옵션 1 : 최대 절전 모드 다중 테넌트 지원 기능이있는 다중 테넌트 응용 프로그램 (요청에 따라 N 번으로 확장 가능) (kubernetes 포드 생각). 이 응용 프로그램의 단일 인스턴스는 모든 데이터베이스에 연결할 수 있습니다.

옵션 2 : 국가 데이터베이스 당 1 개의 마이크로 서비스 인스턴스를 배포합니다. 트래픽을 라우팅하는 API 게이트웨이

이러한 유형의 시스템을 설계하려는 경우 어떤 선택을 하시겠습니까?


3
특정 기능 및 비 기능 요구 사항이 무엇인지에 달려 있다고 생각합니다.
— Robert Harvey

다른 데이터베이스이지만 동일한 인스턴스가 읽고 있습니까? 그것은 규제 요건을 위반하지 않습니까?
— Jimmy T.

옵션 1이 Microservices 아키텍처 스타일과 너무 일치하지 않는 것 같습니다.
— Laiv

Kebernetes에 대해 언급했지만 컨테이너 사용 여부는 명확하지 않습니다. Docker를 사용 하여이 작업을 수행하는 경우 (예를 들어) 데이터베이스에 연결하는 앱을 만들면됩니다. 그런 다음 컨테이너를 시작할 때 매개 변수 및 / 또는 구성을 통해 연결 세부 사항을 지정하십시오. 많은 유사한 데이터베이스에 연결되는 하나의 응용 프로그램이 있으면 잠재적 인 문제 만 발생합니다. 디자인에 좋은 점은 없습니다.
— JimmyJames

답변:


4

옵션 2는 나쁘지 않지만 필요하지 않을 수도 있습니다. 마이크로 서비스는 여러 응용 프로그램의 요구를 처리 할 수 ​​있도록합니다.

여기서 가장 큰 요인은 두 스키마간에 차이가 있는지, 앞으로 있을지 여부입니다.

일반적으로 리포지토리에 인터페이스를 사용하는 것이 불필요하다고 생각합니다. 그러나이 경우에는 노력할 가치가 있습니다. 리포지토리 팩토리가 중요합니다.

옵션 1의 문제는 너무 구체적이라는 것입니다. 설명 된 설정에서 각각 고유 한 DB를 쉽게 가리키는 두 개의 개별 인스턴스로 이동할 수 있어야합니다. 응용 프로그램이 데이터를 가져 오는 곳에서는 관리하지 않아야합니다.

스키마는 두 개의 서로 다른 데이터베이스마다 다르지 않지만 응용 프로그램에서 차이를 알지 않고도 하나의 리포지토리에서 두 가지를 쉽게 처리 할 수 ​​있습니다.

public class MyEntityRepository : ISavesMyEntity, IGetsMyEntity
{
    public MyEntityRepository(string connectionString)
    {
       _connectionString = connectionString;
    }
}

public class MyEntitySaverFactory
{
    public ISavesMyEntity GetSaver(User user)
    {
        if (user.IsUK)
            return new MyEntityRepository(Config.Get("UKConnString"));
        if (user.IsUS)
            return new MyEntityRepository(Config.Get("USConnString"));
        throw new NotImplementedException();
    }
}

//USE
ISavesMyEntity saver = factory.GetSaver(currentUser);
saver.Save(myEntityInstance);

DB 스키마가 미국과 영국간에 서로 다른 경우 기능을 완전히 다른 두 저장소로 나눕니다. 공장을 변경하기 만하면되기 때문에 쉬울 것입니다.


1
왜이 공장이 필요한지 모르겠습니다. 시작시 구성 세부 정보의 경로를 전달하지 않는 이유는 무엇입니까? 이를 통해 새로운 지역 / 국가를 추가 할 때마다 코드를 수정해야합니다.
— JimmyJames

1
여기서 문제는 다른 국가의 사용자를 다루지 않고 다른 데이터베이스를 다루는 것입니다. 다른 스키마가있는 경우 어떻게합니까? 소비 클래스가 DB 연결 문자열을 얻을 수있는 위치를 파악해야하는 이유는 무엇입니까?
— TheCatWhisperer

무슨 말인지 모르겠어요 연결 문자열을 가져올 위치를 '피겨 링'할 책임은 코드에 없습니다. 구성입니다. 왜 이것이 QA 데이터베이스와 프로덕션 구성을 사용하는 것과 다른지 알 수 없습니다. if 문을 코드에 넣지 마십시오.
— JimmyJames

이것은 두 개의 데이터베이스와 통신하는 하나의 응용 프로그램입니다.
— TheCatWhisperer

"여러 국가의 고객 데이터를 별도의 (국가 별) 데이터베이스에 보관해야합니다"단일 응용 프로그램 "인스턴스"가 두 데이터베이스와 통신하는 데 필요한 것은 아닙니다. 나는 그것이 단지 두 개의 DB인지 의심합니다. OP는 아마 "ie"를 입력했을 때 "eg"를 의미했을 것입니다
— JimmyJames

0

두 번째 옵션을 사용하면 개발 및 배포시 마찰이 줄어 듭니다.

이렇게하면 전 세계에서 하나 이상이 아닌 지역 당 1 개 (또는 하나 이상의) 인스턴스에 앱을 배포 할 때 확장 성과 가용성이 향상되고 다운 타임이없는 배포 옵션이 향상됩니다.

요구 사항이 변경되면 더 많은 지역별 비즈니스 로직과 데이터 변경 사항이있을 수 있으므로 코드와 지역별로 데이터를 분할하려고 시도하고 지역별 비즈니스 로직을 공유하지 마십시오 (일부 핵심 코드를 공유하게 될 수 있음).

말이 되나요?

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