작성
·
589
·
수정됨
0
안녕하세요. 선생님 강의 들으면서 실무에 Spring Batch를 잘 녹여보고자 노력하고 있는 직장인입니다.
다름이 아니라 부서에서 Spring Batch를 활용해 배치의 성능을 높여야 하는 상황이라, 스케일 아웃을 고려하고 있는데요.
문제는 스케일 아웃을 하되 워커(혹은 슬레이브) 서버에서는 DB에 접근을 하지 못하는 상황이라, read-process-write의 구조에서 read/write는 마스터 서버에서 처리 해야 하는 상황입니다.
그래서 처음에는 AsyncItemProcessor/AsyncItemWriter를 활용하여, 마스터 프로세스에서 워커 서버들에 HTTP API를 호출하고 결과를 리턴 받으면 write를 하는 방식을 고려 했는데요.
그런데, chunk 단위로 순차적으로 read-process-write를 하다보니 기대보다는 성능이 안나오고 있습니다 😭 사실 기대했던 바는 process를 하고 있을 때 read/write도 동시에 진행되면 어떨까였습니다. (이 부분이 혹시 잘못됐다면 지적해주세요.)
그래서 든 생각이 read-process-write가 chunk 단위로 순차적으로 되는 진행되는 것이 아니라, reader와 processor와 writer가 서로 publisher-subscriber 구조로 개별적으로 동작하는게 어떨까라는 생각이 들었습니다.
조금 더 말씀드리면 reader가 파일을 읽어 큐에 넣고 processor는 큐의 데이터를 읽어 처리하고 writer가 보고 있는 queue에 넣으면 writer가 해당 큐를 참조하여 파일 write를 하는 방식입니다.
혹시 이 아이디어에서 제가 잘못 생각하고 있는게 있을까요? 아니면 기존의 chunk oriented tasklet을 손보면 말씀드린 것과 같은 구조를 만들 수가 있나요?
답변 1
0
네
말씀하신 구조로 구성하기 위해서는 저의 강의에 보시면 스프링 배치 멀티 스레드 프로세싱 > Partitioning 챕터가 있는데 이 부분을 참고해서 적용하시면 될 것 같습니다.
물론 queue 를 사용한 방식으로 하기 위해서는 별도의 로직을 구현해야 하겠지만 기본적으로는 reader, processor, writer 가 chunk 객체를 가지고 있으면서 스레드별로 처리를 하는 방식입니다.
chunk 에는 List 속성이 있기 때문에 사실상 queue 의 역할을 한다고 보시면 됩니다.
아직 해당 강의를 학습하지 않았다면 먼저 보신 후에 설계하시는 것을 권해 드립니다.