묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
Named Lock의 경우 데드락 발생?
Named Lock을 이용할 경우 Pessimistic Lock처럼 데드락이 혹시 발생할 수 있는지 궁금합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
NamedLock을 사용하는 경우 DataSource 분리
NamedLock을 사용하는 경우에 DataSource를 분리하는 것이 좋다고 하여 시도해봤으나 DataSource 설정의 문제인지 정상적으로 동작하지 않아 질문드리게 되었습니다. Main이 JPA에서 사용하게 될 데이터소스이고, Lock이 JdbcTemplate를 사용하기 위해서 사용하는 데이터소스입니다.spring: datasource: main: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3308/stock_example?serverTimezone=Asia/Seoul username: root password: 1234 lock: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3308/stock_example?serverTimezone=Asia/Seoul username: root password: 1234 hikari: maximum-pool-size: 20 jpa: database: mysql database-platform: org.hibernate.dialect.MySQLDialect hibernate: ddl-auto: create logging: level: root: INFO org: hibernate: SQL: DEBUG type.descriptor.sql.BasicBinder: TRACE애플리케이션 자체에서 사용해야 할 커넥션 풀만 관리를 하면 될 것이라고 생각하여 동일한 데이터베이스를 사용하였습니다. 먼저, 메인으로 사용하는 NamedLock을 사용하지 않는 데이터소스설정클래스입니다.@Configuration @EnableJpaRepositories( basePackages = "com.example.stock.stock", entityManagerFactoryRef = "mainEntityManager", transactionManagerRef = "mainTransactionManager") public class MainDataSourceConfiguration { @Bean @Primary @ConfigurationProperties("spring.datasource.main") public DataSourceProperties mainDataSourceProperties() { return new DataSourceProperties(); } @Bean @Primary public DataSource mainDataSource() { return mainDataSourceProperties() .initializeDataSourceBuilder() .type(HikariDataSource.class) .build(); } @Bean(name = "mainEntityManager") @Primary public LocalContainerEntityManagerFactoryBean mainEntityManager( EntityManagerFactoryBuilder builder) { return builder.dataSource(mainDataSource()) .packages("com.example.stock.stock") .build(); } @Bean(name = "mainTransactionManager") @Primary public PlatformTransactionManager mainTransactionManager( @Qualifier("mainEntityManager") LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) { return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactoryBean.getObject())); } }다음으로 Lock을 사용하기 위한 데이터소스 설정 클래스입니다.@Configuration @EnableTransactionManagement public class LockDataSourceConfiguration { @Bean @ConfigurationProperties("spring.datasource.lock") public DataSourceProperties lockDataSourceProperties() { return new DataSourceProperties(); } @Bean public DataSource lockDataSource() { return lockDataSourceProperties() .initializeDataSourceBuilder() .type(HikariDataSource.class) .build(); } @Bean(name = "lockTransactionManager") public JdbcTransactionManager lockTransactionManager(@Qualifier("lockDataSource") DataSource dataSource) { return new JdbcTransactionManager(dataSource); } }@Configuration public class JdbcTemplateConfiguration { @Bean public NamedParameterJdbcTemplate namedParameterJdbcTemplate(@Qualifier("lockDataSource") DataSource dataSource) { return new NamedParameterJdbcTemplate(dataSource); } }그리고 테스트를 돌려봤는데, 재고가 정상적으로 감소가 되지 않습니다. 이상한 점은 업데이트 쿼리가 발생을 하지 않는다는 점입니다.또 매번, 생성되는 스톡의 id가 1씩 증가한다는 점입니다. 혹시 제가 놓친 부분이 있을까요..?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
synchronized 사용 시 쓰레드 질문
synchronized를 사용하면 1개의 쓰레드만 이용한다고 말씀해주셨는데startTransaction(); stockService.decrease(id, quantity); endTransation();에서 왜 다른 쓰레드가 먼저 호출되는 상황이 발생하는건가요?이 부분이 이해가 잘 안됩니다
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
Redisson 값 설정 질문드립니다.
Redisson을 사용할때 waitTime과 leaseTime 값 설정이 잘못되면 서비스의 큰 문제가 발생할 수 있지 않나요?예를들어, 서비스가 서버 상황에 따라 특정 로직을 처리하는데 걸리는 시간이 다를 거라고 생각합니다. 이때 leaseTime이 처리 시간보다 적다면 동시성 문제가 추가로 발생하지 않나요?또한 강의에서처럼 waitTime 값에 따라 동시성 문제 발생 여부가 달라진다면 이 또한 실제 현업에서는 상황에 따라 다르기 때문에 문제가 되지 않을까요? 위와 같은 이유로, Redisson이 너무 위험하다고 생각이 드는데 제가 잘못이해한건지 궁금합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
CountDownLatch
다른 스레드에서 작업이 끝날 때 까지 기다리는 CountDownLatch를 이용해야한다고 하셨는데 왜 Race Condition이 발생하는지 궁금합니다. 결국은 CountDownLatch를 안써도 되는 것이 아닌가요?
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
분산락이라고 할 때 분산이
어플리케이션 서버가 여러개 라는 뜻일까요?DB 서버가 여러개라는 뜻일까요? 멀티 스레드 테스트를 통해여러 애플리케이션 서버가 동시에 요청이 들어오는 경우는비관,낙관적 락으로도 해결이 가능한걸 확인했고DB가 분산서버일때 분산락을 이용해야한다고 이해했는데 맞을까요? namelock도 결국엔 문자열에 건다해도 그 문자열 == 특정 데이터 인데특정 데이터에 락== 비관적 락이랑 다를게 없는데 정확한 차이를 모르겠습니다.문자열로 하면 뭐가 다른건지...
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
현재 제가 겪고 있는 상황인데 조언 부탁드립니다.
SpringBoot 에서 멀티 스레드로 크롤러가 돌아가는 프로젝트 입니다. junit 테스트 코드를 통해 크롤러가 10개 정도 게시판 페이지를 정상적으로 가져오는지 확인하려고 하는데요. 현재 작성된 테스트 케이스는 아래와 같습니다.@Testvoid crawlerTest() {// 크롤링 시작crawlerRun(); while(스레드풀 작업 종료됐나??) {// 작업이 안끝났으면Thread.sleep(5000);}} while 문이 있으면 정상적으로 10개의 게시판 페이지를 크롤링한 이후 DB에 적재됩니다. 다만 강의를 보면서 while 문이 없어도 되지 않을까 생각해서 삭제하거나 주석처리하면 올바르게 동작하지 않습니다. [while 문 제거 후]디버깅을 통해 값이 제대로 들어오는지 확인하면서테스트 케이스를 돌리면 4~5 개정도만 DB 에 크롤링한 데이터가 저장되고 갑자기 오류도 없이 테스트가 종료됩니다. 디버깅없이 그냥 실행시키면 6개 정도 DB에 저장되고 테스트가 종료됩니다. crawlerTest() 라는 테스트 코드가 Main Thread 라고 쳤을 때 다른 Thread 들은 정상적으로 동작 중이어야 하지 않나요..? 아니면 Spring 환경이라서 이런 문제가 발생하는 것인지junit 테스트 코드라서 이런 문제가 발생하는건지 궁금합니다!( Daemon Thread 는 아닙니다! )
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
synchronized 활용 시 StockServiceTest의 일부 테스트가실패하는 이유
synchronized를 이용해서 동시성 이슈를 해결한 후StockServiceTest를 실행 했을 때 왜 둘 중 하나의 테스트가 실패하는지 궁금합니다.테스트 메소드 각각 따로 실행하면 각자 성공하는데, 함께 실행하면 둘 중 하나의 테스트가 실패합니다.실패 시 다음과 같은 에러가 발생합니다.java.lang.NullPointerException: Cannot invoke "com.example.stock.domain.Stock.decrease(java.lang.Long)" because "stock" is null@BeforeEach, @AfterEach로 테스트 실행 전 Stock을 저장/삭제를 하고 있기 때문에 함께 실행해도 문제 없을 것으로 생각되어 질문 남깁니다.
-
미해결앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해
serial 큐 질문드립니다.
안녕하세요. 기본 구조는 A 스레드에서 SQ라는 serial queue에 async하게 task를 합니다.전달한 task의 마지막 부분에 @escaping 하는 completionHandler()를 호출하는 구조입니다. 만약 A 스레드에서 SQ에 task1, task2 두개를 보내면 completionHandler가 호출되는 순서는 보장받을 수 없는거죠? task1 { serialqueue.async { ...... completionHandler() } } task2 { serialqueue.async { ...... completionHandler() } }
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
AWS Lightsail SSL handshake failed 오류 문의드립니다.
AWS Lightsail에 git clone을 하고, 콜렉터스 북북이 초기 페이지까지는 잘 들어가졌는데,검색어를 입력하고 엔터를 하면 오랜 시간이 지나고 아래와 같은 오류문이 나옵니다. INFO: 211.234.195.243:54254 - "GET /search?q=Sss HTTP/1.1" 500 Internal Server ErrorERROR: Exception in ASGI application... <ServerDescription ('ac-ljyn7zm-shard-00-02.v7fc0ev.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect("SSL handshake failed: ac-ljyn7zm-shard-00-02.v7fc0ev.mongodb.net:27017: [('SSL routines', 'ssl3_read_bytes', 'tlsv1 alert internal error')] (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)")>]> 이런 오류가 나오면서 Internal Server Error가 뜹니다.혹시 어떻게 해결을 해야할지 알 수 있을까요?
-
해결됨자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
CPU 라고 언급하시는게 실제 CPU 개수인가요? CPU Core를 의미하나요?
아마 Core 를 의미할 것 같은데, 많은 도서, 글과 강의들에서 CPU 라는 언급을 많이해서 명확히 알고 싶습니다 ㅠ
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
동시성 문제점
동시성 문제가 생기는 부분이 재고를 감소하고 쿼리가update stock set quantity = :quantity where product_id = :id 이렇게 날라가서 문제가 되는것 같은데decrease를 없애고 쿼리를 update stock set quantity = quantity - :quantity where product_id = :id 이런식으로는 안되는건가요?JPA로는 불가능한가요?
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
다음 강의는 언제 출시되는지 알 수 있을까요?
다음 강의가 너무 기대되는데 출시 예정은 언제인지 알 수 있을까요?
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요 분산환경 질문이있습니다
스프링서버 3대가 scale-out 되어있는 상황이고 DB는 하나를 쓰고있습니다. 3대의 스프링서버에서 5분에 한번 실행되는 스케줄링 서비스로, DB에서 좋아요 많은순으로 5개씩 가져옵니다이때 3대의 서버가 동일한 게시글을 가져와야해서, 락의 필요성을 느꼈는데 저는 redis 분산락 말고는 해결방법이 잘 떠오르질 않더라구요. 서버1 select -> 그 사이에 좋아요 update -> 서버2 select -> 서버3 select위같은 상황이 발생해 서버 1과 2,3이 다른 결과를 select 할수도 있을것 같은데 비관,낙관적 락과 네임드락으로 해결할수 없다고 판단했는데 생각이 맞을까요?
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
TODO List Coredata 질문입니다.
강의중 궁금한것이 있어서 질문 남깁니다.TodoList 엔티티 정의를 했는데. ToDoList 의 클래스를 찾을수 없다고 나옵니다. 어떻게 해야할지 모르겠습니다. 알려주시면 감사하겠습니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
'Synchronized 이용해보기' 강의에서 질문이 있습니다.
제가 이해한 바는 다음과 같습니다. Transactional 어노테이션을 사용시해당 메서드나 클래스 내의 모든 메서드가 하나의 트랜잭션으로 묶여 처리 synchronized를 사용시동시에 같은 객체의 특정 메서드를 여러 스레드가 호출하지 못하게 하는 데 사용 그런데 1분 29초부터 설명을 들어보면decrease 함수 안에서, endTransaction을 수행하기 전에 다른 스레드가 decrease 메소드를 호출할 수 있다고 하셨습니다. 그런데 이 부분이 이해가 안됩니다. synchronized 키워드를 붙였다면, 동시에 같은 객체의 메서드를 다른 스레드가 호출하지 못하는것 아닌가요? Transactional 어노테이션을 주석처리하면 동작하던데, 이 여부와 관계 없이 동작해야하는것 아닌가요?
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
작업영역 질문
기존에 경로(폴더)에 파이썬 파일들이 있는데, 이것과 상관없이 선생님 강의 따라서 만든 가상환경파일은 작업환경이 아예 다르다고 봐도 되나요?아래와 같이 일단은 두개 만들어뒀는데, 서로 충돌하거나 문제되진 않는걸까요?요즘 주식api받아서 이것저것 해보려하는데, 32비트로 이렇게 가상환경 만들어서 하더라구요. 혹시 충돌되나 궁금해서 여쭤봅니다!음.. 이전에 사용하던 환경이 있어서인지 수업에서 진행하신것처럼 venv폴더에 있는 파이썬으로 연결해도 하단에 선생님처럼 venv라고 안뜨네요ㅜㅜ이렇게 뜨고있습니다.
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
cmd에서 code작성시 기존에 깔아둔 vscode에서 이상한 화면이 뜨네요
cmd에서 아래처럼 code라고 쳤는데 기존에 지정해둔 경로가 사라지고 아래처럼 알수없는 글만 잔뜩 뜨네요.. 왜그런걸까요? 다행히도 최근파일열기(컨트롤+r)로 기존경로에 있던 프로그램들 다시 불러오긴했는데, 이건 왜그런걸까요?
-
미해결운영체제 공룡책 강의
자바 Bounded-Buffer 코드 질문 있습니다.
안녕하세요. 좋은 강의 잘 듣고 있습니다. 다름이 아니라 해당 부분 자바 코드에서 의문점이 있어 질문 드려봅니다. synchronized 식별자를 붙인 메서드가 여러 개 있을 때 모니터 락이 각 메서드별로 생기는지 혹은 전체를 관리하는 하나의 모니터 락만 생기는지가 전 강의에서 언급이 되었는지 모르겠지만, 잘 기억이 안나서,, 두 케이스 모두 질문이 드립니다. 모니터 락이 각 메서드별로 생기는 경우take와 give는 count라는 공유 변수에 접근하고 있다고 생각됩니다. synchronized를 통해 각 메서드별로 mutual exclusive가 지켜지지만, take와 give 사이에서는 race condition 문제가 발생하지는 않나요 ?? 예를 들어 buffer size = 3, count = 1인 경우 give와 take가 동시에 실행될 수 있고, count++과 count--에서 race condition 문제가 발생할 수 있다고 생각했습니다. 직접 테스트 해 본 결과 해당 문제는 발생하지 않았는데, 왜 그런지가 궁금합니다. 모니터 락이 전체를 관리하는 하나만 생기는 경우하나의 메서드에서 무한정 대기하는 경우가 생길 것 같습니다. 아마 첫 번째 케이스가 맞다고 생각하지만 혹시라도 두 번째 케이스라면, take에서 count=0일 때 while문 안에서 wait()을 하는데, give 메서드가 실행이 되지 않으니 무한정 대기할 것이라고 생각됩니다. 쓰다보니 굉장히 길어졌습니다 ㅜㅜ.. 읽어주셔서 감사합니다.
-
해결됨자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
[join() 강의] join() 작동 방식 정리 관련 질문이 있습니다.
안녕하세요. 선생님 join() 강의를 듣다가 11:09 내용 [join() 작동 방식] 관련해서 질문이 생겨서 질문을 남기게 되었습니다! 해당 페이지 첫번째 줄에 의하면 join()을 실행하면 현재 스레드는 대기 상태가 되고 join()을 수행중인 스레드에게 CPU를 사용하도록 한다라고 말씀 해주셨는데요.여기서 말씀을 해주신대로라면 join()을 수행중인 스레드가 바로 RUNNING 상태가 되면서 CPU를 할당받는 것인가요?아니면 그냥 스케줄러에 의해서 RUNNABLE 상태에 있던 join()을 수행중인 스레드 가 자기 차례가 되어서 RUNNING 상태가 되는 것인지 궁금합니다.현재 스레드가 자신의 차례를 join()을 수행중인 스레드에게 양보를 함으로써 join()을 수행중인 스레드가 즉시 실행이 되도록 하는것인지, 아니면 현재 스레드가 자신의 차례를 그냥 넘기게 되고 join()을 수행중인 스레드는 OS 스케줄러에 의해서 추후에 실행이 된 것인지 의문이 들어서 여쭤보게 되었습니다.5번째 내용을 보면 join()을 수행중인 스레드 에게 인터럽트가 발생할 경우, 현재 스레드는 대기에서 해제되고 실행상태로 전환되어 예외를 처리한다고 되어있습니다.join()을 수행중인 스레드 에게 인터럽트가 발생하는 것이 아니라 현재 스레드에게 인터럽트가 발생해야 현재 스레드가 대기에서 해제되고 실행상태가 되어서 예외를 처리하는게 아닌지 궁금합니다.30:00 내용을 보면 Main 스레드에게 인터럽트를 걸어야 대기에서 빠져나온다고 말씀을 해주셨습니다.1번 질문과 결이 비슷한 질문입니다.join()을 해제시키기 위해서 특정 스레드에게 인터럽트를 걸게 되면 해당 스레드는 WAITING 상태에서 RUNNING 상태로 바로 가는 것이 아니라, RUNNABLE 상태로 바뀐 후 자신의 차례에 RUNNING이 된다고 이해를 하면 되는 것일까요 ??