Blog

프로젝트에 Kafka 서비스 적용

tag
기능 구현
날짜
2023/10/29
생성 일시
2023/10/30 05:51
작성자
우선 코드를 변경하기 전에 전체적인 적용할려는 시스템의 로직을 파악하자
초록을 프로듀서 연파랑을 컨슈머로 하면 되지 않을까?
전체적으로 적용을 위한 구조를 작성해 보았다.

카프카 설정

Front Kafka Config

BackEnd Kafka Config

현재는 로컬에서 테스트를 하기에 localhost로 컨슈머와 프로듀서를 설정하였습니다.
하지만 추후에 서버를 나누게 된다면 설정 파일도 변경할것입니다.

Front Kafka producer

먼저 클라이언트에서 요청을 보내는 것을 kafka 서버로 보낸는 것부터 구현하겠습니다.
원본 코드
@GetMapping("/admin/users/v2") /** * @RequestParam(defaultValue = "0") int page : page 파라미터가 없으면 0으로 설정 */ public String adminViewV2(@RequestParam(defaultValue = "0") int page, Model model, @RequestParam(defaultValue = "") String userName ,@RequestParam(defaultValue = "") String userRole, @RequestParam(defaultValue = "5") int pageSize ) { Page<User> users = userService.findUsersByUsernameAndRoleV1(userName, userRole, PageRequest.of(page, pageSize)); List<UserResponseDto> userResponseDtos = users.stream().map(UserResponseDto::new).collect(Collectors.toList()); model.addAttribute("currentPage", page); // 현재 페이지 번호 추가 model.addAttribute("totalPages", users.getTotalPages()); model.addAttribute("users", userResponseDtos); return "adminV2"; }
Java
복사
빨간 상자는 Back의 서버에서 관리하고 노란 상자는 front의 컨슈머에서 던져주는 형태로 하면 어떨까?

프로듀서 구현

프론트 컨슈머

고찰 후 변경한 서비스 구조

AdminUsersV2

프론트 Controller ( Producer & Consumer )

백엔드 Consumer & Producer

Topic

user-management-input-topic
user-management-output-topic

consumer Group Id

user-management-input-consumer-group
user-management-output-consumer-group

Config

UserBookEventApply

Front Kafka Config

BackEnd Kafka Config

Front Controller ( Producer & Consumer )

BackEnd Consumer

실제 동작확인

정상 동작 테스트

처음 신청한 딱 하나의 책 만이 신청에 성공하고 나머지는 신청이 거부되었습니다.
동시에 100명 정도가 신청하였지만 가장 먼저 신청한 한 사람만이 신청을 성공하였습니다.
> 즉 동시성 문제가 카프카를 통해 구조적으로 해결 되었습니다.