배치작업 WebJob
Ex) 일일 재고수준 파악 후 외부 서비스에 보고
Azure function 말고, 웹작업으로 하고 싶은 경우
그리고 기존 웹서비스에는 영향없이 백그라운드로 돌리고 싶은 경우
Ex) 고해상도이미지들 -> 썸네일 추출
특정 DB 프로시져 호출하는 웹job도 가능
모두 지원
Windows 배치 파일
PowerShell 스크립트
Bash 셸 스크립트
업로드 가능
Visual Studio를 사용하여 웹 작업을 컴파일된 콘솔 애플리케이션으로도 가능
파이썬, node.js 기반
크게 두 종류
-
연속
-
트리거
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 |