NHibernate와 TPL (Task Parallel Libraray) 조합하기 Parallel & Cloud

올해, 제가 심혈을 기울여 공부한 부분이 Parallel Programming 부분입니다.
회사 내부 Core 모듈을 모두 TPL (Task Parallel Library)를 활용할 수 있도록 확장하고, 몇가지 예제만을 추가한 정도였습니다.

이번에 실전 프로젝트에 투입되어, 사용되어진 부분이 있어, TPL 의 장점을 알리고 싶어 글을 씁니다.


위 이미지는 기계 설비를 모니터링해서 (RS-485 통신) DB에 센서 데이타 값을 저장하고, Application에 Display 하는 프로그램의 단위 테스트 결과입니다.  모니터링과 DB 저장에 대해서는 테스트 한 결과입니다. 화면 Display는 당연히, 다른 단위테스트 기법을 이용해야 하니까요^^

어쨌든, 위에는 3가지 방식으로 작업을 수행하였습니다. RS-485 통신상에서 약 1.5초가 소요되므로, 실제 DB 작업은 모두 1.5초를 빼면 됩니다...

보시다시피, 보통의 동기 방식은 2.53초 정도, 비동기 방식은 1.68초 정도 입니다. Parallel.ForEach 도 병렬 방식이기는 하나, 강제로 병렬차원을 8로 주어서, 성능 감소가 되었습니다.
결국 데이터 통신에 쓰이는 1.5초를 빼면, NHibernate로 DB 저장 작업에 동기 방식은 1.03초가 걸렸고, 비동기 방식은 0.18초가 소요되었습니다.

NHibernate는 기본적으로 ISession이 Thread-safe 하지 않습니다. 즉 Thread별로 Session이 독립적이라 어찌보면, 멀티스레딩 프로그래밍 기법과는 어울리지 않을 수 있습니다.

뭐 그렇다면, ASP.NET 웹 응용프로그램에 NHibernate을 쓰는 것은 그리 효율적이지 못할 수도 있다는 얘기지요. 
개인적으로 이 말에 공감합니다.

다만, 잘 사용하면, NHibernate을 이용한 생산성과, 유지보수성이 멀티스레딩 프로그램을 전혀 모르는 개발자가 ADO.NET만을 이용하여 만드는 제품보다 견고하다고 봅니다. 결국 Tool 이 문제가 아니라 어떻게 잘 구성하느냐에 방점을 둘 수 있다는 것입니다.

어찌됐건, NHibernate도 Second-level cache 를 이용하고, TPL 을 이용한 비동기 방식 작업을 수행하게 된다면, 상당한 효과를 볼 수 있습니다.

결국 제대로 병렬 프로그램을 구현하게 되면 상당히 잇점이 많다는 것을 보실 수 있습니다.

실제 응용프로그램에서는 UI에 Data를 Update해서, 다시 그리는 작업까지 들어오게 된다면, 필히, 모든 작업들이 비동기 방식으로 이루어져야 매끄럽게 실행될 것입니다.

아직 비동기 방식 프로그래밍 기법이라던가, 병렬 프로그래밍 기법을 모르신다면, 올해 안에 정복해 보시기 바랍니다.