리액티브 프로그래밍
1회 - https://www.youtube.com/watch?v=8fenTR3KOJo
2회 - https://www.youtube.com/watch?v=DChIxy9g19o
3회 - https://www.youtube.com/watch?v=Wlqu1xvZCak&t=4261s
4회 - https://www.youtube.com/watch?v=aSTuQiPB4Ns&t=5614s
5회 - https://www.youtube.com/watch?v=ExUfZkh7Puk
6회 - https://www.youtube.com/watch?v=Tb43EyWTSlQ
7회 - https://www.youtube.com/watch?v=PzxV-bmLSFY
8회 - https://www.youtube.com/watch?v=ScH7NZU_zvk&t=2105s
9회 - https://www.youtube.com/watch?v=LK6NRV8tZBM&t=1877s
10회 - https://www.youtube.com/watch?v=bc4wTgA_2Xk
spring.camp
https://www.youtube.com/watch?v=HKlUvCv9hvA
1강
리액티브 프로그래밍
외부에 어떤 이벤트가 발생하면, 거기에 대응하는 방식으로 코드를 작성하는것
// Duality
// Obeserver Pattern
// Reactive Streams - 표준
for-each는 Iterable
// Iterable <--> Observable (duality)
// duality 기능은 똑같음, 그러나 반대 (쌍대성)
// DATA method <-> void method(DATA)
Iterabale : pull 방식
Observable : push 방식
자바인터페이스 Observable
Observable // Source -> Event/Data -> Observer
// - 옵저버패턴은 부족하다..!!!
// 1. 끝이라는 개념이 없음 (Complete가 없다)
// 2. Error 처리가 없다
// 옵저버를 확장하자 = @리액티브프로그래밍에 한축
리액티브스트림스
(https://github.com/reactive-streams/reactive-streams-jvm)[https://github.com/reactive-streams/reactive-streams-jvm])
- 스프링이 웹 구현기술이 리액티브스트림스에 표준을 사용함 (Reactor)
- 리액티브 기술의 표준
참조 -
(https://hyoj.github.io/blog/java/spring/rxjava-vs-reactor/#pivotal-reactor-core-3-0-becomes-a-unified-reactive-foundation-on-java-8)[https://hyoj.github.io/blog/java/spring/rxjava-vs-reactor/#pivotal-reactor-core-3-0-becomes-a-unified-reactive-foundation-on-java-8]
리액티브 프로그래밍
Observable == Publisher
Observer == Subcribe
Observable.addObserver() == Publisher.subcribe()
Publisher.subcribe()
호출 시
//Subcriber 내부에
//onSubribe를 최초에 반드시 실행
//onNext ( 1 ~ N번 호출)
// onError, onComplete 둘중에 하나 호출
onSubscribe onNext* (onError | onComplete)?
onSubscribe(subscription)
// subscription = publisher와, subcriber의 중개
<img src="https://static.podo-dev.com/blogs/images/2020/06/03/origin/bd9b484c-2344-4673-9a18-4d3886413d20.png" alt="base64.png" style="width:720px;">
subscription 통해서 요청 할 수 있음
publisher와 subscribe의 속도차를 subscription을 통해 (나 지금 바쁘니까, 몇개만 보내줘!) or (일단 한개만 줘봐!) or (계속줘!)
subscription은 왜 필요할까?
publisher가 100만개 엄청 빨리 쏴주는데, subscriber가 1개에 1초씩 걸린다..
둘사이에 중개가 필요하다.
@ 또다른 하나의 축 스케줄러
publisher가 작업이 많아서,
쓰레드를 여러개만들어 병렬적으로 onNext를 호출해도되느냐
-> NoNo 안됨,
-> subcriber는 시퀀스한 값을 보장받아야함.
-> 즉 한 쓰레드에서만 하나의 subcriber에 보내야됨
<br/>
https://www.youtube.com/watch?v=HKlUvCv9hvA
2강
// Reactive Streams - Operator
// Publisher -> Data -> Subscriber
// Publisher -> Data -> Ope1 -> Date2 -> Oper2 -> Data3 -> Subscriber
3강 - 스케줄러
<img src="https://static.podo-dev.com/blogs/images/2020/06/04/origin/082c58ae-039a-4d3b-8959-11b1b03aa9d7.png" alt="base64.png" style="width:522px;">
<img src="https://static.podo-dev.com/blogs/images/2020/06/04/origin/c2d7102a-edcf-4c84-9435-f4bba7305ecb.png" alt="base64.png" style="width:544px;">
4강
<img src="https://static.podo-dev.com/blogs/images/2020/06/12/origin/a8027c92-8fea-4fd8-a0f8-01a2c61acb1c.png" alt="base64.png" style="width:720px;">
<img src="https://static.podo-dev.com/blogs/images/2020/06/12/origin/575970ee-3d77-4bb1-b6be-5db3ca3a18ad.png" alt="base64.png" style="width:720px;">
<br/>
5강
**Thread pool Hell **
2~4시 Thread 개수 부족,
문제는 latency가 느려짐 ( 사용자 응답 시간)
<img src="https://static.podo-dev.com/blogs/images/2020/06/17/origin/bf9c39a6-f3ed-4a5f-ae47-bc4bb2ab67f4.png" alt="base64.png" style="width:720px;">
<img src="https://static.podo-dev.com/blogs/images/2020/06/17/origin/40f99530-537c-48ed-bc52-fe66516fc5a1.png" alt="base64.png" style="width:720px;">
왜그럼 thread pool hell이 발생하는가?
하나의 요청을 받아서 서버가 처리하는 동안에
서버가 또 다른 리모트서버에 여러 요청을 보내고
이 요청을 다 조합해서 결과를 리턴함.
하나 하나 에대해서 최선의 성능을 발생하도록 하겠지만,
보통은 0.1~0.2초 이지만,
예를 들어, 5개 정도의 순차적으로 응답한다면, 총 1초가 걸림.
따라서 1총동안 하나의 요청을 물고있고,
thread가 꽉차고, 레이턴시가 느려짐.
<img src="https://static.podo-dev.com/blogs/images/2020/06/17/origin/44fb59fb-3bd0-4daf-b5b4-68118a9975b6.png" alt="base64.png" style="width:720px;">
서버에서 또다른 리모트로 요청을 보내는 동안 cpu는 놀고있음.
그런데 thread는 가지고 있음.. 따라서 레이턴시가 느려지게 되있음.