Conversation
| ddl-auto: update | ||
| show-sql: true | ||
| naming: | ||
| physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy |
There was a problem hiding this comment.
자바 클래스로 만들게되면 DB형식으로 알아서 언더스코어 넣어가며 만들어지지 않나요? 전략을 따로 설정해야하는 이유가 생긴건지 궁금합니다
There was a problem hiding this comment.
DB형식으로 알아서 언더스코어 넣어가며 만들어지지 않나요? -> 맞습니다!
전략을 따로 설정해야 하는 이유는 없습니다만, 새롭게 Master와 Slave디비를 구축하면서 혹시나 하는 마음에 추가해주었던 것입니다!
|
|
||
| @BeforeEach | ||
| void init() { | ||
| void init() throws NoSuchFieldException, IllegalAccessException { |
There was a problem hiding this comment.
DB가 분할되면서 해당 에러를 잡아줄 필요가 생긴건가요? 왜 모든 컨트롤러, 서비스에 해당 부분이 추가되는게 아니라 OrderController, StoreServiceTest에만 필요한건지? 궁금합니다
There was a problem hiding this comment.
해당 부분은 Reflection Test를 하므로써 생긴 예외처리여서 해당 Replication DB분할과는 무관합니다!
yooyouny
left a comment
There was a problem hiding this comment.
현재 코드에서는 master, slave 빈을 등록하고 routing 빈에서 설정해주고 dynamic 빈에서 lazy로 라우팅 클래스를 등록하는 코드만 보이는것 같습니다.
PR에 현재 서비스에 리플리케이션을 적용하려는 목적, 이유와 부하테스트의 유의미한 결과(응답시간도 보긴하지만 외부영향을 많이 받아 TPS=초당트랜잭션처리수를 위주로 보는걸로 알고있습니다)도 함께 나타났으면 합니다!
🎯 What is this PR
Master/Slave구조의 리플리케이션 적용
리플리케이션을 적용하는 이유 3가지
📄 Changes Made
새로운 EC2서버
(ip : 3.35.156.24)를 구축하여 해당 서버의 docker 컨테이너를 2개 띄워 하나는Master DB, 하나는Slave DB로 구성하여,읽기 요청에 대한 부하를 분산시켜 전체 성능 향상을 도모
📸 Screenshot
성능 평가
1000명0초10위와 같이 설정했을 경우 아래와 같은
TPS를 갖게 되었고, 전체적으로TPS가 높은것은 리플리케이션 적용 후로 보이며, 간혹 보이는 트랜잭션처리 수가 극도로 빠지는 구간은 로컬에서 테스트를 한것이기 때문에 보여지지, 특정되지 않은 예외사항들이 많을것으로 추측됩니다.네트워크 상의 예외도 간과할 수 없는 문제로 판단되지만, 전체적인 평균을 바라봤을 때 리플리케이션 적용을 하고 난 후에
TPS가 더 높은것으로 보여집니다.🙋🏻 Review Point
Datasource를 정의하면 스프링 부트에서 제공하는AutoConfiguration도움은 받을 수 없게 됩니다.그렇기 때문에
Master/Slave Datasource를 코드로 설정해줘야 합니다.TransactionSynchronizationManager를 통해Read / Write타입을 판별 후Datasource Type을 반환합니다.RoutingDataSourceConfig클래스에서는LazyConnectionDataSourceProxy객체를 사용하는 것을 볼 수 있습니다.Transaction생성 시점에Datasource Connection을 가져오기 때문에,항상
@Primary가 붙은Master Data를 가져오게 될 것 입니다.따라서
Transaction생성 시점이 아닌 실제로 쿼리가 발생하는 시점에Datasource Connection을 가져오기 위해서LazyConnectionDataSourceProxy을 사용하였습니다✅ Test Checklist
DataSource를 정상적으로 생성하는지Read/Write에 따른DataSource분기🔗 Reference
Issue #48