배치작업 WebJob 

Ex) 일일 재고수준 파악  외부 서비스에 보고 

 

Azure function 말고, 웹작업으로 하고 싶은 경우 

그리고 기존 웹서비스에는 영향없이 백그라운드로 돌리고 싶은 경우 

Ex) 고해상도이미지들 -> 썸네일 추출 

특정 DB 프로시져 호출하는 job 가능 

 

모두 지원 

Windows 배치 파일 

PowerShell 스크립트 

Bash 셸 스크립트 

 

업로드 가능 

 

Visual Studio를 사용하여 웹 작업을 컴파일된 콘솔 애플리케이션으로도 가능 

파이썬, node.js 기반 

 

 

크게  종류 

  1. 연속 

  2. 트리거  

Auzre Function Webjob 차이점 

거의 같으나, 

Fuction 

WebJob 

기존 웹소스와 별개로 관리 

기존 웹소스와 하나의 패키지로 관리가능 

 

JobHost 개체의 동작에 대해 더 정교하게 제어할 수 있다 

 

 

VS에서 실습 

콘솔애플리케이션을 만들어, webjob템플릿 사용가능, 기존 웹앱 솔루션에 추가 

각 프로그램, config 설명

 Program.cs 

애플리케이션의 진입점인 Main() Main에서 JobHost개체를 시작하고 구성 

JobHost는 웹 작업이 배포된 후 Azure와 통신하는 개체  

new HostBuilder() 

Functions.cs 

 작업이 실행하는 실제 작업 내용 코딩 

 

settings.json 

cron식으로 일정 기록 

{ "schedule": "0 0 12 * * ?" } 

 

App.config 

DB연결, Azure Storage정보  연결문자열 기록 

 

functions.json 

 

바인딩을 사용하려면 사용 

Direction in / out  

 

 

CRON  

설명 

0 0 12 * * ? 

매일  12시에 실행 

0 15 10 * * ? 

매일 오전 10 15분에 실행 

0 15 10 ? * MON-FRI 

매주 평일 오전 10 15분에 실행 

0 15 10 ? * 6L 

매월 마지막  금요일 10 15분에 실행 

 

APP템플릿 통해서 만들면, 아래와 같은 네임스페이스가 그냥 들어오겠지? 

  • Microsoft.Azure.WebJobs 

  • Microsoft.Azure.WebJobs.Extensions 

 프로그램에서 활용하려면 위와 같은 네임스페이스 추가 

 

예시) 

Azure Storage SDK를 사용하여 설정된 간격으로 스토리지 계정에 큐 메시지를 만듭니다.  

스토리지 계정에서 로그 확인 가능 

단순하게, 특정 메시지(시간기록) Azure Queue 기록 

 

var queue = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageAccount"].ConnectionString) 

    .CreateCloudQueueClient() 

    .GetQueueReference("stockchecks"); 

 

queue.CreateIfNotExists(); 

 

while (true) 

{ 

    var timestamp = DateTimeOffset.UtcNow.ToString("s"); 

 

    var message = new CloudQueueMessage($"Stock check at {timestamp} completed"); 

    queue.AddMessage(message); 

 

    Thread.Sleep(TimeSpan.FromSeconds(30)); 

} 

 

 

Main함수에 아래와 같이 사용 

(기존 무한루프 형식 안써도 ) 

static void Main(string[] args) 

{ 

    var builder = new HostBuilder(); 

    builder.ConfigureWebJobs(b => 

            { 

                b.AddAzureStorageCoreServices(); 

            }); 

    var host = builder.Build(); 

    using (host) 

    { 

        host.Run(); 

    } 

} 

 

 

<바인딩> 

아래   각종 트리거를 바인딩하는 형태 예시 

 트리거 발동  비즈니스 로직 수행하도록 개발 

바인딩을 사용하려면 웹 프로젝트에 functions.json 기록 Direction in/out  있음  

Azure 큐에 메시지가 들어올때 

public static void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger logger) 

{ 

    logger.LogInformation(message); 

} 

Azure Storage 신규 blob파일이 추가될때 

[FunctionName("BlobTriggerCSharp")] 

public static void Run([BlobTrigger("watchescontainer/{name}")] Stream watchInstructions, string name, ILogger log) 

{ 

    log.LogInformation($"A new blob was added.\n Name:{name} \n Size: {watchInstructions.Length}"); 

} 

 

Azure CosmosDB 신규 데이터가 들어올  특정 database, 컬력션명 지정 

[FunctionName("CosmosTrigger")] 

public static void Run([CosmosDBTrigger( 

    databaseName: "ToDoItems", 

    collectionName: "Items", 

    ConnectionStringSetting = "CosmosDBConnection", 

    LeaseCollectionName = "leases", 

    CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents, 

    TraceWriter log) 

{ 

    if (documents != null && documents.Count > 0) 

    { 

        log.Info($"Documents modified: {documents.Count}"); 

        log.Info($"First document Id: {documents[0].Id}"); 

    } 

} 

 

 

추가 예시 

기존 ProcessQueueMessage 메서드를 아래와 같이 바꿔서 사용가능 

 

public static void ConfirmStockCheck([QueueTrigger("stockchecks")] string message, [Blob("confirmations/{id}")] out string output) 

{ 

    var timestamp = message.Split()[3]; 

    output = $"{timestamp} stock check successfully processed"; 

} 

 

stockchecks 큐의 메시지를 처리하고 해당 메시지를 사용하여 confirmations 컨테이너에 BLOB을 만듭니다. 웹 작업 SDK는 stockchecks 큐의 모든 메시지에 대해 이 함수를 한 번 호출하며, message 매개 변수는 메시지 내용을 포함합니다. output의 값은 confirmations 컨테이너의 새 BLOB에 자동으로 기록됩니다. 새 BLOB의 이름은 함수를 트리거한 큐에서 수신된 메시지의 메시지 ID입니다. 

 

 




'기술(Azure 만...) > [MS]Azure PaaS' 카테고리의 다른 글

웹앱 스케일링  (0) 2019.09.02
webapp 소스 가져오기, sync 다양한 방법  (0) 2019.08.13
Azure SQL databse , 스케일링  (0) 2019.05.15
CosmosDB 실습  (0) 2019.03.29
PaaS WebApp Application Insights  (0) 2019.03.29

+ Recent posts