Azure Queue Storage는 애플리케이션 구성 요소 간에 클라우드 메시징을 제공합니다. 규모를 고려하여 애플리케이션을 설계할 때 애플리케이션 구성 요소가 분리되는 경우가 종종 있으므로 구성 요소를 개별적으로 확장할 수 있습니다. Queue Storage는 클라우드, 데스크톱, 온-프레미스 서버 또는 모바일 디바이스에서 실행 중인지와 관계 없이 애플리케이션 구성 요소 간에 통신을 위한 비동기 메시징을 제공합니다. 또한 Queue Storage는 비동기 작업을 관리하고 프로세스 워크플로를 빌드할 수 있도록 지원합니다.
이 자습서 정보
이 자습서에서는 Azure Queue Storage를 사용하여 몇 가지 일반적인 작업에 대한 .F# 코드를 작성하는 방법을 보여줍니다. 다루는 작업에는 큐 만들기 및 삭제, 큐 메시지 추가, 읽기 및 삭제가 포함됩니다.
큐 스토리지에 대한 개념적 개요는 큐 스토리지에 대한 .NET 가이드를 참조하세요. 이러한 자습서는 쉽게 연결 문자열 사용하여 Azure로 인증합니다. 보안을 최적화하려면 관리 ID와 함께 Microsoft Entra ID를 사용해야 합니다.
필수 조건
이 가이드를 사용하려면 먼저 Azure storage 계정을 만들어야 합니다. 이 계정에 액세스하려면 이 스토리지 엑세스 키 역시 필요합니다.
F# 스크립트 만들기 및 F# 대화형 시작
이 문서의 샘플은 F# 애플리케이션 또는 F# 스크립트에서 사용할 수 있습니다. F# 스크립트를 만들려면 확장이 있는 파일 .fsx (예 queues.fsx, F# 개발 환경에서)을 만듭니다.
스크립트들을 실행하는 방법
F# Interactive, dotnet fsi, 는 대화형으로 시작하거나 명령줄에서 시작하여 스크립트를 실행할 수 있습니다. 명령줄 구문은
> dotnet fsi [options] [ script-file [arguments] ]
스크립트에 패키지 추가
다음으로 아래와 같은 #r 패키지 및 nuget:package name 네임스페이스를 설치하는데 Azure.Storage.Queuesopen 를 사용합니다.
> #r "nuget: Azure.Storage.Queues"
open Azure.Storage.Queues
네임스페이스 선언 추가
open 파일 맨 위에 다음 queues.fsx 문을 추가합니다.
open Azure.Storage.Queues // Namespace for Queue storage types
open System
open System.Text
연결 문자열 가져오기
이 자습서에는 Azure Storage 연결 문자열 필요합니다. 연결 문자열에 대한 자세한 내용은 Azure Storage 연결 문자열 구성을 참조하세요.
이 자습서에서는 다음과 같이 스크립트에 연결 문자열 입력합니다.
let storageConnString = "..." // fill this in from your storage account
큐 서비스 클라이언트 만들기
QueueClient 클래스를 사용하면 큐 스토리지에 저장된 큐를 검색할 수 있습니다. 클라이언트를 만드는 한 가지 방법은 다음과 같습니다.
let queueClient = QueueClient(storageConnString, "myqueue")
이제 데이터를 읽어 오고 Queue Storage에 데이터를 기록하는 코드를 작성할 준비가 되었습니다.
큐 생성
큐가 존재하지 않는 경우 생성하는 방법을 이 예제에서 보여줍니다.
queueClient.CreateIfNotExists()
큐에 메시지 삽입
기존 큐에 메시지를 삽입하려면 먼저 새 메세지를 만듭니다. 다음으로, SendMessage 메서드를 호출합니다. 메세지는 문자열(UTF-8 형식) 또는 다음과 같은 byte 배열에서 만들 수 있습니다:
queueClient.SendMessage("Hello, World") // Insert a String message into a queue
queueClient.SendMessage(BinaryData.FromBytes(Encoding.UTF8.GetBytes("Hello, World"))) // Insert a BinaryData message into a queue
다음 메시지 보기
큐에서 메시지를 제거하지 않고도, PeekMessage 메서드를 호출하여 큐의 앞에서 원하는 메시지를 볼 수 있습니다.
let peekedMessage = queueClient.PeekMessage()
let messageContents = peekedMessage.Value.Body.ToString()
처리를 위한 다음 메시지 가져오기
ReceiveMessage 메서드를 호출하여 처리를 위해 큐의 맨 앞에 있는 메시지를 검색할 수 있습니다.
let updateMessage = queueClient.ReceiveMessage().Value
나중에 DeleteMessage 를 사용하여 메시지를 성공적으로 처리했음을 나타냅니다.
대기 중인 메시지의 콘텐츠 변경
큐에 있는 회수된 메시지의 콘텐츠를 변경할 수 있습니다. 메시지가 작업을 나타내는 경우 이 기능을 사용하여 작업의 상태를 업데이트할 수 있습니다. 다음 코드는 큐 메시지를 새로운 콘텐츠로 업데이트하고 표시 제한 시간이 60초 더 늘어나도록 설정합니다. 그러면 메시지와 연결된 작업의 상태가 저장되고 클라이언트에서 메시지에 대한 작업을 계속할 수 있는 시간이 1분 더 허용됩니다. 이 기술을 사용하면 하드웨어 또는 소프트웨어 오류로 인해 처리 단계가 실패하는 경우 처음부터 다시 시작할 필요 없이 큐 메시지에 대한 다단계 워크플로를 추적할 수 있습니다. 일반적으로 재시도 횟수도 유지되며, 메시지가 일정 횟수 이상 재시도되면 메시지를 삭제합니다. 이 기능은 처리될 때마다 애플리케이션 오류를 트리거하는 메시지를 차단하여 보호해 줍니다.
queueClient.UpdateMessage(
updateMessage.MessageId,
updateMessage.PopReceipt,
"Updated contents.",
TimeSpan.FromSeconds(60.0))
큐에서 다음 메시지 제거
코드는 두 단계로 큐에서 메시지를 제거합니다.
ReceiveMessage를 호출하면 큐에서 다음 메시지를 가져옵니다.
ReceiveMessage에서 반환된 메시지는 이 큐의 메시지를 읽는 다른 코드에는 표시되지 않습니다. 기본적으로, 이 메시지는 30초간 표시되지 않습니다. 큐에서 메시지 제거를 완료하려면 DeleteMessage도 호출해야 합니다. 메시지를 제거하는 이 2단계 프로세스는 코드가 하드웨어 또는 소프트웨어 오류로 인해 메시지를 처리하지 못하는 경우 코드의 다른 인스턴스가 동일한 메시지를 가져와서 다시 시도할 수 있도록 보장합니다. 코드는 메시지가 처리된 직후에 DeleteMessage를 호출합니다.
지금까지 보여 준 모든 큐 메서드에는 대안이 Async 있습니다.
let deleteMessage = queueClient.ReceiveMessage().Value
queueClient.DeleteMessage(deleteMessage.MessageId, deleteMessage.PopReceipt)
일반적인 Queue Storage API와 함께 비동기 워크플로 사용
이 예제에서는 일반적인 Queue Storage API와 함께 비동기 워크플로를 사용하는 방법을 보여 줍니다.
async {
let! exists = queueClient.CreateIfNotExistsAsync() |> Async.AwaitTask
let! delAsyncMessage = queueClient.ReceiveMessageAsync() |> Async.AwaitTask
// ... process the message here ...
// Now indicate successful processing:
queueClient.DeleteMessageAsync(delAsyncMessage.Value.MessageId, delAsyncMessage.Value.PopReceipt) |> Async.AwaitTask
}
큐에서 메시지를 제거하는 추가 옵션
큐에서 메시지 검색을 사용자 지정할 수 있는 방법으로는 두 가지가 있습니다.
먼저, 메시지의 배치(최대 32개)를 가져올 수 있습니다. 두 번째로, 표시하지 않는 제한 시간을 더 길거나 더 짧게 설정하여 코드에서 각 메시지를 완전히 처리하는 시간을 늘리거나 줄일 수 있습니다. 다음 코드 예제는 ReceiveMessages 를 사용하여 한 번 호출에 20개의 메시지를 가져오고 각 메세리지를 처리합니다. 또한 각 메시지에 대해 표시하지 않는 제한 시간을 5분으로 설정합니다. 5분은 모든 메시지에 대해 동시에 시작되므로, ReceiveMessages 호출 이후 5분이 지나고 나면 삭제되지 않은 모든 메시지가 다시 표시됩니다.
for dequeueMessage in queueClient.ReceiveMessages(20, Nullable(TimeSpan.FromMinutes(5.))).Value do
// Process the message here.
queueClient.DeleteMessage(dequeueMessage.MessageId, dequeueMessage.PopReceipt)
큐 길이 확인하기
큐에 있는 메시지의 추정된 개수를 가져올 수 있습니다. 이 GetProperties 메서드는 메시지 수를 포함하여 큐 특성을 검색하도록 큐 서비스에 요청합니다. 이 ApproximateMessagesCount 속성은 메서드에서 GetProperties 검색한 마지막 값을 반환합니다.
let properties = queueClient.GetProperties().Value
let count = properties.ApproximateMessagesCount
큐를 삭제하세요
큐와 큐에 포함된 모든 메시지를 삭제하려면 큐 개체의 Delete 메서드를 호출합니다.
queueClient.DeleteIfExists()
참고
이전 라이브러리에서 마이그레이션하는 경우 기본적으로 Base64로 인코딩된 메시지이지만 새 라이브러리는 성능이 더 높기 때문에 그렇지 않습니다. 인코딩을 설정하는 방법에 대한 자세한 내용은 을 참조하십시오 MessageEncoding.
참고 항목
.NET