2016년 6월 20일 월요일

microservice 기반 meteor application 설계 /w DDP

특정 업무가 장애가 일어나도 전체가 다운되지 않는 서비스를 Meteor 로 만들 수 있지 않을까 라는 생각을 하고 있었는데 실제로 한번 해보았다.

로긴 서버와 N개의 업무서버가 하나의 DB를 바라보고 클라이언트에서 로긴 서버에 계정생성/접속 후 토큰을 꺼내와서 나머지 서버에 접속하는 그림을 그려보았다.

업무 서버의 경우 웹앱에서 접근 문제가 있기 때문에 CORS를 열어준다.

Meteor.startup ->
  WebApp.rawConnectHandlers.use (req, res, next)->
    res.setHeader "Access-Control-Allow-Origin", "*"
    next()

iOS/Android 앱의 경우는 사실 상관이 없지만 webApp인 경우엔 꼭 필요.

반대로 webApp 인 경우는 client 폴더에만 작업하면 되는데
가장 먼저 실행하는 파일(ex. client/lib) 에 DDP와 Collection 연결하는 부분을 만들어 준다.

# global namespace
@ddps =
  loginDDP : DDP.connect "http://localhost:4100"
  chatDDP : DDP.connect "http://localhost:4200"

# models
@Chats = new Mongo.Collection 'chats', ddps.chatDDP

그리고 Meteor App 이 시작하는 시점에 아래와 같이 구성한다.

Meteor.startup ->
  Meteor.connetion = ddps.loginDDP
  Tracker.autorun ->
    if Meteor.user()?
      unless Meteor.loggingIn()
        console.log Meteor.user()?.username
        ddps.chatDDP.call "login",
         resume: Accounts._storedLoginToken()
        , (e, r)->
          unless e
            console.log "chatDDP login", r
          else
            throw e
    else
      ddps.chatDDP.call "logout", (e)->
        console.log "chatDDP logout" unless e
      console.log "out"

Meteor.connection을 login의 DDP로 지정해놓으면 마치 자기 서버인것 처럼 쓸 수 있어서 편리하다.
그리고 Meteor.user() 가 Reactive Datasource 이므로 Tracker.autorun 안에서 로그인 서버에서 로그인/아웃시 다른 업무 서버도 로그인/아웃 하도록 DDP.call "login" method를 불러준다.

단,  DDP 로그인 시 Accounts 패키지의 _storedLoginToken()을 통해 token값을 꺼내서 로그인 방식과 상관없이 동일하게 처리하면 편리하다.

헬퍼나 템플릿 안에서 쓸때도 기존 방식과 거의 같다.

Template.chatroom.onCreated ->
  ddps.chatDDP.subscribe 'getChats', {}

onCreated 에선 this.subscribe (혹은 @subscribe) 대신 DDP.subscribe를 사용하고 Method.call도 같은 방식으로 ddps.chatDDP.call "addChat", params 와 같이 사용한다.

이와 같은 방식으로 개발 중인데 장단점을 따져보면
장점.
  1. 작게 나눠서 독립적인 서버를 개발하므로 단인 서비스의 복잡도가 낮다.
  2. 오류와 서버다운에 대해 독립적이고 스케일 아웃도 간편
  3. 싼 클라우드 호스팅을 여러개 나눠서 쓸 수 있다.
  4. I/O 부담을 분산한다.
단점.
  1. 개인 개발 서버 환경이 매우 무겁다.(......)
정도인데 꼭 Meteor 가 아닌 다른 프레임웍(Horizon이라던가 Phoenix라던가 혹은 기타 레거시 웹서비스등등)하고 연동도 자유로와서 꽤 연구 가치가 있다.