Skip to content
ozt88 edited this page May 9, 2015 · 1 revision

HSHA (Half Sync Half Async)

앞에서 언급했지만 DB작업도 분명한 I/O작업이다. DB의 도움을 받지 않는 비지니스 서버는 흔치 않다. 그러면 DB서버와의 I/O작업은 어떻게 처리해야될 것인가? IOCP등의 비동기 서버를 돌린다면 DB의 I/O를 별도로 처리한다는 것은 골치아픈일이 될 것이다. 이때 도움을 받을 수 있는 것이 바로 HSHA패턴이다.

http://egloos.zum.com/javawork/v/1818696

HSHA패턴은 이름 그대로 네트워크 처리는 Async방식으로 진행하고, DB및 기타 데이터처리는 Sync방식으로 처리하는 것이다. 서로 다른 동기화 방식의 TASK 레이어가 있고, 두 레이어는 Message Queue를 통해 서로 통신한다. IOCP를 쓴다면 IOCP의 worker thread가 Async TASK Layer가 될 것이고, DB를 처리하는 DB Thread가 Sync TASK Layer가 될 것이다. IOCP를 통해 작업을 진행하다가 DB작업이 필요하면 Message Queue에 필요한 작업을 push하고, DB 쓰레드는 Message Queue를 Listen한 상태에서 Message에 작업이 들어오면 동기적으로 작업을 처리한다.

HSHA를 적용하면 데이터 또는 로직을 담당하는 레이어를 동기방식으로 동작하게 함으로써, 비동기 구현의 복잡하고 어려운 이슈들을 피할 수 있다. 실제로 성능이 필요한 부분에만 비동기 멀티쓰레드 작업을 진행하고, 그렇지 않은 부분은 간단한 동기적 프로그래밍을 통하여 구현하므로 보다 나은 작업 효율을 기대할 수 있다. 그리고 두 레이어간 접근은 오직 Message를 통한 통신뿐이므로, 독립적으로 커플링이 발생하지 않게 구현할 수 있다. 대신 레이어간 데이터가 이동할 때 오버헤드가 발생할 수 있다. Message Queue를 동기화하여 데이터를 복사하는 작업이 비동기 레이어 수준에서는 오버헤드를 발생시킬 수 있기 때문이다.