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

Feat/#134 LogQueue의 부하를 감소하도록 Producer Consumer 구조로 최적화 #135

Merged
merged 12 commits into from
Aug 29, 2024

Conversation

miiiinju1
Copy link
Member

@miiiinju1 miiiinju1 commented Aug 28, 2024

🚀 작업 내용

  • LogQueue의 동기화 메커니즘 최적화
    • consume() 메서드에 대해 consumeLock 객체를 사용한 동기화 구현
    • produce() 메서드의 동기화 제거로 불필요한 락킹 방지
    • consume() 메서드의 대기 로직을 do-while 루프로 변경하여 spurious wakeup 방지
    • produce() 메서드에서 consumeLock.notify() 호출로 정확한 스레드 깨우기
    • 전반적인 동시성 처리 개선으로 생산자와 소비자 간 효율성 향상

📸 이슈 번호

👀 Focus Commits [Optional]

  • 커밋해시: 내용

✍ 궁금한 점

  • 중점적으로 봐줄 내용
  • 변수명 괜찮나요
  • 로직이 좀 더럽나요
  • 가독성이 좀 그런가요?

miiiinju1 and others added 9 commits August 27, 2024 20:51
- consume() 메서드에 대해 consumeLock 객체를 사용한 동기화 구현
- produce() 메서드의 동기화 제거로 불필요한 락킹 방지
- consume() 메서드의 대기 로직을 do-while 루프로 변경하여 spurious wakeup 방지
- produce() 메서드에서 consumeLock.notify() 호출로 정확한 스레드 깨우기
- 전반적인 동시성 처리 개선으로 생산자와 소비자 간 효율성 향상
- LockSupports를 활용한 Thread lock방식을 적용했습니다.
- `volatile Thread consumerThread`에 대한 VarHandle을 적용했습니다.
- Producer, Consumer 방식을 적용해 리팩토링을 진행했습니다.
- 이에 따라 사용하지 않는 테스트를 Deprecated 처리했습니다.
- LogQueue에 대한 Java-Doc을 추가했습니다.
- 사용하지 않는 메서드에 대한 Deprecated 처리를 진행했습니다.
- AsyncLogProcessor에 대한 JavaDoc를 작성했습니다.
- `Consumer` -> `EventConsumer`, `Producer` -> `EventProducer` 이름 변경을 진행했습니다.
- 패키지 위치를 변경했습니다.
- Deprecated 된 테스트를 제거했습니다.
@miiiinju1 miiiinju1 self-assigned this Aug 28, 2024
Copy link

github-actions bot commented Aug 28, 2024

Risk Level 2 - /home/runner/work/Team5-Guys/Team5-Guys/logbat/src/main/java/info/logbat/domain/log/application/LogService.java

Consider handling specific exceptions instead of a generic Exception in the catch block. This improves error handling and debugging. Example:

} catch (SpecificException e) {
    log.error(\"Specific error occurred: {}\", request, e);
}

Risk Level 3 - /home/runner/work/Team5-Guys/Team5-Guys/logbat/src/main/java/info/logbat/domain/log/queue/LogQueue.java

The implementation of the consume method could lead to potential performance issues due to busy waiting. Consider using a more efficient waiting mechanism. Example:

while (queue.isEmpty()) {
    LockSupport.parkNanos(timeoutNanos);
}

Risk Level 3 - /home/runner/work/Team5-Guys/Team5-Guys/logbat/src/main/java/info/logbat/domain/log/queue/ReentrantLogQueue.java

The consume method should handle InterruptedException more gracefully. Instead of throwing a RuntimeException, consider restoring the interrupt status. Example:

} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}

🔍⚠️🔧


Powered by Code Review GPT

Copy link
Member

@tidavid1 tidavid1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정합성 이슈가 터졌네요... 해결해봅시다 :C

Copy link
Member

@LuizyHub LuizyHub left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정합성 같이 손봐요!

@LuizyHub LuizyHub merged commit b11d0b3 into dev Aug 29, 2024
1 check passed
@tidavid1 tidavid1 deleted the feat/#134 branch August 29, 2024 01:08
LuizyHub added a commit that referenced this pull request Aug 29, 2024
* feat: LogQueue의 동기화 메커니즘 최적화

- consume() 메서드에 대해 consumeLock 객체를 사용한 동기화 구현
- produce() 메서드의 동기화 제거로 불필요한 락킹 방지
- consume() 메서드의 대기 로직을 do-while 루프로 변경하여 spurious wakeup 방지
- produce() 메서드에서 consumeLock.notify() 호출로 정확한 스레드 깨우기
- 전반적인 동시성 처리 개선으로 생산자와 소비자 간 효율성 향상

* fix: process 시 락 범위 감소하도록 변경

* fix: Primary를 LogQueue로 이동

* refactor: LogQueue 동작 로직 수정

- LockSupports를 활용한 Thread lock방식을 적용했습니다.
- `volatile Thread consumerThread`에 대한 VarHandle을 적용했습니다.

* refactor: AsyncLogProcessor

- Producer, Consumer 방식을 적용해 리팩토링을 진행했습니다.
- 이에 따라 사용하지 않는 테스트를 Deprecated 처리했습니다.

* docs: Java-Doc 추가

- LogQueue에 대한 Java-Doc을 추가했습니다.

* chore: Java-Doc및 사용하지 않는 메서드 Deprecated 처리

- 사용하지 않는 메서드에 대한 Deprecated 처리를 진행했습니다.
- AsyncLogProcessor에 대한 JavaDoc를 작성했습니다.

* chore: 패키지 이동 및 클래스 이름 변경

- `Consumer` -> `EventConsumer`, `Producer` -> `EventProducer` 이름 변경을 진행했습니다.
- 패키지 위치를 변경했습니다.

* remove: 사용하지 않는 테스트 제거

- Deprecated 된 테스트를 제거했습니다.

* refactor: VarHandle 제거

- volatile 키워드 로 충분히 가시성이 보장

* fix: ReentrantLogQueue에 대해 producer와 consumer간의 경쟁 제거

* fix: LogQueue process 시 RentrantLogQueue를 사용하도록 변경

- LogQueue 비활성화

---------

Co-authored-by: KyungMin Lee <[email protected]>
Co-authored-by: luizy <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants