vert.x에서 mongo db 연동 부분과 관련한 질문

2014-10-27 14:51

최근 vert.x를 학습할 기회가 있어 학습하다가 궁금한 점이 있어 질문을 남긴다. 먼저 다음 소스 코드를 기준으로 몇 가지 질문을 남겨본다.

matcher.get("/zips/:id", new Handler<HttpServerRequest>() {
    public void handle(final HttpServerRequest req) {
        String idToRetrieve = req.params().get("id");
        JsonObject matcher = new JsonObject().putString("_id", idToRetrieve);
        JsonObject json = new JsonObject().putString("collection", "zips")
                .putString("action", "find")
                .putObject("matcher", matcher);
        vertx.eventBus().send("mongodb-persistor", json, new Handler<Message<JsonObject>>() {
            @Override
            public void handle(Message<JsonObject> event) {
                req.response().putHeader("Content-Type", "application/json");
                if (event.body().getArray("results").size() > 0) {
                    JsonObject result = event.body().getArray("results").get(0);
                    req.response().end(result.encodePrettily());
                }
            }
        });
    }
});

위 예제 소스 코드는 https://github.com/josdirksen/smartjava/tree/master/vertx-demo-1 에 있는 코드의 일부이다.

위 소스 코드의 흐름은 다음과 같다.

  • 사용자 요청으로 /zips/:id 이벤트가 발생한다.
  • /zips/:id 이벤트가 Event Queue에 등록된다.
  • Single Thread가 Event Loop를 돌면서 Handler를 실행한다.
  • 로직 구현을 완료한 후 "mongodb-persistor" 이벤트를 Event Bus에 보내 Event Queue에 등록한다.
  • Event Loop는 "mongodb-persistor" 이벤트를 만나 mongodb persistor 모듈에 Mongo DB와의 연결 작업을 위임한다.
  • Mongo DB에 요청을 보낸 후 응답이 오면 Handler를 호출에 클라이언트에 응답한다.

위 과정을 대략적으로 살펴보면 위와 같이 동작하는 것으로 볼 수 있다. vert.x 에서 위 모든 과정은 Single Thread에 의해 동작한다.

여기서 궁금한 점은 Mongo DB에 쿼리를 보내고 응답을 받는 부분의 소스 코드를 보면 동기적으로 동작한다는 것이다. 지금까지 내가 파악한 소스 코드로 보면 비동기적으로 동작하는 부분을 찾지 못했다. 이와 같이 동기적으로 동작할 경우 Event Loop의 속도의 응답 속도를 저하시켜 성능상에 문제가 발생할 가능성이 있지 않을까하는 것이다. 아니면 내가 잘못 이해하고 있나?

아직 Single Thread로 동작하는 Non Blocking 서버 구조에 익숙하지 않아서 그런지 DB 연동과 같은 부분을 Single Thread로 처리하는 것이 성능상에 이슈가 되지 않을까라는 우려감이 있다. 기존의 틀에 너무 사로잡혀 있다보니 Non Blocking 서버 사고 방식에 익숙해 지는데 시간이 걸릴 듯하다.

node.js도 나름 재미있었는데 vert.x도 재미있네. 앞으로 사용하면 유용한 곳이 많겠다.

0개의 의견 from FB

3개의 의견 from SLiPP

2014-10-27 15:26

vertx.eventBus().send("mongodb-persistor", json, new ReplyHandler(req, data));"

바로 밑에 callback 함수가 작성되어있어서 동기적으로 동작하는 것으로 보일 수 있지만 callback으로 async하게 동작하는 게 맞는 거 같아요.

2014-10-27 15:58

mongo-persistor 모듈은 (https://github.com/vert-x/mod-mongo-persistor ) worker모듈이라고 되어 있네요 일단 verticle과 다르게 worker들은 ELP 스레드에서 돌아가지 않고 스레드 풀에서 선택된 스레드 내에서 동기로 동작합니다. (VertxExecutorFactory.java를 보시면 스레드 풀 사이즈는 디폴트로 20개로 잡혀있고, deploy할 때 혹은 시스템 환경 변수로 설정도 가능합니다.)

이미 대부분 아시는 내용이겠지만, 발번역한 vertx 공식 가이드도 첨부해 드립니다.

vertx main manual https://www.evernote.com/shard/s173/sh/86747e7e-e6e5-4bd0-85a0-522060ba5a9c/51a25a87026ac0530f7746315fcadf45

vertx module manual https://www.evernote.com/shard/s173/sh/cd9b3888-d05d-4fb3-97c1-4518507dae97/84311f88a56f83d05c599c72daf69173

vertx java manual(일부만) https://www.evernote.com/shard/s173/sh/4e5db756-5417-4b15-962c-9914d981718f/7b48e79ab20e48e6022a0ea62ee97d43

2014-10-27 17:04

@cloude.lee 답변 감사합니다. 지금까지 계속 의문을 가지고 있었는데 mongo persistor 모듈 문서를 제대로 읽어보지 않았네요. worker 모듈이라는 문장만 읽었다면 지금까지 가지고 있었던 모든 의문이 쉽게 풀렸을텐데요. 역시 질문을 남기기 잘했네요. "This is a multi-threaded worker module." 이 문장 하나로 게임 끝이네요.

저도 vert.x 파기 시작한 지가 얼마되지 않았는데 공유해 주신 문서 잘 보겠습니다.

의견 추가하기