큐 트리거
메시지 큐는 프로세스, 스레드 또는 애플리케이션 사이의 메시징을 처리할 때 사용되는 소프트웨어 구성 요소입니다. 큐는 메시지를 저장할 수 있으며, 작업자가 제때 메시지를 가져올 수 있습니다.
클라우드에서 메시지 큐는 페이로드로 이벤트를 생성할 수 있습니다. Azure Functions 같은 서비스는 이러한 메시지를 수신 대기하고 메시지가 게시될 때 해당 코드를 실행할 수 있습니다.
메시지 큐 작업
Azure 함수가 메시지 큐에서 메시지를 사용할 수 있으려면 트리거 및 바인딩이 필요합니다.
Azure 함수는 특정 큐에 새 메시지가 게시될 때 코드가 트리거되도록 해당 큐를 수신 대기해야 합니다. 트리거를 설정하려면 트리거 코드가 메시지 큐에 연결하는 방법을 알 수 있도록 적절한 자격 증명을 제공해야 합니다. 큐를 수신 대기하는 함수에 대한 function.json 파일에 항목을 만듭니다. bindings
요소에서 항목에 다음 속성을 지정합니다.
속성 | 값 |
---|---|
name |
코드에서 참조할 수 있는 이름 |
type |
queueTrigger |
direction |
in |
queueName |
큐 이름 |
connection |
local.settings.js의 구성 변수 |
예제 항목은 다음과 같이 정의할 수 있습니다.
{
"name": "myQueueItem",
"type": "queueTrigger",
"direction": "in",
"queueName": "messages-incoming",
"connection": "AzureWebJobsStorage"
}
이 큐가 스토리지 계정에 있는 경우 AzureWebJobsStorage
값은 연결 문자열의 값입니다.
큐에서 메시지를 사용할 때 바인딩이 꼭 필요한 것은 아닙니다. 그러나 큐에 작성해야 하는 경우에는 출력 바인딩이 필요합니다. 이러한 바인딩을 사용하여 원하는 큐에 대한 참조를 가져옵니다.
참고
현재는 출력 바인딩만 큐에 지원됩니다.
로컬에서 개발
개발자는 짧은 피드백 주기를 원합니다. 또한 개발자 환경이 프로덕션 환경에 최대한 가깝기를 원합니다. 이 두 목표를 모두 달성하는 방법은 큐 에뮬레이터를 사용하는 것입니다.
큐 에뮬레이터를 사용하면 Azure 함수가 응답할 실제 큐 메시지를 시뮬레이션할 수 있습니다. 에뮬레이터를 사용하려면 다음을 수행합니다.
에뮬레이터를 설치합니다. Visual Studio Code에서 Azurite를 검색하거나 Azurite 확장을 다운로드합니다.
에뮬레이터 기능을 사용하려면 명령 팔레트에서 Azure: 큐 서비스 시작을 선택합니다.
이 명령을 실행하면 다른 애플리케이션이 선택할 수 있는 Azure Storage Explorer라는 수신기가 시작됩니다. Storage Explorer는 클라우드 리소스를 탐색하고 에뮬레이터 기능을 사용할 수 있게 해주는 클라이언트 애플리케이션입니다.
Azure Storage Explorer를 다운로드합니다. 그런 다음, 애플리케이션을 열면 다음이 표시되어 에뮬레이터가 작동 중임을 나타냅니다.
에뮬레이터에 큐를 만듭니다. 함수 엔드포인트 구성의 일부로 이 큐를 사용하게 됩니다. 큐 요소를 마우스 오른쪽 단추로 클릭하여 새 큐를 만들 수 있습니다.
Functions 앱에서 에뮬레이터를 사용하도록 하려면 연결 문자열을 정확히 설정해야 합니다. local.settings.json을 열고,
AzureWebJobsStorage
요소를 찾아, 값"UseDevelopmentStorage=true"
을 부여합니다.참고
클라우드로 이동할 때는 이 속성을 다르게 설정해야 합니다. 프로덕션 중일 때 Azure의 실제 리소스를 가리켜야 합니다.
함수 빌드
이제 로컬 에뮬레이터가 설정되어 큐가 생겼습니다. 그리고 로컬 에뮬레이터를 가리키도록 프로젝트가 구성되었습니다. 이제 큐 트리거를 처리하는 함수를 만들어야 합니다.
함수 엔드포인트 만들기
들어오는 큐 메시지를 처리할 수 있는 함수를 만들 준비가 완료되었습니다. 함수에 대한 폴더를 만들고 이름을 지정합니다(예: queueTrigger
). 그런 다음, function.json 파일을 만들고 다음 콘텐츠를 제공합니다.
{
"bindings": [{
"name" "queueItem",
"type": "queueTrigger",
"direction": "in",
"queueName" : "items",
"connection": "AzureWebJobsStorage"
}]
}
name
요소의 값은 나중에 코드에서 참조하여 큐에서 들어오는 데이터의 구문을 분석하기 때문에 중요합니다. 새 메시지가 있을 때 큐가 트리거하도록 queueTrigger
형식이어야 합니다.
queueName
요소는 상호 작용하는 큐를 고유하게 식별합니다. 여기에 무엇을 입력하든 에뮬레이터에서 큐를 호출하는 것과 일치하거나, 나중에 Azure에서 실제 큐를 호출하는 것과 일치해야 합니다.
connection
요소는 local.settings.json의 AzureWebJobsStorage
요소 값을 가리킵니다.
큐 메시지 처리
들어오는 큐 메시지를 처리하려면 필요한 메시지 구문을 분석할 수 있는 코드를 작성해야 합니다. 지금은 다음에 수행할 작업을 결정할 수 있습니다. 예를 들어, 웹 요청을 시작하거나, 해당 메시지를 다른 큐에 배치하거나, 데이터베이스에 메시지를 보낼 수 있습니다.
경로 설정
들어오는 요청을 처리할 경로가 필요합니다. Azure Functions는 루트의 큐에 대한 요청을 처리합니다. 다음과 같이 경로를 설정하면 요청이 http://localhost:<port>/queueTrigger
로 호출됩니다.
http.HandleFunc("/queueTrigger", handleQueueTrigger)
요청 디코딩
큐 메시지가 전송될 때 그 모양은 다음과 같습니다.
{
"Data": {
"queueItem": "your message"
},
"Metadata": {
"DequeueCount": 1,
"ExpirationTime": "2019-10-16T17:58:31+00:00",
"Id": "800ae4b3-bdd2-4c08-badd-f08e5a34b865",
"InsertionTime": "2019-10-09T17:58:31+00:00",
"NextVisibleTime": "2019-10-09T18:08:32+00:00",
"PopReceipt": "AgAAAAMAAAAAAAAAAgtnj8x+1QE=",
"sys": {
"MethodName": "QueueTrigger",
"UtcNow": "2019-10-09T17:58:32.2205399Z",
"RandGuid": "24ad4c06-24ad-4e5b-8294-3da9714877e9"
}
}
}
들어오는 요청을 디코딩할 때 이전 메시지를 모델링하는 도우미 구조가 필요합니다. 다음과 같이 표시됩니다.
type InvokeRequest {
Data map[string]json.RawMessage
Metadata map[string]interface{}
}
들어오는 요청을 받아 디코딩하는 코드 작성을 시작합니다.
func handleQueueTrigger(w http.ResponseWrite, r *http.Request) {
var invokeRequest InvokeRequest
d := json.NewDecoder(r.Body)
d.Decode(&invokeRequest)
}
이제 요청이 디코딩되었지만 큐 메시지의 구문을 분석해야 합니다.
큐 메시지 구문 분석
요청이 디코딩된 후에는 Data
속성의 요청에서 큐 메시지를 검색할 수 있습니다. 그리고 function.json 파일에 설정한 name
속성 값으로 메시지를 참조해야 합니다. 메시지를 검색하는 코드는 다음과 같은 한 줄입니다.
invokeRequest.Data["queueItem"]
이 메시지를 명확한 텍스트로 읽을 수 있어야 하므로 JSON 라이브러리를 사용하여 구문을 분석합니다. JSON 라이브러리는 두 가지 매개변수, 즉 구문을 분석할 메시지와 구문이 분석된 메시지를 배치할 변수를 사용하는 Unmarshal()
메서드를 사용합니다. 따라서 코드가 다음과 같아야 합니다.
var parsedMessage string
json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)
지금은 parsedMessage
에 메시지가 포함되어 있습니다. 콘솔로 출력하려면 다음 코드를 사용합니다.
fmt.Println(parsedMessage) // your message
참고
메시지가 문자열보다 고급인 경우 parsedMessage
에 queueMessage
가 가리키는 것과 모양이 같은 구조가 있어야 합니다.
메시지 트리거
애플리케이션을 테스트하려면 Azure Storage Explorer를 사용하면 됩니다. 도구의 오른쪽 창에서 메시지 추가 단추를 선택하여 큐에 메시지를 만듭니다.
Functions 앱이 있고 현재 이 앱이 실행 중인 경우 바인딩이 트리거되고 코드가 호출됩니다.