SlideShare a Scribd company logo
1 of 41
Download to read offline
코드로 바로 해버리는
서버리스 오케스트레이션
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

What's hot

Vue SSR vs Prerender
Vue SSR vs PrerenderVue SSR vs Prerender
Vue SSR vs PrerenderChangwan Jun
 
Front-end Development with Ruby on Rails
Front-end Development with Ruby on RailsFront-end Development with Ruby on Rails
Front-end Development with Ruby on Rails추근 문
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Appsjungkees
 
Front end 웹사이트 성능 측정 및 개선
Front end 웹사이트 성능 측정 및 개선Front end 웹사이트 성능 측정 및 개선
Front end 웹사이트 성능 측정 및 개선기동 이
 
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)AWSKRUG - AWS한국사용자모임
 
Meteor 0.3.6 Preview
Meteor 0.3.6 PreviewMeteor 0.3.6 Preview
Meteor 0.3.6 PreviewJuntai Park
 
Service Worker 를 이용한 
Offline Web Application 구현
Service Worker 를 이용한 
Offline Web Application 구현Service Worker 를 이용한 
Offline Web Application 구현
Service Worker 를 이용한 
Offline Web Application 구현병태 정
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나JeongHun Byeon
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우NAVER D2
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기Huey Park
 
막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)연웅 조
 
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020 AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020 AWSKRUG - AWS한국사용자모임
 
Mean 스택을 사용한 IoT 개발
Mean 스택을 사용한 IoT 개발Mean 스택을 사용한 IoT 개발
Mean 스택을 사용한 IoT 개발Jay Park
 
Ahea Team Spring batch
Ahea Team Spring batchAhea Team Spring batch
Ahea Team Spring batchSunghyun Roh
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)LanarkSeung
 
Node.js
Node.jsNode.js
Node.jsymtech
 
2017. 프론트엔드 트랜드
2017. 프론트엔드 트랜드2017. 프론트엔드 트랜드
2017. 프론트엔드 트랜드Tai Hoon KIM
 
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처 스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처 Sungchul Park
 
MEAN Stack 기반 모바일 서비스 개발 overview
MEAN Stack 기반 모바일 서비스 개발 overviewMEAN Stack 기반 모바일 서비스 개발 overview
MEAN Stack 기반 모바일 서비스 개발 overview민태 김
 
[Td 2015]asp.net 5 깊게 파고들기(박용준)
[Td 2015]asp.net 5 깊게 파고들기(박용준)[Td 2015]asp.net 5 깊게 파고들기(박용준)
[Td 2015]asp.net 5 깊게 파고들기(박용준)Sang Don Kim
 

What's hot (20)

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

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

서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)수보 김
 
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기Youngjae Kim
 
Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.효근 박
 
Knative로 서버리스 워크로드 구현
Knative로 서버리스 워크로드 구현Knative로 서버리스 워크로드 구현
Knative로 서버리스 워크로드 구현Jinwoong Kim
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST_NHNent
 
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)Sang Don Kim
 
Toward kubernetes native data center
Toward kubernetes native data centerToward kubernetes native data center
Toward kubernetes native data center어형 이
 
Airflow introduce
Airflow introduceAirflow introduce
Airflow introducet lc
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rdPark Jonggun
 
OCE - Cno 2014 private sector oriented open paas oce
OCE - Cno 2014 private sector oriented open paas   oceOCE - Cno 2014 private sector oriented open paas   oce
OCE - Cno 2014 private sector oriented open paas oceuEngine Solutions
 
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)uEngine Solutions
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine LearningJEEHYUN PAIK
 
designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...uEngine Solutions
 
20131217 html5
20131217 html520131217 html5
20131217 html5DK Lee
 
레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드Sukjoon Kim
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기John Kim
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨KwangSeob Jeong
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXpressEngine
 

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

서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
[Azure bootcamp2017] Azure App Service로 서비스 탄탄하게 관리하기
 
Netra intro v4
Netra intro v4Netra intro v4
Netra intro v4
 
Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.
 
Knative로 서버리스 워크로드 구현
Knative로 서버리스 워크로드 구현Knative로 서버리스 워크로드 구현
Knative로 서버리스 워크로드 구현
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
 
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
 
Sencha ExtJS를 활용한 Big Data Platform 개발 사례
Sencha ExtJS를 활용한 Big Data Platform 개발 사례 Sencha ExtJS를 활용한 Big Data Platform 개발 사례
Sencha ExtJS를 활용한 Big Data Platform 개발 사례
 
Toward kubernetes native data center
Toward kubernetes native data centerToward kubernetes native data center
Toward kubernetes native data center
 
Airflow introduce
Airflow introduceAirflow introduce
Airflow introduce
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
 
OCE - Cno 2014 private sector oriented open paas oce
OCE - Cno 2014 private sector oriented open paas   oceOCE - Cno 2014 private sector oriented open paas   oce
OCE - Cno 2014 private sector oriented open paas oce
 
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine Learning
 
designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...
 
20131217 html5
20131217 html520131217 html5
20131217 html5
 
레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
 

코드로 바로 해버리는 서버리스 오케스트레이션 - 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에서 새로 준비 중인 기능