묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
Redisson - 100개의 스레드가 동시에 tryLock을 호출하나요?
[Redisson을 활용하여 재고로직 작성하기] 강의 수강 후 궁금한 점이 있어 질문드립니다.100개의 스레드가 동시에 재고 감소를 시도하면, 모든 스레드가 동시에 trylock으로 락 획득을 요청하는 건가요? 그렇다면 waitTime이 15초 leaseTime이 1초인 경우, 16번째 스레드부턴 락을 획득할 수 없을 거라고 예상했는데 테스트는 통과하여 질문드립니다.stockService.decrease 작업이 1초보다 덜 걸려서 이게 가능한 건가요?
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
response 객체에서 키값으로 조회 시 KeyError 발생
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요,강의 2:17 부분을 보면서 따라해보고 있는데 아래 부분에서 KeyError가 발생합니다.items = result["items"] 구체적인 에러 메시지는 다음과 같습니다result 객체의 키값만 조회해보면 items가 정상적으로 존재하고, reult의 타입도 dict 형태로 나오는데 왜 keyerror가 발생하는걸까요..?
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
py_ad_2_5_2 Sharing State의 Argument 부분
Sharing State의 두번째 예제 Value 객체를 다루는 부분에서 generate_update_number 함수에서 전달 받는 인자가 첫번째 예제와 같이 v: int라 명시되어 있습니다.하지만 함수 내부에선 v는 Value 객체로 활용되는데, 여전히 잘 동작하는 이유는 파이썬이 자동적으로 캐스팅 해주기 때문인가요? 아니면 다른 이유가 있는건가요?그리고 만약 교정이 필요하다면 함수 인자 Type Hint 표기 시 어떻게 해주어야 할까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
MySQL named lock과 redis를 사용한 분산락 구현의 차이점
안녕하세요 강사님, 유익한 강의 잘 듣고 있습니다. 😀강의를 듣던 중 분산락을 구현하는 더 좋은 방법이 무엇일지 궁금해서 질문 남깁니다.강의 중에선 MySQL named lock이 트랜잭션 종료 시 수동으로 락을 반환해야한다는 점 때문에 관리가 어렵다는 단점이 있다고 언급하셨는데요, 레디스를 사용했을 때와 비교해서 named lock이 분산락을 구현하는데 있어 더 불리한 점이 있나요? 구글링을 좀 해봤는데 네임드락은 클러스터 환경에서 분산 락 제공이 불가능하고, 추가로 zookeeper 같은 분산락 관리자를 사용해야한다고 하는데.. 잘 이해가 안되어서 여쭤봅니다. 오히려 기존에 MySQL을 사용하고 있다면 네임드락을 사용하는게 레디스 추가 비용 없이 분산 락을 구현할 수 있는 방법이라는 생각이 드는데요, 강사님은 어떻게 생각하시는지 궁금합니다. 참고로 제가 읽었던 분산락 관련 블로그 주소입니다. https://velog.io/@this-is-spear/MySQL-Named-Lock
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
@Transactional과 synchronized를 같이 써도 동시성 테스트가 통과 돼요
강의 보면 통과가 안되는데 저는 테스트 코드를 돌려보면 통과하게 됩니다. 왜그런건가요??
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
강의보고 토이프로젝트로 재고감소 낙관적락 기법 적용 질문
안녕하세요 강사님 강의를 보고 토이 프로젝트에서 주문 시 재고 감소 및 메뉴 주문량 증가 로직에서 낙관적락 기법을 적용해 보았는데요, 강의에서 해주신 내용 그대로 파사드 패턴 까지 적용을 해보면서 시도했는데 무한 루프가 돌았습니다.hikariCP pool을 40으로 설정해주니 그제서야 해결이 되었는데요, 강의에선 네임드락에서 커넥션풀을 지정해주었는데요 저는 낙관적락인데도 해당 설정을 해서 해결된 이유가 있을까요?@Service @RequiredArgsConstructor public class OrderService { @Transactional public Order orderWithOptimisticLock(Long memberId, LocalDateTime now) { Cart cart = cartRepository.findByMember(memberId); List<CartItem> cartItems = cart.getCartItems(); cartItems.stream() .map(CartItem::getMenu) .forEach(menu -> { decreaseStockWithOptimisticLock(menu.getId(), 1); increaseMenuOrderCountWithOptimisticLock(menu.getId(), 1); }); Money money = calculator.calculateMenus(cart.getMember(), cart.convertToMenus()); Order order = Order.createOrder(cart, money, now); return orderRepository.save(order); } public void decreaseStockWithOptimisticLock(Long menuId, int quantity) { Menu menu = menuRepository.findByIdForOptimisticLock(menuId); menu.decrease(quantity); } public void increaseMenuOrderCountWithOptimisticLock(Long menuId, int quantity) { Menu menu = menuRepository.findByIdForOptimisticLock(menuId); menu.increaseOrderCount(quantity); } } ``` @Component @RequiredArgsConstructor public class OptimisticLockStockFacade { private final OrderService orderService; public Order order(Long memberId, LocalDateTime localDateTime) throws InterruptedException { while (true) { try { return orderService.orderWithOptimisticLock(memberId, localDateTime); } catch (Exception e) { Thread.sleep(50); } } } } ``` public interface JpaMenuRepository extends JpaRepository<Menu, Long> { @NotNull @Lock(LockModeType.OPTIMISTIC) @Query("select m from Menu m where m.id = :id") Optional<Menu> findByIdForOptimisticLock(@NotNull @Param("id") Long id); }
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
레디슨 락 대기 질문
레디슨과 레튜가 락 대기 관련해서 질문드립니다.레튜스는 스핀락 방식으로 쓰레드를 계속 사용해서 부하를 주는 것으로 배웠습니다. 그에 반해 레디슨을 사용하면 쓰레드 대기를 한다고 하셨는데, 쓰레드가 대기 되면, 해당 쓰레드는 스핀락과 다르게 아무것도 하지 않아서 부하를 주지 않는 것인가요? 그렇다면 스핀락과 크게 차이가 없다는 생각이 들었습니다.아니면 대기 중에 다른 작업을 하는 것이라 유용한것인가요?
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
Thread(4) 16:10 스레드 질문
안녕하세요,강의의 해당 부분에서 스택, 데이터 힙 영역에 대해서 설명해주셨는데 이해가 어려워서 질문남깁니다.Init함수는 스택 영역이고 그 안에서 데이터나 heap영역으로 self.value 변수를 공유한다. 이렇게 이해하면 될까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
분산락에 대해서 질문이 있습니다.
해당 질문에 대한 답변을 보고 혼동이 되어서 질문드립니다.분산 락의 완전한 정의를 찾을 수가 없어서 다음 두 상황이 혼동되는 것 같습니다. 1. 웹 애플리케이션 서버가 여러대인 경우, 이들간의 동시성 문제를 해결하기 위해 사용되는 Lock2. 스케일 아웃된 DB 환경에서 동시성 문제를 해결하기 위해 사용되는 Lock jeoningu님의 질문과 이에 대한 답변에 따르면, 1번 상황은 분산락이 아니며(낙관적 락, 비관적 락은 분산락이 아닌 것처럼 설명해 주셨으므로), 2번 상황이 분산락인 것 처럼 되는 것 같습니다. 그런데 이런저런 자료를 찾아보다보니, 1번 상황 역시도 분산 락의 개념에 포함되는 것 같습니다.(즉 낙관적 락과 비관적 락도 분산 락에 포함됨) 그래서 제 스스로 다음과 같은 결론을 내렸는데, 이게 올바른 것인지를 확인할 방법이 없어서 선생님께 조언을 구하고 싶어 질문 드립니다."1번과 2번 모두 분산락의 개념이다.낙관적 락과 비관적 락은 다중 애플리케이션의 동시성을 제어할 수 있는 분산 락을 구현할 수 있는 방법 중 하나이다.그러나 여러대의 DB를 사용하는 경우 이들로는 분산락을 구현할 수 없게 된다.이러한 경우 레디스와 같은 Lock 을 위한 DB를 하나 두어 이를 통해 분산락을 구현하여 사용해야 한다."잘못 이해한 부분이 있다면 지적해주시면 감사하겠습니다..!
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
named lock vs 비관적 락
좋은 강의 너무 감사합니다.강의를 보며 궁금한 점이 생겨서 질문 드립니다. named lock을 통해 동시성 문제를 해결하는 예시를 보았을 때, 비관적 락과 무엇이 다른 것인지 큰 차이를 느끼지 못했습니다.named lock이 비관적 락에 비해 가지는 장단점에 비해 찾아보니, timeout 설정이 좀 더 간편하다는 내용 말고는 유의미한 차이를 찾지 못했습니다.(그러나 비관적 락 + queryhint 를 사용하면 비관적 락 사용 시에도 딱히 어려움 없이 timeout을 설정할 수 있었습니다.) 혹시 named lock이 비관적 락에 비해 지니는 장단점과, 어떤 경우에 비관적 락 대신 Named lock을 통해 분산락을 구현하시는지 궁금하여 질문드립니다.
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
OptimisticFacade, LettuceLockStockFacade 에 대해 @Transactional 질문
강의 잘 듣고 있습니다.다름이 아니라 OptimisticFacade 클래스의 decrease 메서드는 트랜잭션을 붙히지 않으셨는데 이는 optimisticLockStockService.decrease가 실질적인 DB 와 통신하는 부분이기 때문에 optimisticLockStockService.decrease에서만 @Transactional을 적용시켜야 하기 때문인것인가요?? 또한, LettuceLockStockFacade의 경우 redisLockRepository에 접근하는 부분이 있는데, 레디스에 접근시에는 트랜잭션을 걸어주지 않아도 될까요?또한, 제가 알기로는 @Query를 사용하는 경우 @Transactional이 적용되지 않는다고 알고 있는데, 그렇다면 Pessimistic과 Optimistic 의 decrease 메서드의 경우 @Transactional이 없어도 괜찮은것 일까요?
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
트랜잭션 전파속성, 데이터 소스
안녕하세요. 강의 잘 보고 있습니다. 의문이 생겨 질문을 남깁니다. 트랜잭션 전파속성을 REQUIRES_NEW로 해서 새로 생성한 이유가 있을까요? 그냥 REQUIRED로 하면 안되나요??강의 내에서 데이터소스를 분리하는 것을 추천해주셨는데, 커넥션 풀 사이즈를 늘리면 안되나요?? 감사합니다.
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
파이썬 병렬처리 관련 질문이 있습니다.
안녕하세요 질문이 있습니다. 스레드 또는 프로세스 최대 생성 개수을 300개로 제한을 두고,특정 스레드 또는 프로세스의 작업 종료시점에 새로운 스레드 또는 프로세스 생성하여 제한 개수를 지속적으로 유지할 수 있는 방법이 궁금합니다. 즉 생성 제한개수 300개는 넘지 않지만300개 이하시 계속적으로 추가하며 300개를 지속적으로 유지하며 실행할 수 있는 방법이 있을까요? 구체적으로 예를들면 300개를 생성했는데몇개의 프로세스가 작업을 완료하면 300개의 제한선에서 몇개의 생성 가용 개수가 허용될텐데(ex, -3개 종료 시 남은 수 297개: 3개 추가 가능)이를 다른 스레드나 프로세스 종료를 기다리지 않고, 바로 다시 생성해서 채울 수 있는 방법이 있을까요?(ex, 남은 수 297개 + 추가 가능 3개: 300개)단 항상 최대 수치는 300개입니다. 코멘트 주시면 감사하겠습니다.(만약 가능하시다면 코드로 말씀해주시면 더욱 감사하겠습니다!)
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
from config import get_secret 질문
"05-scraping.py" 파일에from config import get_secret --> 이 코드가 있는데요,제가 Linux에서 이 파일을 실행해 보면 위 코드에서 아래 에러가 납니다. 뭐가 문제인지요?ImportError: cannot import name 'get_secret' from 'config' (/home/sean2/.pyenv/versions/3.8.17/lib/python3.8/site-packages/config/__init__.py)
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요 강사님 낙관적 락 질문있습니다.
낙관적 락도 데드락이 터질 수 있다는 글을 많이 봤는데, 강의에서는 다루지 않아서 좀 헷갈립니다. 사람마다 코드가 다 다르기 때문에 데드락이 무조건 터진다 안 터진다를 말할 수 없을 거 같은데,어떤 상황일 때 데드락이 발생하는지에 대해 간단하게라도 설명해주실 수 있으신가요?항상 감사합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
네임드락 레포지토리
"Stock을 사용하면 안되고.."라는 표현을 사용하셨는데요.Stock Entity를 사용하면 안되고 어떤 Entity를 통해서 repository를 만들어야한다고 말씀하시는건가요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
테스트 코드에서 매번 1번 유지
테스트 코드에서 매번 stock id 1번으로 조회하는데 이게 어떻게 가능한건가요?저의 경우 1번 객체가 없어서 에러를 처리합니다.
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
혹시 추가예정인 강의가 대략 언제쯤 나오는지 알수있을까요..?
재차 여쭤봐서 죄송합니다..!
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
10:10쯤에 질문있습니다.
안녕하세요,process.join()하면 subprocess의 job이 모두 complete된 것인데, 왜 다시 while True에서 process가 끝날 때까지 무한대기를 해야 하는 것인가요? 이미 process의 job은 종료된 것 아닌가요?... q = Queue() process = [] for i in range(5): t = Process(name=str(i), target=worker, args=(1, 100000000, q)) process.append(t) t.start() ... while True:
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
레디스에서 락이 필요한 상황에 대하여
안녕하세요, 강의를 보고 공부를하다 궁금한 점이 생겨 질문드립니다.제가 예측한 강의 내용으로는, "경쟁 상태 예시(재고 수량)에 대하여 레디스 를 활용한다." 라고 예측 했습니다.이에 대하여, "레디스는 싱글 스레드 기반이니깐, 락킹 없이 해당 작업이 가능할 것" 이라고 추측하였는데요, 그러나 제가 생각지 못한 레디스 lock 과 관련된 내용을 접하게 되어 신기하면서도 또 궁금한 부분이 생겨 질문드립니다. 레디스 락 전략이 사용되는 이유와 예시를 조금더 들어볼 수 있을까요? 혹은 이와 관련하여 추가적으로 공부해볼 수 있는 자료를추천해주시면 감사하겠습니다.