Django
Django는 MVC패턴과 유사한 MVT(Model, View, Template)구조를 기반으로하는 웹 프레임워크입니다.
위의 패턴을 기반으로한 동기식 처리 방식을 기본으로 합니다.
Node.js
Node.js는 싱글 스레드의 이벤트 루프기반 비동기식 I/O 처리 모델을 가지고 있는 Javascript Runtime 환경입니다.
Event Loop
이벤트가 발생하면 event loop 는 해당 이벤트가 동기 이벤트인지 비동기 이벤트인지 판별 합니다. 동기 이벤트이면 call stack으로 해당 이벤트를 push하며 만약 해당 동기 이벤트가 callback함수를 가지고 있다면 callback 을 event queue에 담습니다. 비동기 이벤트면 O/S kernel 에게 해당 작업을 위임합니다.
Call Stack
두가지 이벤트 타입중 동기 작업만 수행합니다. call stack은 event loop에 의해 push된 이벤트를 실질적으로 수행하는 역할을 하며 같은 스레드를 사용하는 event loop는 자동으로 blocked됩니다.
Event Queue
event loop가 만나는 이벤트들 중 callback함수를 포함하고 있는 이벤트들이 있는데 이 callback 함수들이 event queue에 들어가게 됩니다. 그리고 처음 이벤트 작업이 call stack에서 완료될 시 event loop는 위 설명처럼 blocked 되어 있다가 event queue의 callback 을 꺼내 다시 call stack 에 넣어줍니다.
위의 설명처럼 비동기식 처리 방식을 기본으로 합니다.
개인적으로는 둘 다 적합하다고 생각됩니다만, Linko 서비스 특성 상, 잦은 이벤트를 처리해야할 것이며, 많은 네트워크 요청이 있을 것으로 예상됩니다. 이에 따른 장단점을 생각해본다면
사용할 것으로 예상되는 인프라는 AWS이며, 사용할 서비스로는 다음과 같습니다.
AWS Lamda
- 이벤트에 의해 자동으로 트리거되는 환경을 제공합니다. 저희는 여러 엔드포인트를 호출할 것으로 예상되며 이벤트 기반 아키텍처를 사용하는데 용이할 것으로 예상됩니다.
AWS API Gateway
- 위 사진처럼 여러개의 엔드포인트 호출이 발생했을 때, API gateway로 요청을 보내게 되고, API Gateway에서 각각의 Microservice로 전달하는 일종의 프록시 역할을 해주는 서비스입니다.
여러 디자인 패턴 중, Pub/Sub모델로 알려진 옵저버 패턴이 Linko서비스와 가장 잘 어울린다고 생각되어 옵저버 패턴에 대해서만 설명하겠습니다.
Observer Pattern은 Observer(관찰자)들이 관찰하고 있는 Subject(대상자)의 상태가 변화가 있을 때마다 대상자는 직접 목록의 각 관찰자들에게 통지하고, 관찰자들은 알림을 받아 조치를 취하는 패턴입니다.
즉, Subject(트리거)의 이벤트가 발생하면, Observer들이 해당 이벤트를 수신하여 지정된 액션을 취하는 패턴으로, 이벤트 함수(Subject)가 실행되면, 그에 따른 콜백함수(Observer)가 실행되는 것으로 이해했습니다.
예를 들어 Naver의 이메일이 도착하면(Subject, trigger) 지정해둔 Slack또는 Discord에 메세지를 보낸다(Observer, action).
또는, 구독해둔 유튜버의 동영상이 업로드되면(Subject, trigger), 구독자들에게 알림이 간다(Observer, action).
저희 Linko서비스는 어떤 플랫폼을 기준으로 트리거를 설정해두고, 트리거가 발동된다면 지정해둔 액션을 취하는 서비스이므로 Observer 패턴이 적합하다고 생각합니다.