subject란?

- Schema Registry는 Schema를 Subject 단위로 관리되어지는 듯 하다. 디폴트로는 <topc>-key, <topic>-value (ex: data.order-value) 형식으로 사용되지만 confluent 4.1 부터 이 부분을 커스텀마이징 할 수 있는 SubjectNameStrategy가 추가되었다.

기본적으로 사용하는 토픽이 동일하다면 동일한 subject를 보지만, 커스텀마이징 한다면 Record 에 따라 subject로 변경 가능하다.

Get the subject name for the given topic and value type.




1. 최초에 Schema Registry에 등록하고 Schema ID 를 가져오는 동작

- SR은 Cache 기반으로 동작한다 어플리케이션이 시작하면 Application SchemaRegistry는 빈 데이터만을 들고 있다.

- 처음으로 Producer 를 통해서 메시지를 발송하면 Schema 정보를 instance.getSchema() 로 가져온다.

- Registry Server로 요청을 보낸고 응답은 Schema ID로 받는다.

- Map<String, Map<Schema, Integer>> schemaCache 캐시에 등록하고 사용 한다.

- schemaCache 에서 remove 되는 endpoint 는 없다. 즉, 한 번 캐싱이 된다면 다시 호출 되지는 않을 것이다. (어플리케이션에 실행중 instance.getSchema가 변경이 될리는 없기 때문이다)


2. Application이 자동으로 Schema ID를 올리는 것을 막는 방법

- SR 서버 자체의 호환 모드를 NONE 으로 해 되지만 클라이언트 설정에서 auto.register.schemas(default true)를 false로 해도 된다. 이럴 경우 SchemaRegistry RestClientException 이 발생되면서 정상적인 produce가 안된다.




결론

- (avsc에 의해 생성되는) org.apache.avro.specific.SpecificRecord 를 구현하는 인스턴스의 SCHEMA$ 를 가지고 Schema ID를 등록하거나, 내부적으로 캐싱해서 사용한다.

- 이 문자열이 캐싱된다면, 최초의 Produce 할 때만 SR 서버를 호출한다. (즉 이 문자열이 바뀔일이 없기 때문에 1개의 subject당 1번이 호출될 것이다)

- BACKWARD 인지 FORWARD 인지는 순수하게 SR 서버쪽의 담당이다. 클라이언트는 단지 auto.register.schemas: false로 설정함으로써 자동 등록을 해제 할 수 있을 뿐이다.



nebula 를 이용한 integration test 분리

분류없음 2018.05.18 07:57 posted by dev.bistro

테스트를 진행함에서 있어서 unit test와 integration test를 분리하고 싶은 니즈가 많다. junit5를 이용한다면,  Tag로 쉽게 처리 가능하지만 ( https://junit.org/junit5/docs/5.0.2/api/org/junit/jupiter/api/Tag.html )  레거시 프로젝트들 대다수가 junit5를 사용하지 못한다.

그래서 보통은 https://selimober.com/gradle_unit_integration/ 이러한 방법으로 처리하는데  nebula plugin을 이용하면 쉽게 처리 할 수 있다.


nebula facet : https://github.com/nebula-plugins/nebula-project-plugin


1. src/test/java 에는 unit-test만 남겨놓고 나머지는 src/integTest/java 에는 인테그레이션 테스트를 위치시킨다.
(디렉토리 변경 가능할줄 알았으나 고정되어 있다)

2. buildScript 부분에 아래와 같이 nebula.facet 의존성 추가와 plugin 설정을 한다.

buildscript {
...
dependencies {
...
classpath "com.netflix.nebula:nebula-project-plugin:3.4.1"
}
} apply plugin: 'nebula.facet'


3. 다음과 같은 가장 기본적인 설정을 추가한다. 

facets {
integTest {
}
}


4. 프로젝트를 reload 하면 'integTest' 라는 gradle-task가 생긴것을 확인 할 수 있다.



이 때의 문제점은 test-report 가 2개가 생긴다는 것이다. (test와 integTest) 이 2개의 리포트를 합치고자 하는 이슈가 있을때에는 아래처럼 TestReport 관련 task를 하나 추가하면 된다.

task testReport(type: TestReport) {
destinationDir = file("$buildDir/reports/combined")
reportOn test
reportOn integTest
}