묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
aiohttp 동시 요청 수 제한 관련
안녕하세요. 강의 잘들었습니다!강의 내용 토대로 비동기로 API 수집을 구현했었는데API 서버가 제가 보낸 모든 요청을 처리하지못해 오류 발생하여 요청 수를 제어하려고 합니다.예를 들어들어 각기 다른 파라미터로 서버에 요청해야 할 수가 총 1000번이라면1초당 10개씩만 요청하려고 합니다.이럴 경우에는 어떻게 구현하는게 좋을까요?semaphore 사용해서 하는게 맞는건지 아님 aiohttp.BaseConnector 의 limit 수 파라미터를 조정하는게 맞는건지 궁금합니다.https://docs.aiohttp.org/en/stable/client_reference.html#baseconnector그리고 한번에 요청 보내는 수뿐만아니라 요청보내는 간격에 대해서도 제어하려면 어떻게하면 좋을지 의견부탁드립니다!
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
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); }제가 뭘 놓치고 있을까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
실무에서는 어떠한 방식을 선호하나요?
실무에서 mysql lock을 사용하면 퍼포먼스부분에서 우려가 되는데요~실무에선 redis를 사용한 동시성 제어를 주로 하나요?실제로 실무에서 어떠한 방법으로 동시성을 처리하는지 궁금합니다!!
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
환율 계산기 앱 - 네트워크처리1 에러가 발생하는데요 ㅠ
[Assert] UINavigationBar decoded as unlocked for UINavigationController, or navigationBar delegate set up incorrectly. Inconsistent configuration may cause problems.위와 같은 에러가 발생하는데, 코드 문제는 아닌거 같고 Xcode문제 인 것 같습니다. 구글링을 해봐도 해결책을 찾지 못해 질문 남겨요 !! 아 그리고 혹시 SwiftUI 강의도 새로 찍으실 계획이신가요 ?
-
해결됨고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
multiprocessing(4) - sharing state 공유 변수 출력 값 예상치와 다를 때
환경 차이(Python 3.8 + M1 Pro) 인지는 모르겠습니다만 저 같은 경우는 기대값이 50씩 증가되어 최종 450이 나오질 않더군요. 다른 분도 마찬가지면 참고하라고 아래 코드 넣습니다.def generate_update_number(v: int): with v.get_lock(): for _ in range(50): v.value += 1 print(current_process().name, 'data', v.value)
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
낙관적 락 무한루프 도는 이유 공유합니다 !
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이 붙어 있어도 정상 동작하는 것을 확인하실 수 있습니다~!
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
비관적 락과 update product set stock = stock -1 where id = 1의 차이
update product set stock = stock -1 where id = 1 이렇게 할 경우 읽는 작업과 쓰는 작업이 원자적으로 이루어지고, 이 쿼리가 커밋하기 전까지는 다른 update 쿼리는 블락되기 때문에 비관적 락과 다른 점이 없다고 생각되는데요.제가 잘못 생각한 부분이 있을까요?
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
Redis를 이용한 방식이 MySQL을 이용한 방식보다 느리지 않나요?
제가 생각하기로는 Redis를 이용한 방식은 서버 -> Redis서버 -> MySQL 이렇게 두 번 접근하게 되니 네트워크 타는 시간 때문에 당연히 더 느릴 것이라고 생각했거든요비관적 락을 이용한다면서버 -> MySQL 이렇게 바로 접근한 후에 lock이 풀릴 때까지 기다렸다가 바로 작업을 수행하니 더 빠르지 않나요?
-
해결됨파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
local 에서 웹사이트 뜨는 것을 확인하였는데, aws lightsail 에서 프로그램 실행 시키고 ㅡ 제 local 에서 접속하려 하니 응답이 없습니다;
어떤 정보를 포함해서 질문을 올리면 좋을까요??
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
redis를 단순히 락 용도로 사용하지 않고..
redis를 단순히 락 용도로 사용하지 않고 redis에 재고수량을 저장 후 관리하는 방법도 사용하는 걸로 알고 있는데요.이런 방법은 별로인가요?
-
해결됨파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
깃에 나와있는 내용을 볼 수가 없습니다.
안녕하세요. 강사님현재 강사님 강의 듣고 있는 수강생 입니다.Python의 패키지 매니저 PIP 명령어 정리와 사용해당 파트 에서 0:30초에 나오는 필수적인 명령어정리되어 있는 페이지가 강사님 git 에서 보이지 않아서요.어디서 찾아 볼 수 있는 것 인가요 ?확인 부탁드리겠습니다.감사합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
redis 관련 질문 드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.강사님 쉽고 깔끔한 강의 감사드립니다다른 좋은 강의 부탁드립니다강의 듣고 난후 궁금한 사항 질문 드립니다.. 1.레디스 레튜스, 레디슨 사용시 서버가 장애 발생으로 갑자기 죽었을때는 락을잡고 관리하던 항목들은 자동으로 사라지는건가요 어떻게 되나요? 2.강사님이 경험하신 레디스 레튜스, 레디슨 를 실무 사례에 적용할때 어떤경우에 적용해보셨는지 사례 몇가지를 예시로 알려주세요..
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
서비스 로직에서 saveAndFlush 질문입니다.
안녕하세요. 먼저 알차고 좋은 강의 만들어 주셔서 감사하단 말씀을 드리고 싶습니다 ㅎㅎ 강의를 보다보니 서비스 로직에서 saveAndFlush 를 해주고 있는데 @Transactional 어노테이션이 있어서 디비에 반영이 잘 될거 같은데 saveAndFlush 를 해주는 이유가 따로 있을까요?그리고 저는 보통 save 를 사용했는데 saveAndFlush 를 사용하는 다른 특별한 이유가 있는지 궁금합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
분산락 관련 질문입니다.
안녕하세요 좋은 강의 감사드립니다.이전까지 알아보았던 락들은 분산락이 아닌 것인가요?만약 아닌 것이라면 다중 서버 환경에서 동시성 문제를 해결하기 위해서는 위의 방법들이 아닌 분산락을 사용하여야 하는 것인지 궁금합니다. 추가로 동시성 관련 질문이 하나 있습니다.다중 서버 환경에서 게시판 등에서 조회수 기능을 동시성 문제 없이 해결하고 싶으며, 다음과 같이 구현하고자 합니다.(조회수라 어느정도 누락되어도 상관 없다고 하실 수 있겠지만, 목표는 하나도 누락되지 않게 하는 것입니다!)조회 요청이 들어오면 레디스에 조회수 증가분을 올린 이후, 특정 시간마다 배치처리를 통해 반영하고자 합니다.이때 다음 두 의문점이 있습니다.먼저 다중 서버 환경에서 레디스 증가분을 올리는 경우, 이 경우에도 동시성 문제가 발생할 수 있을 것 같습니다. 이를 해결하기 위해서는 이곳에도 분산락을 걸거나 increment()를 사용하여 동기적으로 처리해야 할 거 같은데 저의 생각이 맞는 것인지, 맞다면 다른 방법은 없는지 궁금합니다.두번째는 레디스 조회수 증가분을 배치처리를 통해 반영시키는 경우, 해당 작업 사이에 조회수 증가가 되어버리면 해당 증가분은 누락될 것 같습니다. 이를 해결하기 위해서는 배치처리를 할 때 레디스에 Lock을 걸어야 할 것 같습니다. 그런데 그렇게 된다면, 배치처리가 진행되는 그 순간동안은 레디스가 블로킹되어 있기에 게시글 조회가 이루어지지 않을 것 같습니다. 이정도는 감수하고 사용하거나, 혹은 카프카 등을 활용하여 이벤트로 처리하는 방법도 있을 것 같은데, 이러한 방법이 모두 사용 가능한 것인지, 더 나은 방법은 없는지 궁금합니다. 너무 많은 질문을 하는 것 같아 죄송합니다. 좋은 강의 정말 감사합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
Propagation.REQUIRES_NEW 를 사용하는 이유가 무엇인가요?
안녕하세요! 선생님.다른 락에서는 트랜잭션에 Propagation.REQUIRES_NEW 를 사용하지 않았는데 namedLock 에서는 왜 사용하나요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
MySQL과 Redis의 성능에 관하여 문의드립니다.
MySQL의 특징으로 어느 정도의 트레픽까지는 문제없이 활용 가능하다라고 설명해주셨는데 어느 정도를 수치로 말씀해주실 수 있을까요?그리고 Redis가 MySQL보다 절대적으로 성능이 뛰어난지, 아니면 특정 트래픽 이상부터 성능이 뛰어난게 체감이 되는건지도 궁금합니다.그리고 성능이라고 표현하신게 비용 대비 퍼포먼스인지, 속도만 놓고봤을 때 더 빠르다인지 모호한 감이 있어서 구체적으로 말씀해주시면 정말 감사하겠습니다.좋은 강의 촬영해주셔서 감사합니다. 다음 강의도 기대하고 있겠습니다!
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
네임드락을 활용할 때 데이터소스를 분리해야하는 이유가 궁금해요!
안녕하세요 최상용 엔지니어님~~ 강의 너무 잘 보고 있어요! 다음강의도 기대기대됩니당 답변 부탁드립니다~~~
-
해결됨파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
Scraping code 관련 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. ---------- ---------- # 감사의 인사 안녕하세요! 먼저 좋은 강의 만들어주셔서 감사합니다. 파이썬 문법을 기본적인 것을 떼고 프레임워크와 함께 무언가 만들어볼라고 하던 찰나 FastAPI와 함께 크롤링까지 학습할 수 있어서 좋은 강의인 것 같습니다 : ) 스크랩핑의 경우, json.load 관련하여 학습하다보니 serialize 개념에서 시작하여 json.dump와 json.loads 등등 과 parser 개념에 대해 학습할 수 있어서 너무 좋았습니다. 이것저것 학습하다보니 하루가 쑤욱 갔네요... ---------- ---------- # 질문 1 먼저 구글링을 하고 나서 질문드립니다. 1) 아래 코드에서 response 앞에 await이 올 수 있는 이유 async def fetch(session, url): print(f"{os.getpid()} | {threading.get_ident()} thread | url: {url}") async with session.get(url) as response: return await response.text 공식 문서에 따르면 await 뒤에는 코루틴, 태스크 또는 퓨처가 와야한다고 하는데, 위 코드에서 await이 올 수 있던 것은 여기서 response가 async with session.get(url)의 alias 여서 가능한건가요??? 만약 그렇다면 with문은 context manager인 걸로 알고 있습니다. 자원을 할당해주고 다 사용하면 반환하는 역할인 것으로요. 그러면 이 with문이 어째서 코루틴에 속하는지 잘 모르겠습니다. ------- # 질문 2 2) html.parser 이 질문은 제가 이해한 게 맞는 건지 여쭤보는 질문입니다. beautifulsoup(html, "html.parser") code 부분에서 html을 구문분석할 parser를 "html.parser"로 정한다는 의미인가요? 그리고, HTML parser란 HTML 코드를 읽고 취해서 DOM tree 구조를 생성하는 프로그램이라 이해하면 되나요?? 이 부분은 구글링하여 학습했으나, 강사님의 내포하는 지식과 일치하는지 확인받을려는 질문입니다. ------- # 질문 3 3) await을 넣는 위치 코루틴이란 진입점과 탈출점이 여러 개인 routine인 것으로 이해했고, 그 포인트들이 await과 return으로 만들어진다고 강의를 통해 이해했습니다. 그런데, 왜 이 위치에 await을 썼는가? 라는 의문에는 쉽게 답이 나오지 않는 것 같습니다. from bs4 import BeautifulSoup import asyncio import aiohttp async def fetch(session, url): async with session.get(url) as response: html = await response.text soup = BeautifulSoup(html, 'html.parser') cont_thumb = soup.find("div", "cont_thumb") for cont in cont_thumb: print(cont.find("p", "text_thumb")) 위 코드에서 await은 response.text 앞에 있는데요. await의 위치는 작성자가 임의로 위치할 수 있는 건인지, 아니면 별도로 제가 모르는 내용이 있는 건지 알고 싶습니다. ------- #질문 4 4) config.py의 get_secret() 질문 get_secret function 매개변수 3개를 key, default_value, json_path 를 입력하셨습니다. json_path의 경우, BASE_DIR를 전역변수로 입력하셨기 때문에 함수 인자로 입력하지 않아도 인식된다고 이해하면 될까요? 또한, EnvironmenError의 내용을 보면 이 Error 설명을 보면 Base class for I/O related Errors 나와있는데, 왜 I/O 관련 에러인지 모르겠습니다. 이 Error는 key에 대한 대체값인 default_value가 없는 경우 발생되는 걸로 이해했습니다. CPU가 이 값을 읽는건데 I/O 인가요? 그리고, get_secret() 같은 함수를 작성하실 때 어떠한 흐름으로 작성하시는지 궁금합니다. 작성을 하면서 수정하시는 건지, 아니면 처음부터 이 function은 이 역할을 하고, 이 역할을 위해서 별도의 function을 만들고 라는 방식으로 하시는 건지 입문자로서 궁금합니다. ------- # 질문 5 5) 마지막 질문입니다. 이건 학습 관련 질문입니다. 이번 강의를 마치고, 운영체제와 네트워크 공부를 다시 복습하고, 자료구조와 알고리즘 공부를 할려고 하는데, 프레임워크에 대해서 학습하고 싶습니다. FastAPI를 깊이 공부할지, 아니면 Django를 학습할지 고민입니다. 인프런의 Django 강의를 결제하여 듣고 있으나, 너무 꼼꼼하셔서 그런지 강의가 heavy하네요..ㅠㅠ 어떻게 학습하시는 걸 추천하시나요??? -------------- -------------- 질문 읽어주셔서 감사합니다.
-
미해결운영체제 공룡책 강의
Mac OS에서 Docker 이용하여 Ubuntu 20.04 환경설정 방법 공유
1. 도커를 이용하여 Ubuntu 설치 // 도커는 설치되었다고 가정함 // ubuntu 이미지 다운로드 및 컨테이너 실행 $ docker pull ubuntu:20.04 $ docker run -it --name myUbuntu ubuntu:20.04 // 도커 컨테이너 내로 들어옴 $ apt-get update $ apt-get upgrade -y // 교수님 업글 안하긴 하심 $ apt-get install build-essential gdb 2. 편한 개발을 위해 VS Code에서 Container에 연결함 - VS Code 에서 Remote - Container 플러그인 설치 - 설치 후 좌측 하단에 >< 아이콘의 초록색 버튼 클릭 - 메뉴 클릭 Attach to Running Container… 3. 테스트 Vs Code에서 텍스트 파일 생성하고 컨테이너 내에서 확인해보면 파일 생성되어 있음