19,800원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨재고시스템으로 알아보는 동시성이슈 해결방법
stockservice 함수의 saveandflush 질문이 있습니다
stockservice 클래스의 decrease의 saveandflush를 synchronized를 위해 사용한 것은 이해가 갔습니다.근데 jpa를 사용할 때 값을 update할 때 더티체킹에 의해서 update가 확인이 되어 repository를 통해 save를 하지 않아도 되는걸로 알고 있는데 실무에선 save나 saveandflush를 사용하지 않고 decrease 메서드만 사용해도 될까요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
Facade를 controller 에서의 사용
안녕하세요 동시성 관련된 수업을 너무 잘 들었습니다. 위와 같이 만들어진 facade의 decrease 메서드를 controller에서 바로 사용하면 동시성 문제가 해결되는걸까요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
redisson 질문입니다.
public void decreaseStock(Long key, Long quantity){ RLock lock = redissonClient.getLock(key.toString()); try{ boolean available = lock.tryLock(60, 1, TimeUnit.SECONDS); if(!available){ System.out.println("lock 획득 실패"); return; } stockService.decreaseStock(key, quantity); }catch (InterruptedException e){ throw new RuntimeException(e); }finally { lock.unlock(); } }안녕하세요 redisson 활용에 질문있어서 드립니다.tryLock()부분의 waitTime 부분이 강의에서는 5로 설정하셨는데, 제가 강사님과 동일하게 5로 설정하면 테스트가 실패했습니다. expected: <0> but was: <41>이와 같이 실패가 떠서 timewait값을 조금씩 늘려주면서 테스트하니까 60에서는 안정적으로 성공하는걸 확인했습니다. 이부분에 대해서 질문이있는데, timewait값에 따라 성공,실패가 달라지는건 서버 환경에 따라 달라지는걸로 보면 되는걸까요?
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
네임드락 구현 시 jdbc를 활용해야한다고 하신 부분이...
새해 복 많이 받으세요. 강사님!네임드락 구현 부에서 데이터소스를 분리하라고 하신 맥락과 동일한 걸로 이해해도 될까요? jpa를 잘 몰라 엉뚱한 질문을 드리고 있는지는 모르겠습니다.해당 예제에서는 LockRepository가 Jpa 데이터 소스를 활용함으로 커넥션풀을 모두 사용하게 되면 서비스에 영향을 미칠 수 있어 jdbc를 통해 별도로 락을 걸도록 해서 본래 서비스에 영향을 주지 않도록 하라는 걸로 이해했습니다.미리 답변에 감사드립니다!
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
Propagation.REQUIRES_NEW 관련 질문드립니다.
"부모의 트랜잭션과 동일한 범위로 묶인다면 Synchronized 와 같은 문제가 발생합니다.Database 에 commit 되기전에 락이 풀리는 현상이 발생합니다." 이 부분이 잘 이해가 가지 않습니다.부모 트랜잭션이 어떤걸 말씀하시는걸까요?트랜잭션 시작, 실행, 트랜잭션 종료 (종료시 데이터베이스 커밋) 으로 동작하는걸로 알고 있습니다. 부모 트랜잭션과 동일한 범위로 묶이는 것도 무슨 말인지 모르겠고, 동일한 범위로 묶이면 왜 커밋 전 락이 풀리는지 잘 이해가 가지 않습니다 ㅠ
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
재시도가 필요하지 않은 lock
재시도가 필요하지 않은 lock이라는 설명에 대해 어떠한 예시가 있을까요?재시도가 필요하지 않은 경우가 있나 궁금합니다
- 미해결재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요. 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를 생각해서 새로운 트랜잭션을 만들어줄려고 하였는데 그렇게 하여도 정상 동작하지 않네요