Stream이 무한정 늘어나는 것을 방지하면서도 각 Restaurant 별 예약 요청을 최대한 분리해서 처리하기 위해 아래와 같은 기획사항을 도입하였다.
Spring 실행 시 설정값(고정된 수)만큼의 Stream 생성
1-1. 생성되는 Streams의 이름은 reservation-create-N가 됨
각 Consumer들은 모든 Stream에 구독
Producer가 Message 발행 시 요청 객체의 restaurant id가 전체 restaurant의 count 값 중 어느 partition에 속하는지 확인
3-1. Math.ceil([restaurant Id] * [stream number] / [restaurant count])
값을 기반으로 발행할 Stream을 결정
3-2. 발행 전 publisher가 restaurant count 값을 조회하도록 함
a. [count 조회] → [메시지 발행] 과정 중간에 restaurant 추가/삭제되어서 count 값이 바뀌어도 사용하게 될 메시지 큐만 조금 달라지기에 큰 문제는 없다고 판단함
요약하자면, Stream 별로 담당하는 Restaurant들을 나누도록 구현해 특정 식당에 예약이 몰릴 경우 다른 식당 예약에 대한 영향을 최소화하도록 구현하였다.
partitioning 적용 전과 성능 측면에서 어떤 차이가 있는지 비교 테스트를 진행해보았다.
partitioning 적용 전
적용 후
여러 식당들에 예약하는 시나리오 기준 속도가 1.7배 정도 향상되었다.