19,800원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요. NamedLock Test시 namedLockStockFacade.decrease()가 타지 않습니다.
테스트 결과제목 그대로 NamedLock Test를 진행할시 감소가 전혀 되지 않게 되어 실패로 뜹니다. 디버그로 체크해보니 namedLockStockFacade.decrease()가 타지 않더군요.수업 내용 그대로 진행했고 선생님 소스도 보면서 했는데 뭐가 문제인지 모르겠습니다. 소스 공유 : https://github.com/mooh2jj/stock-transaction-test.git
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
LettuceLockStockFacadeTest를 다시 실행하면 왜 실패가 날까요?
test가 정상으로 처리되어 redisson을 추가하여 test하였습니다.RedissonLockStockFacadeTest는 이상이 없는데LettuceLockStockFacadeTest를 재시도 한 결과 실패가 됩니다.원인을 찾아보려고 다 다시 만들어봤지만 동일한 이슈가 발생하여습니다. 무엇이 문제일까요?redisson의 종속성을 삭제하고 돌리면 이상이 없음을 확인하였습니다. LettuceLockStockFacade 컴포넌트 와RedissonLockStockFacade 컴포넌트는 함께 사용할 수 는 없나요?또한 그 이유가 무엇인가요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
동시성 이슈 질문
안녕하세요. 동시성 이슈를 synchronized 키워드를 사용하지 않고 해결해보려고 했었는데요.MySQL InnoDB의 default level은 repeatable_read로 알고 있어서 한 단계 더 높은 수준인 serializable로 설정하면 동시성 이슈를 해결할 수 있을거라 생각을 했었는데요. 그래도 동시성 이슈가 발생하더라구요..@Transactional(isolation = Isolation.SERIALIZABLE) public void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(stock); }제가 뭘 놓치고 있을까요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
순서가 있는 재시도일 경우에도 redisson을 사용하나요?
redis channel을 구독하고 있는 스레드가 있어서 락을 획득하지 못한 스레드들이 요청이 실패하게될텐데 1 -> 2 -> 3 -> 4번 순서대로 요청이 들어왔을 때 1번이 2,3 번 요청이 들어왔을 때까지 락을 들고 있는 경우에는 다음 락은 4번에게 넘어가는데 선착순처럼 순서를 보장해야하는 경우는 어떻게 해야할까요>>혹은 이런 상황에서는 redis 사용으로 해결하려는게 잘 못된 접근 방식인가요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
decrease 쪽 메서드 안타는 이유,,?
콘솔 찍어봐도.. 여기까지 오질 않는 이유가 궁금합니다.. 느낌상으론 executorService 쪽에서 뭔가.. 안되는 느낌인데 ㅠ 원인을 모르겠네요
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
쓰레드
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.테스트코드에서 쓰레드풀을 32개로 지정했는데 보통 CPU 코어 + 1 이 이상적인 쓰레드풀이라 들었는데 32로하신이유가있을까요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요~~ 레디슨관련 질문 드립니다!
레디슨을 이용하여 락을 획득할 때lock.tryLock 메서드 내부에서 현재 lock 이 걸려있는 상태이면 여기서 wait 상태로 스레드를 기다리는 상황인 건가요?그렇다면 available의 결과가 false 가 된 상태는락을 계속 얻으려고 시도하다가 결국 못받은 상황이라고 이해해도 될까요?마지막으로 지금은 void 로 레디스 테스트를 위해 리턴값은 따로 지정하지 않았는데 만약 실무에선 해당 상황에선 보통 어떤 값을 리턴해주는게 좋을까요? 추가로..개인적인 프로젝트에 해당로직을 사용하여 레디슨으로 Lock 을 건 상태에서 동일하게 테스트 코드를 작성하였습니다.초기 전체 카운트를 저장한 후에 스레드 내부에서 동일한 수량으로 감소하는 로직으로 작성하였지만,스레드 내부에서 findBy 한 엔티티의 수량이 모두 초기값으로 동일하게 나타나는 현상이 나타났습니다.. 이럴경우 lock이 제대로 이뤄지지 않은 상태로 된것일까요 아니면 스레드 테스트 환경을 잘못 작성한 것일까요... 추가 질문에 대한 개인적인 해결방안을 찾았습니다.. 레디슨 락에대한 메서드에 Transactional 어노테이션을 작성했더니 위처럼 동작하는군요... Transactional 어노테이션이 Redisson에 어떤 영향을 주었던 걸까요...
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
실무에서는 어떠한 방식을 선호하나요?
실무에서 mysql lock을 사용하면 퍼포먼스부분에서 우려가 되는데요~실무에선 redis를 사용한 동시성 제어를 주로 하나요?실제로 실무에서 어떠한 방법으로 동시성을 처리하는지 궁금합니다!!
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
DB lock에 대해
트래픽이 많은 앱을 개발하는 중에서는 어떤걸 쓰는게 효율적일까요?? pessimistic lock을 사용한다고 치면 시간이 오래걸려서 다량의 트래픽에서는 불리할까요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
강의에서 배운 수단들은 모두 분산락이라고 할 수 있을까요?
여러대의 서버가 존재할경우 어플리케이션단에서 동시성을 보장할 방법이 없게되고 DB, redis 등 다른 수단을 사용하여 동시성을 보장해야 한다고 알고 있습니다.분산락이란 여러서버에서 공유된 데이터를 제어하기 위해 사용하는 기술이라고 하는데그러면 강의에서 배운 mysql의 pessimistic lcok, optimistic lock, named lock 과 redis의 redisson, lettuce 라이브러리를 이용한 lock 모두 분산락이라고 할 수 있을까요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
낙관적 락도 스핀락이라고 봐야 할까요?
안녕하세요 먼저 좋은 강의 만들어 주셔서 감사합니다. 낙관적 락을 보고 궁금한 점이 생겨서요! lettuce의 스핀락과 굉장히 유사하다는 느낌을 받았는데 낙관적 락에선 스핀락을 언급을 안하시더라구요. 로직만 보면 락을 얻으려 계속 시도하는게 비슷해보이는데 낙관적 락은 직접적으로 락을 거는 게 아닌 버전으로 관리를 해주기 때문에 스핀락이라고 볼 수 없는 건가요?
- 해결됨재고시스템으로 알아보는 동시성이슈 해결방법
동시 저장 문제
안녕하세요 동시 저장 관련하여 질문드립니다.예약 관련하여 프로젝트를 진행하고 있는데 db에 없는 데이터를 삽입을 해야하는데동시에 여러 쓰레드가 아래의 servicer계층의 reserve()를 호출하여 예약을 시도할 때 이 메서드의 호출을 하나씩만 처리하기 위해서@Transactional public void reserve(ReserveRequest reserveRequest) { boolean isExistsReservation = reservationRepository.existsByStartTimeAndEndTime(~~~); if(!isExistsReservation) { reservationRepository.save(~~~); } }named lock을 사용하여 key를 월+일(1124)와 같이 만들어서 해당 날짜의 예약에 대해서 하나씩만 처리되도록 하여 중복을 막는 방법도 괜찮을까요?1번 방법을 사용하지 않고 다른 방법이 있을까요?service계층의 reserve메서드의 @Transactional의 격리수준을 조절해서도 해결 가능할까요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
Synchronized 문제점 파트 듣다가 질문 드립니다.
먼저 좋은 강의 감사드립니다.프로세스 = 실행 중인 프로그램 (혹은 어플리케이션) 이라고 이해했는데요. 실무에서 서버 N대를 사용한다고 할 때, 이는 프로세스의 개수와도 같은 말일까요? EX) Synchronized 는 하나의 프로세스 안에서 보장된다 -> 서버가 n대일 때는 프로세스도 n개 이다.단일 서버 환경은 프로세스가 여러개 일 수 없는 건지, 서버와 프로세스의 개념이 헷갈려서 여쭙습니다.
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
낙관적 락 롤백이 필요할 경우 처리 방법에 대해 질문 드립니다.
낙관적 락을 사용하는 facade에 @Transcation을 붙일 경우 롤백이 되지 않는 문제가 있는데 이럴 때는 어떻게 처리해 주어야 할까요?예를 들어 List<Strock> stockList를 만들어서 모두 재고를 -100을 하는데 중간에 1개의 Stock이라도 재고가 부족할 경우 Rollback을 할려고 합니다.이 때 낙관적 락을 사용하면 @Transcation을 사용할 수 없어서 Rollback을 할 수 없는 문제가 있습니다. 이러한 문제를 해결할려면 어떻게 접근하면 좋을까요?해결방법으로 트랜잭션의 전파를 Required_new를 생각해서 새로운 트랜잭션을 만들어줄려고 하였는데 그렇게 하여도 정상 동작하지 않네요
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요 강사님 Lock관련 질문 드립니다.
H2 혹은 Mysql DB를 사용할때트랜잭션 기본 격리 수준에 의해 트랜잭션이 걸린 메서드 에서 JPA에서 제공하는 findById()메서드를 통해 엔티티를 조회한다면, 별도의 락 모드를 걸지 않아도 S Lock은 걸리지 않나요? 다른 스레드에서 수정을 위한 XLock을 걸 수 없지 않나요? 동시성 문제를 해결하다가 고민이 생겨 질문 드립니다.또 그렇다면 select로 엔티티를 조회하고, 해당 엔티티의 재고를 update 하는 사이에 Lock이 걸리게 되는걸까요??
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
Mysql 서버가 여러대인경우
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.여기서 말씀하신 Mysql Lock 잡는 방식으로 동시성 문제 해결이 되나요 ? 아니면 Redis 등 외부 서버를 이용할 수 밖에 없나요 ?
- 해결됨재고시스템으로 알아보는 동시성이슈 해결방법
낙관적 락 무한루프 도는 이유 공유합니다 !
MySQL을 사용한다면 Isolation Level이 REPEATABLE READ가 기본으로 설정되어 있는데요. 이 때 트랜잭션 안에서 처음 SELECT한 값은 트랜잭션이 끝나기 전까지 몇 번을 다시 SELECT해도 동일한 값으로 읽게 됩니다. 이것 때문에 문제가 발생하는데요...트랜잭션 안에서 낙관적 락이 진행되도록 구현한 상황에서 쓰레드 100개가 동시에 재고를 감소 시키고, 업데이트에 성공하면 version을 1씩 증가시킨다고 해보겠습니다. DB에는 Stock이 100개 version이 1로 세팅되어 있다고 가정합니다.@RequiredArgsConstructor @Service public class ProductService { private final ProductRepository productRepository; @Transactional public void subtractStockOptimistic(int productId, int quantity){ int updatedCount = 0; while (updatedCount == 0){ Product product = productRepository.findById(productId); product.subtractStock(quantity); updatedCount = productRepository.updateStockOptimistic(product); if (updatedCount <= 0) { //업데이트에 실패한 경우 50ms 대기 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } } } <update id="updateStockOptimistic"> update test_product set stock = #{stock}, version = version + 1 where id = #{id} and version = #{version} </update>쓰레드 100개는 처음에 재고를 읽어서 모두 다음 값을 받아옵니다.stock : 100, version : 1제일 빠른 트랜잭션이 업데이트를 성공하고 DB는 다음과 같이 변합니다.stock: 99, version: 2이제 나머지 99개의 트랜잭션은 version이 다르므로 모두 업데이트에 실패하게 됩니다.업데이트에 실패하게 된 트랜잭션들은 재시도를 하게 됩니다.이 때 DB에서 다시 읽어드린 재고는 stock: 99, version: 2일 것 같지만 실제로는stock: 100, version: 1 를 읽게 됩니다.왜냐하면 여전히 하나의 트랜잭션 안에 들어 있고, Isolation Level이 REPEATABLE READ로 처음 읽은 값을 계속 읽게 되기 때문입니다.따라서 첫 트랜잭션을 제외한 모든 트랜잭션은 무한히 실패하게 됩니다.......따라서 한 트랜잭션 안에서 업데이트와 재시도 로직이 진행되지 않도록 @Transactional을 메소드에서 떼주시면 정상 동작하게 됩니다.혹시 정말 Isolation Level 때문인지 확인하고 싶으신 분들은 DB에 Isolation Level을 READ COMMITTED로 바꾸고 테스트를 진행해보시면 @Transactional이 붙어 있어도 정상 동작하는 것을 확인하실 수 있습니다~!
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
퍼사드 패턴
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강사님. 좋은 강의 잘 들었습니다.예시 작성에서 퍼사드 패턴을 사용하시던데, 퍼사드 패턴은 복잡한 비즈니스로직을 단위 서비스를 모아서 실행하는 디자인 패턴으로 이해하면 될까요? 해당 디자인 패턴을 언제 사용하면 효율적인지 궁금합니다.
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
동시성 질문있습니다!
안녕하세요 좋은 강의 잘들었습니다.동시성 관련 공부하다보니 헷갈리는 부분이 있어서 질문드립니다.답변 부탁드립니다 :)java에서는 동기화를 제공하기위해 synchronized와 volatile, 아토믹 클래스를 이용해서 동시성을 보장한다고 알고있습니다. 근데 이게 단일 서버 싱글 코어 환경에서만 국한되는 내용이구요, 반면에 단일 서버 멀티 코어 환경에서는 아토믹클래스로 데이터의 가시성 및 원자성을 보장해주는것으로 알고있습니다. 그렇다면 분산서버 환경에서는 싱글코어든 멀티코어든 어플리케이션단에서는 동시성을 보장할 방법이 없게되고, 강의에서처럼 디비락을 통하여 동시성을 보장하는 방법이 정답이라고 이해하면 될까요?두번째 질문은 분산서버 관련 내용이긴한데요, 요요즘 많이 사용하는 msa 서버 환경에서 비즈니스 도메인 단위로 서버를 두는것으로 알고있는데, 그렇다면 재고관리에 대한 로직은 한대의 서버에 담아 두게되고, 디비락 없이 자바동기화 방법으로도 해결이 될 것같은데 속도적인 측면에서 redis를 사용하는것일까요? 아니면 기업마다 인프라를 구축하는 방법이 다른 부분일까요?
- 해결됨재고시스템으로 알아보는 동시성이슈 해결방법
네임드락 timeout 시간은 어느정도가 적당할까요?
강의에서는 3000초로 하셨는데 특별한 이유가 있을까요? 짧게 주었을 경우 락이 풀려서 동시성 문제가 발생할 수 있을 것 같고, 무한정으로 줘버리면 음.. 하나의 커넥션이 뭔가 문제가 생겨서 realse_lock을 못할 경우 나머지 모든 커넥션이 대기타게 되서 장애로 이어질 수 있을 것 같은 생각이 들기도 합니다. 강사님은 어떻게 생각하시나요?