1. 코드리뷰
우가와 망고 pr 리뷰 했다.
2. 동기 vs 비동기
비동기 프로그래밍, 비동기 I/O, 비동기 커뮤니케이션 .. 각 맥락에서의 비동기 의미
📍 프로그래밍 관점에서의 비동기
- 차례차례
- task1 끝나면 task2 끝나면 task3
- synchronous programming : 여러 작업(task)들을 순차적으로 실행하도록 개발
- 순차적으로 실행x
- task1 하다가 task2 하다가 task3
- asynchronous programming : 여러 작업(task)들을 독립적으로 실행하도록 개발
각 사람 = thread
햇반 데울때 사용한 전자레인지, 국 끓일 때 사용한 가스레인지 ... = I/O
-> non-block I/O
aynsc != multithreading
- asynchronous programming : 여러 작업을 동시에 실행하는 프로그래밍 방법론
- multithreading : asynchronous programming의 한 종류
- multi-threads
- 여러 작업을 여러 thread가 나눠가져서 동시에 실행
- 장 : 멀티 코어 활용
- 단 : 스레드 많아지면 context switching 비용 큼, race condition 발생할수도
- non-block I/O
- 하나의 thread가 I/O 작업을 non-block 모드로 (하나의 I/O작업을 하다가 또다른 I/O작업을 하고..cpu작업을 하고..)
=> 이 둘을 잘 버무리면, 적은 thread로도 좋은 성능을 낼 수 있다(v4)
📍 I/O 관점에서의 비동기
sync I/O : I/O작업을 요청한 요청자가 I/O작업의 완료 혹은 결과까지 챙겨야할 때
async I/O : 완료 혹은 결과를 직접 챙기지 않아도 noti로 알려주거나, 결과를 callback으로 처리
tA가 block I/O를 실행하고 싶을 때 tB를 만들고 BIO 요청 -> tB는 BIO하는 동안 block이 되겠지만, tA는 쭉 할일 가능
📍 백엔드 아키텍처 관점에서의 비동기
단점 : C가 응답불능 상태에 빠지면 B, A까지 다같이 응답 불능됨 (서비스 전체로 장애 확대)
C에서 문제 생겨도 버퍼(메시지 큐)있기 때문에 다른 서비스에 영향x
댓글


3. [펀잇] 스프링 이벤트 도입
~ 허브와의 대화 ~
1.
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
이거를 사용하면 호출부에서 commit 한 후에 얘가 실행되는거니까,
이 안에서 insert, update 등 불가 하다는거 ㅇㅋ
해결방법 1) @async를 붙인다
별도의 thread ㅇㅋ.
그럼 여기서 새 thread는 새로운 트랜잭션 (커넥션)을 쓰는거? => 0
해결방법 3) @Transactional(propagation = Propagation.REQUIRES_NEW)를 붙인다
얘는 동일한 thread가 새로운 트랜잭션 쓰는거고? => 0
2.
- 트랜잭션 커밋하면 커넥션 바로 반납해?
- 반납하지 않을까?
- 근데 그럼 여기서
commit 하면 커넥션 반납하고 저기서 또다시 트랜잭션 만들 수 있는거아냐?
- 음 아예 바로는 아니지 않을까 저런거 있는거 보면
- 그럼 트랜잭션이 살아는 있는데 이미 커밋돼서 추가 작업은 안된다 이런느낌인가?
- 우리가 보기에는 바로 반납하는 것 처럼 보여도 commit -> 어떤 과정 -> 반납인데 저기 사이에 트랜잭션 이벤트 리스너 같은거 사용하면 원래 커넥션에서 동작하거나

3.

요청 들어오는거와 동시에 스레드가 connection 가져와서 영속성 컨텍스트 만들어두고
서비스에서 트랜잭션 시작하면 그 connection으로 트랜잭션 돌리는??
맞나 => 0
만약에 별도로 @Async에 대한 설정이 없으면 새로운 비동기 작업을 스레드 풀에서 처리하는 게 아니라 새로운 스레드를 매번 생성해서 작업을 수행시키는 것이 디폴트 설정이다. 그래서 쓰레드풀을 빈으로 등록시켜줘서 자동으로 해당 스레드 풀로 작업을 넘기도록 설정한다. (yml로 설정 가능)
기타
스레드 풀 설정