묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
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 과 관련된 내용을 접하게 되어 신기하면서도 또 궁금한 부분이 생겨 질문드립니다. 레디스 락 전략이 사용되는 이유와 예시를 조금더 들어볼 수 있을까요? 혹은 이와 관련하여 추가적으로 공부해볼 수 있는 자료를추천해주시면 감사하겠습니다.
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
multiprocessing(5) - Queue 공유 질문 in multiprocess
안녕하세요,강의에서 선언한 큐를 여러개의 프로세스의 args로 넘겨주면서 마치 큐가 process 들에서 공유되는거처럼 보였는데 실제로 id를 통해 주소를 찍어보면 각 프로세스에서 다른 주소값을 보여주네요. 관련해서 내부적으로 어떻게 작동하는지 설명해주시거나 참고 자료 같은거 추천해주시면 감사하겠습니다.
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
TimeUnit이 안 됩니다
아래처럼 TimeUnit이 적용되지 않아서,구글링하여 maven 디펜던시 추가 등등 해보았지만 안됩니다.혹시나 다른 방법이 있는지 궁금해서 문의드려봅니다. java는 17입니다.
-
해결됨넓고 얕게 외워서 컴공 전공자 되기
동시성 부분 추가 공부하면서 헷갈리는 부분 질문 드립니다.
안녕하세요 선생님!동시성과 병렬성 관련해 기초가 약해 해당 강의를들으면서 OS 부족한 부분을 많이 알게되어 도움이 많이되고 있습니다. 다름이 아니라 해당 강좌 범위는 벗어나지만..구글링해도 명확하게 해결되지 않아 질문 드립니다. 동시성을 구현하는 방법으로멀티쓰레드나 코루틴 방법으로 구현을 할 수있고멀티쓰레드 방법에서 쓰레드 전환 간 context switch가 많기 때문에 오버헤드도 많아 Coroutine 방법을 많이 쓰고 또한 유저가 이벤트루프(스케쥴링)을 app에서 관리한다는 측면에서 디버그가 유용하다 정도로 이해하고 있습니다. 많은 블로그에서멀티쓰레드보다 코루틴을 소개하면서 동시성 구현시 코루틴을 더 상위(혹은 좋은) 방법으로 서술이 많이 되어 있더라구요.I/O작업이 빈번할 경우 코루틴이 더 유리하다는 이해가 됩니다. 싱글스레드 + async싱글스레드멀티스레드 + async멀티스레드2개의 구현방법이 레이어가 다르다(thread와 task)보니 4가지 경우의 수를 적용할 수 있는데 실제 동시성을 적용해야되는 상황이면 어떻게 판단하고 최적의 구현방법(4가지 중 선택)을 적용할 수 있을까요?(파이썬 스택을 쓰고 있으며 GIL도 이해하고 있는 상태입니다.) 다시한번 해당 강의와 조금 벗어난 질문드려 죄송합니다. ( _ _ )