금주의 Azure 질답 – 201602 둘째주

오늘은 Azure WebJob에 대한 내용을 공유합니다. 참고로 WebJob은 Azure WebApp 제품군 내에 있는 백그라운드 워커입니다.

저는 Azure WebJob을 테스트용으로만 쓰고 프로덕션에서는 사용하지 않는데 그럼에도 종종 다루는 이유는 (1) 아직 미숙할 뿐이지 나쁜게 아니라서 관심을 가지는 것은 좋기 때문이며, (2) Azure 팀에서 WebJob에 공을 많이 들이고 발전 속도도 빠르기 때문입니다.

다시 말해, WebApp은 이제 발전할거라곤 모니터링 보강과 프레임워크 버전 향상 말고는 딱히 없는데 WebJob은 MVP들의 의견도 활발히 받고 GitHub 이슈에도 즉각적으로 반응하고 있습니다.

WebJob은 뭐랄까…애증의 존재죠. 아 쫌만 더 좋으면 쓰겠는데 아직 약간 부족한 느낌이 드는. 그 부족한 느낌은, 컨셉이 아닌 모니터링과 관리에 대한 이슈입니다. 이게 도는지 안도는지 확신이 잘 안드는거죠.

1. Azure WebJob에서 지원되는 닷넷프레임워크 버전은 무엇인가요?

원문링크: http://stackoverflow.com/q/35371522/361100

저도 최신버전이 나오면 별 생각없이 업그레이드 하는 편입니다만, WebJob은 현재 4.6까지 지원됩니다. 최신 닷넷프레임워크인 4.6.1은 안됩니다.

문제는 배포 실패로 안뜨고 일단 실행은 되는데 에러메시지가

Job failed due to exit code -2146232576

위에처럼 나옵니다. 하지만 곧 4.6.1이 지원될 예정이랍니다.

2. Azure WebJob을 staging에서는 안돌리고 싶어요.

원문링크: http://stackoverflow.com/q/24438789/361100

WebApp은 여러개의 deployment slot을 가질 수 있고 이는 staging/production을 swap할 때 유용합니다. staging 상태에서는 돌지 않게 하려면

WEBJOBS_STOPPED = 1

위와같이 configuration을 넣어두면 됩니다.

추가로 이용할 수 있는 Configuration은 아래 링크에 있습니다.
https://github.com/projectkudu/kudu/wiki/Web-jobs#configuration-settings

3. WebJob이 중간에 멈춰요.

원문링크: http://stackoverflow.com/q/27939766/361100

Triggered-mode WebJob의 실행 허용시간은 기본적으로 60초입니다. trigger로 실행된 WebJob의 경우, 60초 후에 프로세스가 끝났는지를 보고 n초 후에 종료시킵니다. 그래야 다음에 올 트리거를 받을 수 있을테니까요.

조절할 수 있는 시간은 ‘끝났는지 확인하는 60초’를 바꾸는 것이 아니라 ‘안끝났을 때 기다리는 n초’입니다. 최대 얼마까지 가능한지는 문서에 나와있지 않지만 10분은 넘는 것으로 압니다.

Continuous-mode WebJob의 실행 허용시간은 딱히 제한은 없습니다. 무한루프로 구현되기 때문이지요. 다만 어떠한 이유로 중지시킬 때는 미리 알려주는 장치가 있습니다.

WebJob의 환경변수인 WEBJOBS_SHUTDOWN_FILE에 지정된 파일을 작성하는 것이지요. WebJob이 강제종료하기 전에 파일이 생성되고, 우리가 만든 무한루프 로직은 이 파일이 생성되었는지 FileWatcher를 통해 확인한 후 무한루프를 종료하는 방식으로 작성하면 보다 안정적인 WebJob을 구현할 수 있습니다.

Azure 개발팀에 있는 Amit Apple 님의 코드를 빌려오자면 아래와 같습니다.

public class Program
{
    private static bool _running = true;
    private static string _shutdownFile;

    private static void Main(string[] args)
    {
        // Get the shutdown file path from the environment
        _shutdownFile = Environment.GetEnvironmentVariable("WEBJOBS_SHUTDOWN_FILE");

        // Setup a file system watcher on that file's directory to know when the file is created
        var fileSystemWatcher = new FileSystemWatcher(Path.GetDirectoryName(_shutdownFile));
        fileSystemWatcher.Created += OnChanged;
        fileSystemWatcher.Changed += OnChanged;
        fileSystemWatcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.FileName | NotifyFilters.LastWrite;
        fileSystemWatcher.IncludeSubdirectories = false;
        fileSystemWatcher.EnableRaisingEvents = true;

        // Run as long as we didn't get a shutdown notification
        while (_running)
        {
            // Here is my actual work
            Console.WriteLine("Running and waiting " + DateTime.UtcNow);
            Thread.Sleep(1000);
        }

        Console.WriteLine("Stopped " + DateTime.UtcNow);
    }

    private static void OnChanged(object sender, FileSystemEventArgs e)
    {
        if (e.FullPath.IndexOf(Path.GetFileName(_shutdownFile), StringComparison.OrdinalIgnoreCase) >= 0)
        {
            // Found the file mark this WebJob as finished
            _running = false;
        }
    }
}

더 자세한 내용은 WebJob을 개발하고 있는 분의 블로그를 확인해보세요.
http://blog.amitapple.com/post/2014/05/webjobs-graceful-shutdown/#.VNqThvmG8oc

추가로, 아래 링크에서 WebJob을 모니터링하는 방법에 대하여 알려줍니다.

http://jasonhaley.com/post/Monitor-the-Status-of-an-Azure-WebJob

4. Continuous WebJob 실행주기를 설정하고 싶어요.

원문링크: http://stackoverflow.com/q/29625813/361100

기본적으로 Continuous WebJob의 인터벌은 5초입니다. 이를 변경하는 방법이 나와있습니다.

사실 이것을 구현하기 위한 방법은 세가지가 있습니다.

  1. 제가 즐겨쓰는건데, Azure Scheduler를 이용해서 WebApp에서 GET을 불러주는겁니다. 네, WebJob을 쓰지 않는거죠.
  2. 전통적인 Thread.Sleep이나 Task.Delay를 쓰는 경우 (링크의 채택된 답변)
  3. WebJob Timer Extention을 이용하는 경우: http://stackoverflow.com/a/34963841/361100 사실 2번 방법인 Thread.Sleep은 기계어 실행을 중지하고 CPU 카운트만 돌리는 것이므로 의도한 지연 실행과는 다른 의미라고 할 수 있습니다. ‘결과가 같은거니 그냥 쓴다’는 셈이죠. 그러므로 WebJob을 위해 만들어진 이 방법을 추천합니다.

YJ

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중