Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기

59,356 views

Published on

2014년 5월 28일 NDC14 발표자료입니다.

Published in: Software, Technology
  • Be the first to comment

NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기

  1. 1. 2
  2. 2. 3
  3. 3. © Google 4 비트코인 마이너와 구글 데이터센터의 공통점은?
  4. 4. 5
  5. 5. • • f : X → Y int main() { return 42; } a b c 1 2 3 X Y f 6
  6. 6. a b c 1 2 3 X Y f : X → Y ㄱ ㄴ ㄷ Z g : Y → Z f g 7
  7. 7. a b c X ㄱ ㄴ ㄷ Z g ∘ f : X → Z g ∘ f 8 합성함수
  8. 8. … int y = f(x); int z = g(y); … 9 컨트롤이 움직이면서 한 줄씩, 순차적으로 실행함 → 명령형, 절차적
  9. 9. f g 10 컨트롤이 아닌 데이터가 흐른다면?
  10. 10. g ∘ f 11 두 블록을 묶어서 그리면 합성함수가 됨
  11. 11. 12 여러 개의 작은 블록 사이로 데이터가 흐르도록 구성해서
  12. 12. ANYTHING 13 큰 소프트웨어 전체에 데이터가 흐르게 만들자!
  13. 13. © Google 14 공통점: 데이터의 흐름
  14. 14. 15 40년 된 아이디어
  15. 15. 16
  16. 16. 17 7~80년대가 지나면서 컨트롤 흐름 방식이 대세가 됨 데이터가 흐를 것인가 컨트롤이 흐를 것인가의 싸움
  17. 17. 18 컨트롤이 흐르는 튜링머신
  18. 18. 19 그 방식으로 승승장구한 회사 하지만 그래프가 꺾이기 시작
  19. 19. 20
  20. 20. 22
  21. 21. A = 3 B = 4 C = A + B A = 4 B = 5 print C 23 당연히 7이 출력될까?
  22. 22. 24 엑셀은 대표적인 Reactive Programming
  23. 23. C = A + B + A C B 25 순서대로 실행될 명령들이 아닌, 데이터가 흐르는 방법을 나타내는 것
  24. 24. 26 사실은 우리에게 너무나 익숙한 방식
  25. 25. 27 게이트 사이로 전기 신호가 흐름
  26. 26. © Behringer 28 믹서를 통해 오디오 신호가 흐름
  27. 27. © Manu Cornet 29 사람 사이의 모든 의사소통
  28. 28. Declarative Logic Abductive Answer Set Constraint Functional Inductive Functional Functional Logic Dataflow Reactive Cell-Oriented Structured Object-Oriented Prototype-BasedClass-Based ModularBlock-Structured Point-Free Style Procedural Event-Driven Service-Oriented Time-Driven Concurrent Relativistic Action Agent-Oriented Aspect-Oriented Automata-Based End-User Expression-Oriented Feature-Oriented Non-Structured Array Metaprogramming Template Reflective Homoiconic Automatic Flow-Based Concatenative Function-LevelValue-Level Imperative Semantic Concept ProbabilisticLanguage-Oriented Natural Language Discipline-Specific Domain-Specific Grammar-Oriented Intentional Programming Paradigms @ Wikipedia
  29. 29. Declarative Logic Abductive Answer Set Constraint Functional Inductive Functional Functional Logic Dataflow Reactive Cell-Oriented Structured Object-Oriented Prototype-BasedClass-Based ModularBlock-Structured Point-Free Style Procedural Event-Driven Service-Oriented Time-Driven Concurrent Relativistic Action Agent-Oriented Aspect-Oriented Automata-Based End-User Expression-Oriented Feature-Oriented Non-Structured Array Metaprogramming Template Reflective Homoiconic Automatic Flow-Based Concatenative Function-LevelValue-Level Imperative Semantic Concept ProbabilisticLanguage-Oriented Natural Language Discipline-Specific Domain-Specific Grammar-Oriented Intentional 31 … mov ah, 09h lea dx, msg int 21h …
  30. 30. Declarative Logic Abductive Answer Set Constraint Functional Inductive Functional Functional Logic Dataflow Reactive Cell-Oriented Structured Object-Oriented Prototype-BasedClass-Based ModularBlock-Structured Point-Free Style Procedural Event-Driven Service-Oriented Time-Driven Concurrent Relativistic Action Agent-Oriented Aspect-Oriented Automata-Based End-User Expression-Oriented Feature-Oriented Non-Structured Array Metaprogramming Template Reflective Homoiconic Automatic Flow-Based Concatenative Function-LevelValue-Level Imperative Semantic Concept ProbabilisticLanguage-Oriented Natural Language Discipline-Specific Domain-Specific Grammar-Oriented Intentional 32 typedef struct { int x, y } POINT; void foo(POINT *p) { if (p->x > 0) { p->y *= -1; } }
  31. 31. Declarative Logic Abductive Answer Set Constraint Functional Inductive Functional Functional Logic Dataflow Reactive Cell-Oriented Structured Object-Oriented Prototype-BasedClass-Based ModularBlock-Structured Point-Free Style Procedural Event-Driven Service-Oriented Time-Driven Concurrent Relativistic Action Agent-Oriented Aspect-Oriented Automata-Based End-User Expression-Oriented Feature-Oriented Non-Structured Array Metaprogramming Template Reflective Homoiconic Automatic Flow-Based Concatenative Function-LevelValue-Level Imperative Semantic Concept ProbabilisticLanguage-Oriented Natural Language Discipline-Specific Domain-Specific Grammar-Oriented Intentional 33 template<typename T> class Foo { T t; public: Foo(T t) : t(t) {} void foo() { cout << t; } };
  32. 32. Declarative Logic Abductive Answer Set Constraint Functional Inductive Functional Functional Logic Dataflow Reactive Cell-Oriented Structured Object-Oriented Prototype-BasedClass-Based ModularBlock-Structured Point-Free Style Procedural Event-Driven Service-Oriented Time-Driven Concurrent Relativistic Action Agent-Oriented Aspect-Oriented Automata-Based End-User Expression-Oriented Feature-Oriented Non-Structured Array Metaprogramming Template Reflective Homoiconic Automatic Flow-Based Concatenative Function-LevelValue-Level Imperative Semantic Concept ProbabilisticLanguage-Oriented Natural Language Discipline-Specific Domain-Specific Grammar-Oriented Intentional 34
  33. 33. 선언적 Logic Abductive Answer Set Constraint Functional Inductive 함수형 Functional Logic 데이터플로우 리액티브 Cell-Oriented 구조적 객체지향 Prototype-Based클래스 기반 모듈성블록 기반 Point-Free Style 순차적 Event-Driven Service-Oriented Time-Driven 동시적 Relativistic Action Agent-Oriented Aspect-Oriented Automata-Based End-User Expression-Oriented Feature-Oriented Non-Structured Array 메타프로그래밍 템플릿 리플렉션 Homoiconic Automatic Flow-Based Concatenative Function-LevelValue-Level 명령형 Semantic Concept ProbabilisticLanguage-Oriented Natural Language Discipline-Specific Domain-Specific Grammar-Oriented Intentional 35
  34. 34. 명령형 imperative 선언적 declarative 순차적 procedural 동시적 concurrent 36 생각하는 방식을 바꿔야 할 때
  35. 35. 37
  36. 36. Event-Driven 이벤트에 반응하기 Scalable 부하에 반응하기 Resilient 실패에 반응하기 Responsive 사용자에 반응하기 38
  37. 37. 1• • • 39
  38. 38. 10-3• • • 40
  39. 39. 10-6• • • 컨텍스트 스위치 41
  40. 40. 10-9• • • 42
  41. 41. • • • • • • • • 43 너무 느림!!
  42. 42. OUTPUT foo(INPUT a); 44 너무나 당연하게 입력이 들어가고 출력이 나올 때까지 스레드가 아무것도 하지 못한다고 가정하고 있음 객체지향 프로그래밍 패턴을 구성하는 인터페이스
  43. 43. • • • • • • • • 45 너무 느림!!
  44. 44. © Peter Thomas 46 사용자당 스레드 하나 점유 + 최하단의 JDBC가 블로킹
  45. 45. 47 스레드는 한정된 자원이라, 더 많은 사용자를 수용할 여유가 없다!
  46. 46. 48 스레드에게 자유를 돌려주는 리액티브 프로그래밍
  47. 47. 49 적은 스레드로도 더 많은 사용자를 수용가능
  48. 48. • • • • • • • 51
  49. 49. function foo(a, callback); 52 node.js와 vert.x의 치명적인 뻘짓
  50. 50. foo(a, function(err, result) { if (err) { // handle error } else { // use result } ); 53
  51. 51. // 흔한 콜백 지옥 function compositeTask(t0, callback) { task1(t0, function(err, t1) { if (err) { callback(err); } task2(t1, function(err, t2) { if (err) { callback(err); } task3(t2, function(err, t3) { if (err) { callback(err); } callback(null, t3); }); }); }); } 54
  52. 52. OUTPUT foo(INPUT a); 55 콜백 대신 어떻게?
  53. 53. M<OUTPUT> foo(INPUT a); 56
  54. 54. INPUT => M<OUTPUT> INPUT => OUTPUT 57
  55. 55. Checkpoint! 58
  56. 56. 59
  57. 57. 60
  58. 58. © Aditya Bhargava 61 어떤 값
  59. 59. © Aditya Bhargava 62 그 값을 감싸서 어떤 효과를 주는 것
  60. 60. © Aditya Bhargava Maybe, Option, Optional, Nullable 63 값이 없을 수도 있는 모나드 타입
  61. 61. © Aditya Bhargava 64 그냥 값에는 +3을 적용할 수 있었는데-
  62. 62. © Aditya Bhargava 65 모나드에는 바로 적용할 수 없다!
  63. 63. © Aditya Bhargava 66 그래서 map
  64. 64. © Aditya Bhargava 67 값이 없으면 아무 것도 하지 않음
  65. 65. © Aditya Bhargava 68 문맥을 유지한 채 함수를 적용할 수 있다!
  66. 66. f g 69 블록과 화살표로 나타내면…
  67. 67. +3 +4 © Aditya Bhargava 70
  68. 68. © Aditya Bhargava 71 여러 종류의 모나드 타입들
  69. 69. 72 움짤로 보는 모나드
  70. 70. 73
  71. 71. 74
  72. 72. 75
  73. 73. 76 unit, return, just mapMany, bind, thenCompose, >>=
  74. 74. a = unit(2) b = a.flatMap(x -> unit(x+3)) c = b.flatMap(y -> unit(y+4)) // c == unit(9) +3 +4 77
  75. 75. 하나 다수 동기 Try<T> Iterable<T> 비동기 Future<T> 78 ???
  76. 76. 79
  77. 77. 하나 다수 동기 Try<T> Iterable<T> 비동기 Future<T> Observable<T> 80
  78. 78. 81 비동기 데이터 스트림 쿼리 연산 병렬처리 제어 Rx Reactive Extensions (.NET, 2009) RxJava (2012) rxjava-scala rxjava-groovy rxjava-clojure rxjava-jruby rxjava-kotlin RxJS RxCPP RxPy (2011) (2012) (2013)
  79. 79. 82
  80. 80. Iterable (pull) Observable (push) 데이터 받기 T next() onNext(T) 에러 발생 throws Exception onError(Exception) 완료 returns onCompleted() 83
  81. 81. Iterable (pull) Observable (push) getDataFromLocalMemory() .skip(10) .take(5) .map(s -> s + "foo") .forEach(println) getDataFromNetwork() .skip(10) .take(5) .map(s -> s + "foo") .forEach(println) 84
  82. 82. +3 +4 Observable<int> add(Observable<int> input) { return input.map(x -> x+3) .map(y -> y+4); } 85
  83. 83. query1 query2 Observable<int> query1(int input); Observable<int> query2(int input); Observable<int> query(Observable<int> input) { return input.flatMap(query1) .flatMap(query2); } 86
  84. 84. x + y Observable<int> zip(Observable<int> xs, Observable<int> ys) { return zip(xs, ys, (x, y) -> x + y); } yx 87
  85. 85. • • • • • • • • • • 88
  86. 86. TCP Dispatcher Handler Handler Handler … Data Grid DB Driver … 89
  87. 87. TCP Dispatcher Handler Handler Handler … Data Grid DB Driver … 90 Node
  88. 88. Node 1 Node 2 Node 4Node 3 91
  89. 89. Node 1 Node 2 Node 4Node 3 92 Service
  90. 90. Service A Service B Service D Service C Service E 93
  91. 91. Service A Service B Service D Service C Service E 94
  92. 92. Service A Service B Service D Service C Service E 95
  93. 93. Event-Driven 이벤트에 반응하기 Scalable 부하에 반응하기 Resilient 실패에 반응하기 Responsive 사용자에 반응하기 96
  94. 94. 97
  95. 95. http://www.reactive-streams.org/ 98
  96. 96. 99
  97. 97. 100
  98. 98. 101
  99. 99. 102
  100. 100. 103
  101. 101. 105

×