리액티브 프로그래밍을 접해보고, 아키텍쳐에 대해서 배우다보니 무슨무슨 드리븐에 대해서 엄청나게 많이 듣는다. 그 중에서도 헷갈리던 개념인 Message Driven, Event Driven에 대해서 정리되어 있는 글이 있길래 번역하여 이해해보고 어떻게 사용하는 게 올바른 것인지 이해해보자.
일단, 배우게 된 리액티브 프로그래밍에 대해서 잠깐 봐보자.
Reactive Systems rely on asynchronous message-passing to establish a boundary between components that ensures loose coupling, isolation and location transparency.
리액티브 시스템은 비동기적인 메시지 패싱에 의존한다고 되어있다.
의존하는 이유는 세가지이다.
이랬을 때의 장점으로는
부하관리가 가장 큰 것 같고 탄력성, message queue를 통한 모니터링 및 흐름 제어가 존재한다.
Message는 특정한 주소로 data를 보내는 것이다.
Message Driven은 각각의 컴포넌트가 특정한 주소를 가지고, 다른 컴포넌트도 메세지를 보낼 수 있는 구조라고 한다.
이해하기로는 그냥 현재의 RESTful API들이다.
반면에 Event는
컴포넌트에서 데이터를 던진다. 아무나에게! 시간 괜찮은 사람이 처리해달라고.
전통적인 프로그래밍 모델들은 컴포넌트 A가 컴포넌트 B의 메소드를 호출하는 식으로 동작하였다.
Message Driven System에서는 컴포넌트 A는 메세지를 만들고 컴포넌트 B의 주소로 배달되어야한다.
Event Driven에서 컴포넌트들은 이벤트를 expose하는 위치만을 알려준다.
그래서 둘의 차이는 뭘까?
Message Driven은 누가 메세지를 받아서 처리하는지 정해져(fixed) 있다.
(아는 사람 -> 아는 사람)
Event Driven은 일단 이벤트를 던져버린다. '누군가 처리해주겠지'라는 생각으로. 그리고 consumer들은 이를 받아서 처리한다.
(아는 사람 -> 모르는 사람)
하지만 여전히 혼동하기 쉬운 개념들이다. 마지막으로 정리를 해본다면,
Message Driven -> 시스템의 building block을 나타내고
Event Driven -> 시스템의 상위 수준 속성(higher level property)(==architecture)
따라서, Message Driven tool들을 사용하여 Event Driven System을 만들 수 있다는 뜻이다. == kafka를 사용하여 Event Driven을 만든다고 생각한다.
Message Driven은 도구이고, Event Driven은 구조이다.
-> 이벤트 드리븐 아키텍쳐에서 채택할 수 있는 도구 중 하나가 메세지 드리븐이라고 생각하게 되었다. 다른 도구는 무엇이 있는데? 라고한다면 아직... 모르겠다. 어떤 게 더 있는지는 좀 더 찾아봐야할 것 같다.