SlideShare a Scribd company logo
코드로 바로 해버리는
서버리스 오케스트레이션
Azure Durable Functions
이종인
DesignMe AI
Microsoft Developer Technologies MVP
소개
이종인
I LOVE .NET ❤ ❤ ❤
 DesignMe라는 서비스를 만드는 사람
 Microsoft Developer Technologies MVP
(2014 ~ 현재)
 모여서 각자 코딩하는 모임
 C# 모바일 개발자 모임
Azure Functions
클라우드로 일어난 변화
클라우드 기술이 발전하면서 더 많은 비즈니스 로직이나 기능을 개발할 수 있게 됨
Serverless란?
Serverless의 장점
Serverless의 중심에 있는 FaaS
Functions-as-a-Service 프로그래밍 모델은 함수들을 진정한 서버리스 컴퓨팅을 할 수 있도록 함
Azure Function?
Functions-as-a-Service 프로그래밍 모델은 함수들을 진정한 서버리스 컴퓨팅을 할 수 있도록 함
개발 효율을 높여주는 Function의 기능
Local
debugging
개발 효율을 높여주는 Function의 기능
사용할 수 있는
수많은 트리거
여러 유연한 개발 방식 제공
Demo
Azure Functions
Azure Functions로
데이터 관리 작업을 하려던 DesignMe
팀의 사례
죽어버린 데이터 관리 작업
죽어버린
백업 및 데이터 관리
서비스
데이터가 별로 없던 초기에 타이머작업을 구현하기 쉬워 Azure Functions로 구현
작업이 점점 길어져
타임 아웃
Azure Functions의 여러 제약
Azure Functions을 Azure Functions답게 사용할 수 있는 Consumption Plan은 여러 제약이 있음
기본 실행시간에 대한 제약
함수는 최대 10분 이상 실행시킬 수 없음
사용할 수 있는 컴퓨팅 자원에 대한 제약
하나의 함수 인스턴스는 1.5GB 이상의 램과 하나를 초과한 CPU를 사용할 수 없음
이를 해결하기 위해 생각했던 두 가지의 방안
1. Function으로 Queue를 생성해서 다시 Function에서 병렬처리, 취합
취합
2. 새로운 Azure Web App을 생성해 Web Job을 돌리거나 Function에서 주기적으로 로직을 실행
이를 해결하기 위해 생각했던 두 가지의 방안
1. Function으로 Queue를 생성해서 다시 Function에서 병렬처리, 취합
취합
2. 새로운 Azure Web App을 생성해 Web Job을 돌리거나 Function에서 주기적으로 로직을 실행
하지만..
할 수 있지만 번거롭고 Queue에 대한 처리를 해야 함
하루 중 한 시간 이내의 작업인데 전체 시간에 대한 요금 지불
데이터가 많아지면 결국엔 Web App도 스케일링 이슈가 생기게 됨
데이터를 스캐닝 하는 작업은 짧은 시간 동안 많은 자원이 필요하기 때문에 최대로
필요한 자원을 할당해 놓아야 작업이 죽지 않음. 이를 기준으로 요금 지불
Azure Durable Functions
Durable Functions의 필요성
Azure Functions을 Functions답게 사용할 수 있는 Consumption Plan은 여러 제약이 있음
현실적으로 쉽지 않은 서버리스 프로그래밍 모델
함수 앱의 기본 개념과 맞게 프로그래밍을 하면 오래 실행하는 함수는 발생하지 않지만 여기에는 높은 추상화 수준이 필요
타이머로 하고 싶은 주기적인 작업, 하지만 Azure Functions의 한계
쉽게 실행할 수 있고 관리할 수 있는 Functions의 타이머는 오랫동안 전체 데이터를 가지고 실행되는 작업을 하고 싶은 욕구를
불러 일으킴. Azure Durable Functions는 상태를 가지고 오래 실행하는 함수를 가능하도록 함.
여러 함수와 함께 작업
여러 복잡한 함수들을 단순하게 조율하고 다른 함수에서 함수를 쉽게 코드로 호출
Durable Functions?
코드로 해버리는 서버리스 오케스트레이션
오랫동안 돌아가는 함수를 하나의 C# 함수로
하나의 C# 함수로 오랫동안 돌아가는 오케스트레이션을 코딩. No JSON 스키마, No Designer.
새로운 Orchestrator Functions
Orchestrator Functions는 동기 혹은 비동기로 다른 함수를 호출할 수 있음
그리고
자동으로 함수를 체크해 장기간 실행되는 함수를 가능하도록 함
서버리스 앱에서 복잡하고 상호작용해야 하는 곳에서 발생할 수 있는 다양한 문제들을 해결
Azure의 오픈소스인 Durable Task Framework를 기반으로 만들어짐
Durable Functions?
코드로 해버리는 서버리스 오케스트레이션
오랫동안 돌아가는 함수를 하나의 C# 함수로
하나의 C# 함수로 오랫동안 돌아가는 오케스트레이션을 코딩. No JSON 스키마, No Designer.
새로운 Orchestrator Functions
Orchestrator Functions는 동기 혹은 비동기로 다른 함수를 호출할 수 있음
그리고
자동으로 함수를 체크해 장기간 실행되는 함수를 가능하도록 함
서버리스 앱에서 복잡하고 상호작용해야 하는 곳에서 발생할 수 있는 다양한 문제들을 해결
Azure의 오픈소스인 Durable Task Framework를 기반으로 만들어짐
Durable Functions이 돌아가는 방법
Worker
Worker
Worker
Worker
Worker
Stateful/Partitioned
Stateless
Control Queue(s)
Triggers orchestrator
function execution
Work Item Queue
Triggers activity function execution
History & Instance Tables
Azure Durable Functions 패턴
패턴 #1 : Function Chaining
F1 F2 F3 F4
문제:
• 함수와 큐 사이의 관계를 보여줄 수 있는 시각적인 요소가 없음
• 중간 큐는 함수에서 의도한 바가 아님 – 개념적으로 오버헤드
• 오류를 처리하는 것은 정말 복잡함
패턴 #1 : Function Chaining
// calls functions in sequence
public static async Task<object> Run(DurableOrchestrationContext ctx)
{
try
{
var x = await ctx.CallFunctionAsync("F1");
var y = await ctx.CallFunctionAsync("F2", x);
var z = await ctx.CallFunctionAsync("F3", y);
return await ctx.CallFunctionAsync("F4", z);
}
catch (Exception)
{
// global error handling/compensation goes here
}
}
Demo
Azure Durable
Functions
Function Chaining
패턴 #2 : Fan-out/Fan-in
문제:
- Fanning-out은 쉬움, 하지만 fanning-in은 매우 복잡함
- 함수는 이 시나리오에 대한 지원을 하지 않음
- 패턴#1에 있는 모든 문제가 있음
F1
F2
F3
패턴 #2 : Fan-out/Fan-in
public static async Task Run(DurableOrchestrationContext ctx)
{
var parallelTasks = new List<Task<int>>();
// get a list of N work items to process in parallel
object[] workBatch = await ctx.CallFunctionAsync<object[]>("F1");
for (int i = 0; i < workBatch.Length; i++)
{
Task<int> task = ctx.CallFunctionAsync<int>("F2", workBatch[i]);
parallelTasks.Add(task);
}
await Task.WhenAll(parallelTasks);
// aggregate all N outputs and send result to F3
int sum = parallelTasks.Sum(t => t.Result);
await ctx.CallFunctionAsync("F3", sum);
}
Demo
Azure Durable
Functions
Fan-out/Fan-in
패턴 #3 : HTTP Async Response
Start DoWork
문제:
• 실행 상태는 명확하게 저장되고 관리 되어야함
• 실행 상태와 트리거 상태는 직접적으로 동기화 되어야 함
• 시작과 상태를 얻는 코드는 비즈니스 문제와 상관없는 코드를 만들어냄
패턴 #3 : HTTP Async Response – 그냥 있음!
> curl -X POST https://myfunc.azurewebsites.net/orchestrators/DoWork -H "Content-Length: 0" -i
HTTP/1.1 202 Accepted
Location: https://myfunc.azurewebsites.net/orchestrators/b79baf67f717453ca9e86c5da21e03ec
Server: Microsoft-IIS/8.0
> curl https://myfunc.azurewebsites.net/orchestrators/b79baf67f717453ca9e86c5da21e03ec -i
HTTP/1.1 202 Accepted
Content-Length: 173
Content-Type: application/json
Location: https://myfunc.azurewebsites.net/orchestrators/b79baf67f717453ca9e86c5da21e03ec
Server: Microsoft-IIS/8.0
{"runtimeStatus":"Running","createdTime":"2017-03-16T21:20:36Z","lastUpdatedTime":"2017-03-16T21:20:47Z"}
> curl https://myfunc.azurewebsites.net/orchestrators/b79baf67f717453ca9e86c5da21e03ec -i
HTTP/1.1 200 OK
Content-Length: 175
Content-Type: application/json
Server: Microsoft-IIS/8.0
{"runtimeStatus":"Completed","createdTime":"2017-03-16T21:20:36Z","lastUpdatedTime":"2017-03-16T21:20:57Z"}
패턴 #4 : Actors
문제:
• 함수는 상태가 없고(Stateless) 짧은 시간동안만 살아있음
• 외부 상태에 대한 읽기/쓰기 작업은 신중하게 동기화되어야 함
• 함수는 Singleton 패턴을 지원하지 않음
패턴 #4 : Actors (Eternal Orchestrations)
public static async Task Run(DurableOrchestrationContext ctx)
{
int counterState = ctx.GetInput<int>();
string operation = await ctx.WaitForExternalEvent<string>("operation");
if (operation == "incr")
{
counterState++;
}
else if (operation == "decr")
{
counterState--;
}
ctx.ContinueAsNew(counterState);
}
패턴 #5 : Human Interaction w/Timeout
RequestApproval
Escalate
ProcessApproval
문제:
- 승인 요청 알림이 올 때의 타임아웃 문제를 쉽게 제어할 수 없음
- 승인 처리 또는 시간 초과를 확실하게 처리할 수 있는 메커니즘이 필요
패턴 #5 : Human Interaction w/Timeout
public static async Task Run(DurableOrchestrationContext ctx)
{
await ctx.CallFunctionAsync<object[]>("RequestApproval");
using (var timeoutCts = new CancellationTokenSource())
{
DateTime dueTime = ctx.CurrentUtcDateTime.AddHours(72);
Task durableTimeout = ctx.CreateTimer(dueTime, 0, cts.Token);
Task<bool> approvalEvent = ctx.WaitForExternalEvent<bool>("ApprovalEvent");
if (approvalEvent == await Task.WhenAny(approvalEvent, durableTimeout))
{
timeoutCts.Cancel();
await ctx.CallFunctionAsync("HandleApproval", approvalEvent.Result);
}
else
{
await ctx.CallFunctionAsync("Escalate");
}
}
}
백업 및 데이터 관리 작업을
Azure Durable Functions으로
바꾸고 나서
Azure Durable Functions을 통해 다시 구현
백업, 데이터 관리 프로세스를 Azure Durable Functions을 통해 다시 구현하고 작업 시작 종료 시 팀즈로
메시지를 보내 관리자가 확인
Azure Durable Functions으로 변경하고 나서
데이터 관리 프로세스를 Azure Durable Functions을 통해 다시 구현
적은 노력으로 빠르게 개발 빠른 작업 속도
데이터 양의 변화에 상관 없이 매우 저렴
Azure Durable Functions의 계속되는 진화
계속해서 좋아지고 있는 Azure Durable Functions
Aggregator (프리뷰)
Durable Function 2.0
Entity Functions
Durable HTTP
…
현재 Azure Durable Functions에서 새로 준비 중인 기능
감사합니다

More Related Content

PDF
Python server-101
PDF
2020.02.06 우리는 왜 glue를 버렸나?
PDF
[213]monitoringwithscouter 이건희
PPTX
[123] electron 김성훈
PDF
웹 Front-End 실무 이야기
PDF
Node.js 현재와 미래
PDF
FCGI, C++로 Restful 서버 개발
PDF
유연하게 확장할 수 있는 PHP 웹 개발 이야기
Python server-101
2020.02.06 우리는 왜 glue를 버렸나?
[213]monitoringwithscouter 이건희
[123] electron 김성훈
웹 Front-End 실무 이야기
Node.js 현재와 미래
FCGI, C++로 Restful 서버 개발
유연하게 확장할 수 있는 PHP 웹 개발 이야기

What's hot (20)

PDF
Vue SSR vs Prerender
PDF
Front-end Development with Ruby on Rails
PDF
Progressive Web Apps
PPTX
Front end 웹사이트 성능 측정 및 개선
PDF
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)
KEY
Meteor 0.3.6 Preview
PDF
Service Worker 를 이용한 
Offline Web Application 구현
PDF
Front-end Development Process - 어디까지 개선할 수 있나
PPTX
[112]rest에서 graph ql과 relay로 갈아타기 이정우
PDF
Node.js 시작하기
PDF
막하는 스터디 네 번째 만남 AngularJs (20151108)
PDF
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
PDF
Mean 스택을 사용한 IoT 개발
PPTX
Ahea Team Spring batch
PDF
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
PPTX
Node.js
PDF
2017. 프론트엔드 트랜드
PDF
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
PDF
MEAN Stack 기반 모바일 서비스 개발 overview
PDF
[Td 2015]asp.net 5 깊게 파고들기(박용준)
Vue SSR vs Prerender
Front-end Development with Ruby on Rails
Progressive Web Apps
Front end 웹사이트 성능 측정 및 개선
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)
Meteor 0.3.6 Preview
Service Worker 를 이용한 
Offline Web Application 구현
Front-end Development Process - 어디까지 개선할 수 있나
[112]rest에서 graph ql과 relay로 갈아타기 이정우
Node.js 시작하기
막하는 스터디 네 번째 만남 AngularJs (20151108)
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
Mean 스택을 사용한 IoT 개발
Ahea Team Spring batch
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Node.js
2017. 프론트엔드 트랜드
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
MEAN Stack 기반 모바일 서비스 개발 overview
[Td 2015]asp.net 5 깊게 파고들기(박용준)
Ad

Similar to 코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions (20)

PDF
Azure function 활용한 파이썬 크롤링 스케줄링
PDF
서버리스 대규모 리얼타임 웹 구축하기
PPTX
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
PDF
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
PPTX
Serverless Architecture with Cloud Function
PDF
Ms Azure fundamentals
PPTX
Saturday Azure Live 1701 Azure WebApp 개념원리
PDF
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
PPTX
1711 azure-live
PDF
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
PPTX
Scalable web architecture
PPTX
[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요
PDF
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
PDF
Azure functions
PPTX
Golang Project Guide from A to Z: From Feature Development to Enterprise Appl...
PDF
Lag 없는 실시간 데이터 파이프라인을 위한 아키텍처 개선기
PDF
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
PPTX
4. 대용량 아키텍쳐 설계 패턴
PDF
대규모 서비스를 가능하게 하는 기술
PDF
마이크로소프트 앱 플랫폼을 이용한 어플리케이션 개발과 배포
Azure function 활용한 파이썬 크롤링 스케줄링
서버리스 대규모 리얼타임 웹 구축하기
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
Serverless Architecture with Cloud Function
Ms Azure fundamentals
Saturday Azure Live 1701 Azure WebApp 개념원리
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
1711 azure-live
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
Scalable web architecture
[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
Azure functions
Golang Project Guide from A to Z: From Feature Development to Enterprise Appl...
Lag 없는 실시간 데이터 파이프라인을 위한 아키텍처 개선기
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
4. 대용량 아키텍쳐 설계 패턴
대규모 서비스를 가능하게 하는 기술
마이크로소프트 앱 플랫폼을 이용한 어플리케이션 개발과 배포
Ad

코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions

  • 1. 코드로 바로 해버리는 서버리스 오케스트레이션 Azure Durable Functions 이종인 DesignMe AI Microsoft Developer Technologies MVP
  • 2. 소개 이종인 I LOVE .NET ❤ ❤ ❤  DesignMe라는 서비스를 만드는 사람  Microsoft Developer Technologies MVP (2014 ~ 현재)  모여서 각자 코딩하는 모임  C# 모바일 개발자 모임
  • 4. 클라우드로 일어난 변화 클라우드 기술이 발전하면서 더 많은 비즈니스 로직이나 기능을 개발할 수 있게 됨
  • 7. Serverless의 중심에 있는 FaaS Functions-as-a-Service 프로그래밍 모델은 함수들을 진정한 서버리스 컴퓨팅을 할 수 있도록 함
  • 8. Azure Function? Functions-as-a-Service 프로그래밍 모델은 함수들을 진정한 서버리스 컴퓨팅을 할 수 있도록 함
  • 9. 개발 효율을 높여주는 Function의 기능 Local debugging
  • 10. 개발 효율을 높여주는 Function의 기능
  • 12. 여러 유연한 개발 방식 제공
  • 14. Azure Functions로 데이터 관리 작업을 하려던 DesignMe 팀의 사례
  • 15. 죽어버린 데이터 관리 작업 죽어버린 백업 및 데이터 관리 서비스 데이터가 별로 없던 초기에 타이머작업을 구현하기 쉬워 Azure Functions로 구현 작업이 점점 길어져 타임 아웃
  • 16. Azure Functions의 여러 제약 Azure Functions을 Azure Functions답게 사용할 수 있는 Consumption Plan은 여러 제약이 있음 기본 실행시간에 대한 제약 함수는 최대 10분 이상 실행시킬 수 없음 사용할 수 있는 컴퓨팅 자원에 대한 제약 하나의 함수 인스턴스는 1.5GB 이상의 램과 하나를 초과한 CPU를 사용할 수 없음
  • 17. 이를 해결하기 위해 생각했던 두 가지의 방안 1. Function으로 Queue를 생성해서 다시 Function에서 병렬처리, 취합 취합 2. 새로운 Azure Web App을 생성해 Web Job을 돌리거나 Function에서 주기적으로 로직을 실행
  • 18. 이를 해결하기 위해 생각했던 두 가지의 방안 1. Function으로 Queue를 생성해서 다시 Function에서 병렬처리, 취합 취합 2. 새로운 Azure Web App을 생성해 Web Job을 돌리거나 Function에서 주기적으로 로직을 실행 하지만.. 할 수 있지만 번거롭고 Queue에 대한 처리를 해야 함 하루 중 한 시간 이내의 작업인데 전체 시간에 대한 요금 지불 데이터가 많아지면 결국엔 Web App도 스케일링 이슈가 생기게 됨 데이터를 스캐닝 하는 작업은 짧은 시간 동안 많은 자원이 필요하기 때문에 최대로 필요한 자원을 할당해 놓아야 작업이 죽지 않음. 이를 기준으로 요금 지불
  • 20. Durable Functions의 필요성 Azure Functions을 Functions답게 사용할 수 있는 Consumption Plan은 여러 제약이 있음 현실적으로 쉽지 않은 서버리스 프로그래밍 모델 함수 앱의 기본 개념과 맞게 프로그래밍을 하면 오래 실행하는 함수는 발생하지 않지만 여기에는 높은 추상화 수준이 필요 타이머로 하고 싶은 주기적인 작업, 하지만 Azure Functions의 한계 쉽게 실행할 수 있고 관리할 수 있는 Functions의 타이머는 오랫동안 전체 데이터를 가지고 실행되는 작업을 하고 싶은 욕구를 불러 일으킴. Azure Durable Functions는 상태를 가지고 오래 실행하는 함수를 가능하도록 함. 여러 함수와 함께 작업 여러 복잡한 함수들을 단순하게 조율하고 다른 함수에서 함수를 쉽게 코드로 호출
  • 21. Durable Functions? 코드로 해버리는 서버리스 오케스트레이션 오랫동안 돌아가는 함수를 하나의 C# 함수로 하나의 C# 함수로 오랫동안 돌아가는 오케스트레이션을 코딩. No JSON 스키마, No Designer. 새로운 Orchestrator Functions Orchestrator Functions는 동기 혹은 비동기로 다른 함수를 호출할 수 있음 그리고 자동으로 함수를 체크해 장기간 실행되는 함수를 가능하도록 함 서버리스 앱에서 복잡하고 상호작용해야 하는 곳에서 발생할 수 있는 다양한 문제들을 해결 Azure의 오픈소스인 Durable Task Framework를 기반으로 만들어짐
  • 22. Durable Functions? 코드로 해버리는 서버리스 오케스트레이션 오랫동안 돌아가는 함수를 하나의 C# 함수로 하나의 C# 함수로 오랫동안 돌아가는 오케스트레이션을 코딩. No JSON 스키마, No Designer. 새로운 Orchestrator Functions Orchestrator Functions는 동기 혹은 비동기로 다른 함수를 호출할 수 있음 그리고 자동으로 함수를 체크해 장기간 실행되는 함수를 가능하도록 함 서버리스 앱에서 복잡하고 상호작용해야 하는 곳에서 발생할 수 있는 다양한 문제들을 해결 Azure의 오픈소스인 Durable Task Framework를 기반으로 만들어짐
  • 23. Durable Functions이 돌아가는 방법 Worker Worker Worker Worker Worker Stateful/Partitioned Stateless Control Queue(s) Triggers orchestrator function execution Work Item Queue Triggers activity function execution History & Instance Tables
  • 25. 패턴 #1 : Function Chaining F1 F2 F3 F4 문제: • 함수와 큐 사이의 관계를 보여줄 수 있는 시각적인 요소가 없음 • 중간 큐는 함수에서 의도한 바가 아님 – 개념적으로 오버헤드 • 오류를 처리하는 것은 정말 복잡함
  • 26. 패턴 #1 : Function Chaining // calls functions in sequence public static async Task<object> Run(DurableOrchestrationContext ctx) { try { var x = await ctx.CallFunctionAsync("F1"); var y = await ctx.CallFunctionAsync("F2", x); var z = await ctx.CallFunctionAsync("F3", y); return await ctx.CallFunctionAsync("F4", z); } catch (Exception) { // global error handling/compensation goes here } }
  • 28. 패턴 #2 : Fan-out/Fan-in 문제: - Fanning-out은 쉬움, 하지만 fanning-in은 매우 복잡함 - 함수는 이 시나리오에 대한 지원을 하지 않음 - 패턴#1에 있는 모든 문제가 있음 F1 F2 F3
  • 29. 패턴 #2 : Fan-out/Fan-in public static async Task Run(DurableOrchestrationContext ctx) { var parallelTasks = new List<Task<int>>(); // get a list of N work items to process in parallel object[] workBatch = await ctx.CallFunctionAsync<object[]>("F1"); for (int i = 0; i < workBatch.Length; i++) { Task<int> task = ctx.CallFunctionAsync<int>("F2", workBatch[i]); parallelTasks.Add(task); } await Task.WhenAll(parallelTasks); // aggregate all N outputs and send result to F3 int sum = parallelTasks.Sum(t => t.Result); await ctx.CallFunctionAsync("F3", sum); }
  • 31. 패턴 #3 : HTTP Async Response Start DoWork 문제: • 실행 상태는 명확하게 저장되고 관리 되어야함 • 실행 상태와 트리거 상태는 직접적으로 동기화 되어야 함 • 시작과 상태를 얻는 코드는 비즈니스 문제와 상관없는 코드를 만들어냄
  • 32. 패턴 #3 : HTTP Async Response – 그냥 있음! > curl -X POST https://myfunc.azurewebsites.net/orchestrators/DoWork -H "Content-Length: 0" -i HTTP/1.1 202 Accepted Location: https://myfunc.azurewebsites.net/orchestrators/b79baf67f717453ca9e86c5da21e03ec Server: Microsoft-IIS/8.0 > curl https://myfunc.azurewebsites.net/orchestrators/b79baf67f717453ca9e86c5da21e03ec -i HTTP/1.1 202 Accepted Content-Length: 173 Content-Type: application/json Location: https://myfunc.azurewebsites.net/orchestrators/b79baf67f717453ca9e86c5da21e03ec Server: Microsoft-IIS/8.0 {"runtimeStatus":"Running","createdTime":"2017-03-16T21:20:36Z","lastUpdatedTime":"2017-03-16T21:20:47Z"} > curl https://myfunc.azurewebsites.net/orchestrators/b79baf67f717453ca9e86c5da21e03ec -i HTTP/1.1 200 OK Content-Length: 175 Content-Type: application/json Server: Microsoft-IIS/8.0 {"runtimeStatus":"Completed","createdTime":"2017-03-16T21:20:36Z","lastUpdatedTime":"2017-03-16T21:20:57Z"}
  • 33. 패턴 #4 : Actors 문제: • 함수는 상태가 없고(Stateless) 짧은 시간동안만 살아있음 • 외부 상태에 대한 읽기/쓰기 작업은 신중하게 동기화되어야 함 • 함수는 Singleton 패턴을 지원하지 않음
  • 34. 패턴 #4 : Actors (Eternal Orchestrations) public static async Task Run(DurableOrchestrationContext ctx) { int counterState = ctx.GetInput<int>(); string operation = await ctx.WaitForExternalEvent<string>("operation"); if (operation == "incr") { counterState++; } else if (operation == "decr") { counterState--; } ctx.ContinueAsNew(counterState); }
  • 35. 패턴 #5 : Human Interaction w/Timeout RequestApproval Escalate ProcessApproval 문제: - 승인 요청 알림이 올 때의 타임아웃 문제를 쉽게 제어할 수 없음 - 승인 처리 또는 시간 초과를 확실하게 처리할 수 있는 메커니즘이 필요
  • 36. 패턴 #5 : Human Interaction w/Timeout public static async Task Run(DurableOrchestrationContext ctx) { await ctx.CallFunctionAsync<object[]>("RequestApproval"); using (var timeoutCts = new CancellationTokenSource()) { DateTime dueTime = ctx.CurrentUtcDateTime.AddHours(72); Task durableTimeout = ctx.CreateTimer(dueTime, 0, cts.Token); Task<bool> approvalEvent = ctx.WaitForExternalEvent<bool>("ApprovalEvent"); if (approvalEvent == await Task.WhenAny(approvalEvent, durableTimeout)) { timeoutCts.Cancel(); await ctx.CallFunctionAsync("HandleApproval", approvalEvent.Result); } else { await ctx.CallFunctionAsync("Escalate"); } } }
  • 37. 백업 및 데이터 관리 작업을 Azure Durable Functions으로 바꾸고 나서
  • 38. Azure Durable Functions을 통해 다시 구현 백업, 데이터 관리 프로세스를 Azure Durable Functions을 통해 다시 구현하고 작업 시작 종료 시 팀즈로 메시지를 보내 관리자가 확인
  • 39. Azure Durable Functions으로 변경하고 나서 데이터 관리 프로세스를 Azure Durable Functions을 통해 다시 구현 적은 노력으로 빠르게 개발 빠른 작업 속도 데이터 양의 변화에 상관 없이 매우 저렴
  • 40. Azure Durable Functions의 계속되는 진화 계속해서 좋아지고 있는 Azure Durable Functions Aggregator (프리뷰) Durable Function 2.0 Entity Functions Durable HTTP … 현재 Azure Durable Functions에서 새로 준비 중인 기능