특정 업무가 장애가 일어나도 전체가 다운되지 않는 서비스를 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
로긴 서버와 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 와 같이 사용한다.
이와 같은 방식으로 개발 중인데 장단점을 따져보면
장점.
- 작게 나눠서 독립적인 서버를 개발하므로 단인 서비스의 복잡도가 낮다.
- 오류와 서버다운에 대해 독립적이고 스케일 아웃도 간편
- 싼 클라우드 호스팅을 여러개 나눠서 쓸 수 있다.
- I/O 부담을 분산한다.
단점.
- 개인 개발 서버 환경이 매우 무겁다.(......)
정도인데 꼭 Meteor 가 아닌 다른 프레임웍(Horizon이라던가 Phoenix라던가 혹은 기타 레거시 웹서비스등등)하고 연동도 자유로와서 꽤 연구 가치가 있다.
댓글
댓글 쓰기