Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG/ticket] 성공/실패 요청 수 측정 오류 #19

Open
khabh opened this issue Nov 19, 2024 · 1 comment · May be fixed by #20
Open

[BUG/ticket] 성공/실패 요청 수 측정 오류 #19

khabh opened this issue Nov 19, 2024 · 1 comment · May be fixed by #20
Labels
bug Something isn't working

Comments

@khabh
Copy link
Collaborator

khabh commented Nov 19, 2024

📝 문제 설명

MemberTicketServiceConcurrencyTest에서 성공 요청 수와 실패 요청 수가 올바르게 측정되지 않는 문제가 발생합니다.

🔍 재현 방법

  1. /docker 위치에서 docker compose up 명령어로 도커를 실행합니다.
  2. MemberTicketServiceConcurrencyTest를 실행합니다.
  3. 테스트 로그를 확인합니다.

📄 에러 로그

image

💡 개선 방향

모든 스레드의 작업이 종료될 때까지 기다린 후에 로그를 출력하여 문제를 해결합니다.

@khabh khabh added the bug Something isn't working label Nov 19, 2024
@3Juhwan
Copy link
Owner

3Juhwan commented Nov 21, 2024

제보 감사합니다 😀 확인했습니다.

문제 원인

sendMultipleRequests()와 메서드를 호출하는 코드는 다음과 같습니다.

try (ExecutorService executorService = Executors.newFixedThreadPool(threadCount)) {
    sendMultipleRequests(executorService, members, ticket);
}

private void sendMultipleRequests(ExecutorService executorService, List<Member> members, Ticket... tickets) {
    AtomicInteger succeedRequestCount = new AtomicInteger(0);
    AtomicInteger failRequestCount = new AtomicInteger(0);

    for (Member member : members) {
        for (int i = 0; i < MemberTicket.MEMBER_TICKET_COUNT_MAX; i++) {
            executorService.submit(() -> {
                try {
                    memberTicketService.issue(member.getId(), getRandomTicket(tickets).getId());
                    succeedRequestCount.incrementAndGet();
                } catch (Exception e) {
                    log.error("멤버 티켓 발행 중 오류 발생", e);
                    failRequestCount.incrementAndGet();
                }
            });
        }
    }

    log.info("성공한 요청 수 : {}", succeedRequestCount.get());
    log.info("실패한 요청 수 : {}", failRequestCount.get());
}

ExecutorService를 try-with-resources를 이용해 자원을 관리하면 스레드 풀의 모든 작업이 종료될 때까지 테스트 스레드는 블록됩니다. 하지만 로깅은 try-with-resources 외부가 아닌 내부에 존재합니다. 따라서 스레드 풀의 작업과 동시에 테스트 스레드에서 로깅합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants