[입 개발] Cassandra 의 Stage 와 SEDA

다들 알고 있듯이 Cassandra 는 SEDA 라는 Architecture를 사용하고 있습니다. SEDA는 간단하게 말하면 내부적으로 thread로 구분되는 stage 라는 것들이 존재하고 이 stage 간에는 Queue 를 통해서 데이터를 주고 받아서 각 stage 만의 작업을 처리하는 아키텍처입니다. SEDA 는 다음 https://www.google.ca/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&sqi=2&ved=0CDoQFjAB&url=http%3A%2F%2Fwww.eecs.harvard.edu%2F~mdw%2Fpapers%2Fseda-sosp01.pdf&ei=Ev0ZUfCuB8GriALLx4CABg&usg=AFQjCNHGulXCMJpiRQ7QfqK8eF2TLmEVRw 에서 보실 수 있습니다.

 

그래서 Cassandra의 소스는 위의 SEDA 아키텍처로 구현되어 있으므로, 소스 코드를 따라가기가 복잡합니다. 그래서 단순히 소스를 보는 것보다는 어떤 Stage 가 있는지를 이해하는 게 좀 더 도움이 될 것 같습니다.  org.apache.cassandra.concurrent/StageManager.java를 살펴보면 됩니다. multiThreadedConfigurableStage 나 multiThreadedStage 의 경우 두번째 파라매터는 몇개의 스레드를 생성할 것인지를 나타냅니다.

    static
    {
        stages.put(Stage.MUTATION, multiThreadedConfigurableStage(Stage.MUTATION, getConcurrentWriters()));
        stages.put(Stage.READ, multiThreadedConfigurableStage(Stage.READ, getConcurrentReaders()));
        stages.put(Stage.REQUEST_RESPONSE, multiThreadedStage(Stage.REQUEST_RESPONSE, FBUtilities.getAvailableProcessors()));
        stages.put(Stage.INTERNAL_RESPONSE, multiThreadedStage(Stage.INTERNAL_RESPONSE, FBUtilities.getAvailableProcessors()));
        stages.put(Stage.REPLICATE_ON_WRITE, multiThreadedConfigurableStage(Stage.REPLICATE_ON_WRITE, getConcurrentReplicators(), MAX_REPLICATE_ON_WRITE_TASKS));
        // the rest are all single-threaded
        stages.put(Stage.GOSSIP, new JMXEnabledThreadPoolExecutor(Stage.GOSSIP));
        stages.put(Stage.ANTI_ENTROPY, new JMXEnabledThreadPoolExecutor(Stage.ANTI_ENTROPY));
        stages.put(Stage.MIGRATION, new JMXEnabledThreadPoolExecutor(Stage.MIGRATION));
        stages.put(Stage.MISC, new JMXEnabledThreadPoolExecutor(Stage.MISC));
        stages.put(Stage.READ_REPAIR, multiThreadedStage(Stage.READ_REPAIR, FBUtilities.getAvailableProcessors()));
        stages.put(Stage.TRACING, tracingExecutor());
    }

각각의 Stage 에서 하는 역할은 좀 더 자세히 살펴본 후에 다시 공유하도록 하겠습니다.