Windows Azure Worker Role에 여러 진입점 클래스가 있는 경우

안녕하세요. Windows Azure MVP 남정현입니다.

간단하지만 간과하기 쉬운 팁을 하나 공유하려고 합니다. Windows Azure Cloud Service를 .NET Framework 기반으로 개발할 때 있을 수 있는 일에 대해 이야기하려고 합니다. Cloud Service에 Worker Role을 추가할 때, Worker Role의 진입점에 관련된 팁을 알려드리기 위하여 글을 씁니다.

Worker Role은 전통적인 .NET 기반 응용프로그램들과는 다르게, 클래스 라이브러리 형식의 어셈블리를 만들고, 그 어셈블리가 클라우드 서비스 패키지 파일에 들어가게 됩니다. Windows Azure Fabric Controller는 관리자가 제출한 클라우드 서비스 패키지 파일을 열어서 그 안에 들어있는 진입점 어셈블리를 찾아서, 해당 어셈블리 내에 존재하는 진입 클래스를 선택하여 서비스 기동을 시작하게 됩니다. 이 과정에서 사용하게 되는 것이 .NET Framework의 핵심 기능들 중 하나인 Reflection입니다.

만약 Worker Role로 만든 어셈블리 안에서 RoleEntryPoint를 기본 클래스로 정의한 클래스가 하나 이상 들어있다면 어떤 일이 벌어질까요? 오름차순으로 정렬했을 때 가장 먼저 열거될 수 있는 클래스만이 진입점으로 선택됩니다.

이러한 문제를 해결하기 위한 방법은 정리하면 다음과 같습니다.

  • 실제로 사용할 Entry Point 클래스 하나만을 Worker Role 어셈블리 안에 배치합니다.
  • 나머지 모든 RoleEntryPoint를 상속받는 클래스들은 다른 클래스 라이브러리에 만들어서 이동시킵니다.
  • Worker Role 어셈블리에서 새로 만든 클래스 라이브러리를 참조합니다.
  • 컴파일이나 런타임 오류가 발생하지 않도록 코드를 정리합니다.

그리고 이 문제가 더 부각되는 것은 Worker Role 어셈블리 안에서 상속 등의 기능을 사용하여 여러 Entry Point를 구현하게 될 경우입니다. 실제로 사용하고픈 Entry Point는 따로 있지만 이름의 순서 상 다른 진입점이 먼저 나오면 이상하게 동작하는 것 처럼 보이게 됩니다. 여기에, 만약 먼저 검색되는 Worker Role EntryPoint 클래스가 추상 클래스이거나 인수 없이 호출하는 기본 생성자를 제외시킨 경우 서비스가 전혀 실행되지 않을 수도 있습니다. 이런 경우 이 글의 내용을 참고하여 문제 해결을 시도해보기 바랍니다.

댓글 남기기