Azure 큐 서비스를 사용 하 여 node.js에서 큐 만들기 및 삭제Use Azure Queue Service to create and delete queues from Node.js

Azure Storage 코드 샘플 리포지토리 확인Check out the Azure Storage code samples repository

다운로드하고 실행할 수 있는 엔드투엔드 Azure Storage 코드 샘플을 쉽게 사용하려면 Azure Storage 샘플 목록을 확인하세요.For easy-to-use end-to-end Azure Storage code samples that you can download and run, please check out our list of Azure Storage Samples.

개요Overview

이 가이드에서는 Microsoft Azure 큐 서비스를 사용하여 일반 시나리오를 수행하는 방법을 설명합니다.This guide shows you how to perform common scenarios using the Microsoft Azure Queue service. 샘플은 Node.js API를 사용하여 작성되었습니다.The samples are written using the Node.js API. 여기서 다루는 시나리오에는 큐 만들기 및 삭제뿐만 아니라 큐 메시지 삽입, 보기, 가져오기삭제가 포함됩니다.The scenarios covered include inserting, peeking, getting, and deleting queue messages, as well as creating and deleting queues.

Queue storage 란?What is queue storage?

Azure Queue Storage는 HTTP 또는 HTTPS를 사용하여 인증된 호출을 통해 전 세계 어디에서나 액세스할 수 있는 다수의 메시지를 저장하기 위한 서비스입니다.Azure Queue storage is a service for storing large numbers of messages that can be accessed from anywhere in the world via authenticated calls using HTTP or HTTPS. 단일 큐 메시지의 크기는 최대 64KB일 수 있으며, 하나의 큐에 스토리지 계정의 총 용량 제한까지 수백만 개의 메시지가 포함될 수 있습니다.A single queue message can be up to 64 KB in size, and a queue can contain millions of messages, up to the total capacity limit of a storage account. 큐 저장소는 비동기적으로 처리할 작업의 백로그를 만드는 데 주로 사용 됩니다.Queue storage is often used to create a backlog of work to process asynchronously.

큐 서비스 개념Queue service concepts

Azure 큐 서비스에는 다음 구성 요소가 포함 되어 있습니다.The Azure Queue service contains the following components:

Azure 큐 서비스 구성 요소

  • URL 형식: 다음 URL 형식을 사용하여 큐에 주소를 지정할 수 있습니다.URL format: Queues are addressable using the following URL format:
    http://<storage account>.queue.core.windows.net/<queue>http://<storage account>.queue.core.windows.net/<queue>

    다음 URL은 다이어그램에 있는 큐의 주소를 지정합니다.The following URL addresses a queue in the diagram:

    http://myaccount.queue.core.windows.net/images-to-download

  • Storage 계정: Azure Storage에 대한 모든 액세스는 Storage 계정을 통해 수행됩니다.Storage Account: All access to Azure Storage is done through a storage account. Storage 계정 용량에 대한 자세한 내용은 Azure Storage 확장성 및 성능 목표 (영문)를 참조하십시오.See Azure Storage Scalability and Performance Targets for details about storage account capacity.

  • 큐: 큐에는 메시지 집합이 포함됩니다.Queue: A queue contains a set of messages. 모든 메시지는 큐에 있어야 합니다.All messages must be in a queue. 큐 이름은 모두 소문자여야 합니다.Note that the queue name must be all lowercase. 큐의 명명에 대한 자세한 내용은 큐 및 메타데이터 명명을 참조하세요.For information on naming queues, see Naming Queues and Metadata.

  • 메시지: 최대 64KB인 임의 형식의 메시지입니다.Message: A message, in any format, of up to 64 KB. 메시지가 큐에 남아 있을 수 있는 최대 시간은 7일입니다.The maximum time that a message can remain in the queue is 7 days.

Azure Storage 계정 만들기Create an Azure storage account

첫 번째 Azure Storage 계정을 가장 쉽게 만드는 방법은 Azure Portal을 사용하는 것입니다.The easiest way to create your first Azure storage account is by using the Azure portal. 자세한 내용은 스토리지 계정 만들기를 참조하십시오.To learn more, see Create a storage account.

또한 Azure PowerShell, Azure CLI 또는 .NET용 Azure Storage 리소스 공급자를 사용하여 Azure 스토리지 계정을 만들 수도 있습니다.You can also create an Azure storage account by using Azure PowerShell, Azure CLI, or the Azure Storage Resource Provider for .NET.

이 시점에서 스토리지 계정을 Azure에 만들지 않으려면 Azure 스토리지 에뮬레이터를 사용하여 로컬 환경에서 코드를 실행하고 테스트할 수도 있습니다.If you prefer not to create a storage account in Azure at this time, you can also use the Azure storage emulator to run and test your code in a local environment. 자세한 내용은 개발 및 테스트에 Azure Storage 에뮬레이터 사용을 참조하세요.For more information, see Use the Azure Storage Emulator for Development and Testing.

Node.js 애플리케이션 만들기Create a Node.js Application

빈 Node.js 애플리케이션을 만듭니다.Create a blank Node.js application. Node.js 애플리케이션을 만드는 방법에 대한 지침은 Azure App Service에서 Node.js 웹앱 만들기, Azure Cloud Service에 Node.js 애플리케이션 빌드 및 배포(Windows PowerShell 사용) 또는 Visual Studio Code를 참조하세요.For instructions creating a Node.js application, see Create a Node.js web app in Azure App Service, Build and deploy a Node.js application to an Azure Cloud Service using Windows PowerShell, or Visual Studio Code.

스토리지에 액세스하도록 애플리케이션 구성Configure Your Application to Access Storage

Azure Storage를 사용하려면 스토리지 REST 서비스와 통신하는 편리한 라이브러리 집합이 포함되어 있는 Node.js용 Azure Storage SDK가 필요합니다.To use Azure storage, you need the Azure Storage SDK for Node.js, which includes a set of convenience libraries that communicate with the storage REST services.

NPM(Node Package Manager)을 사용하여 패키지 가져오기Use Node Package Manager (NPM) to obtain the package

  1. PowerShell(Windows), Terminal(Mac) 또는 Bash (Unix)과 같은 명령줄 인터페이스를 사용하여 샘플 애플리케이션을 만든 폴더로 이동합니다.Use a command-line interface such as PowerShell (Windows,) Terminal (Mac,) or Bash (Unix), navigate to the folder where you created your sample application.

  2. 명령 창에 npm install azure-storage 를 입력합니다.Type npm install azure-storage in the command window. 명령 출력은 다음 예제와 비슷합니다.Output from the command is similar to the following example.

    azure-storage@0.5.0 node_modules\azure-storage
    +-- extend@1.2.1
    +-- xmlbuilder@0.4.3
    +-- mime@1.2.11
    +-- node-uuid@1.4.3
    +-- validator@3.22.2
    +-- underscore@1.4.4
    +-- readable-stream@1.0.33 (string_decoder@0.10.31, isarray@0.0.1, inherits@2.0.1, core-util-is@1.0.1)
    +-- xml2js@0.2.7 (sax@0.5.2)
    +-- request@2.57.0 (caseless@0.10.0, aws-sign2@0.5.0, forever-agent@0.6.1, stringstream@0.0.4, oauth-sign@0.8.0, tunnel-agent@0.4.1, isstream@0.1.2, json-stringify-safe@5.0.1, bl@0.9.4, combined-stream@1.0.5, qs@3.1.0, mime-types@2.0.14, form-data@0.2.0, http-signature@0.11.0, tough-cookie@2.0.0, hawk@2.3.1, har-validator@1.8.0)
    
  3. ls 명령을 수동으로 실행하여 node_modules 폴더가 만들어졌는지 확인할 수 있습니다.You can manually run the ls command to verify that a node_modules folder was created. 이 폴더에서 스토리지에 액세스하는 데 필요한 라이브러리가 들어 있는 azure-storage 패키지를 찾습니다.Inside that folder you will find the azure-storage package, which contains the libraries you need to access storage.

패키지 가져오기Import the package

메모장 또는 다른 텍스트 편집기를 사용하여 스토리지를 사용할 애플리케이션의 server.js 파일 맨 위에 다음을 추가합니다.Using Notepad or another text editor, add the following to the top the server.js file of the application where you intend to use storage:

var azure = require('azure-storage');

Azure Storage 연결 설정Setup an Azure Storage Connection

Azure 모듈은 AZURE_STORAGE_ACCOUNT 및 AZURE_STORAGE_ACCESS_KEY 또는 AZURE_STORAGE_CONNECTION_STRING 환경 변수를 읽고 Azure Storage 계정에 연결하는 데 필요한 정보를 확인합니다.The azure module will read the environment variables AZURE_STORAGE_ACCOUNT and AZURE_STORAGE_ACCESS_KEY, or AZURE_STORAGE_CONNECTION_STRING for information required to connect to your Azure storage account. 이러한 환경 변수가 설정되지 않은 경우 createQueueService를 호출할 때 계정 정보를 지정해야 합니다.If these environment variables are not set, you must specify the account information when calling createQueueService.

방법: 큐 만들기How To: Create a Queue

다음 코드는 QueueService 개체를 만들어 큐 작업을 수행할 수 있게 해 줍니다.The following code creates a QueueService object, which enables you to work with queues.

var queueSvc = azure.createQueueService();

createQueueIfNotExists 메서드를 사용합니다. 이 메서드는 지정된 큐가 이미 있으면 해당 큐를 반환하고 지정된 큐가 아직 없으면 지정한 이름으로 새 큐를 만듭니다.Use the createQueueIfNotExists method, which returns the specified queue if it already exists or creates a new queue with the specified name if it does not already exist.

queueSvc.createQueueIfNotExists('myqueue', function(error, results, response){
  if(!error){
    // Queue created or exists
  }
});

큐가 만들어지면 result.created 는 true가 됩니다.If the queue is created, result.created is true. 큐가 있을 경우 result.created 는 false가 됩니다.If the queue exists, result.created is false.

필터Filters

QueueService를 사용하여 수행되는 작업에 선택적 필터링 작업을 적용할 수 있습니다.Optional filtering operations can be applied to operations performed using QueueService. 필터링 작업은 로깅, 자동 재시도 등을 포함할 수 있습니다. 필터는 시그니쳐가 있는 메서드를 구현하는 개체입니다.Filtering operations can include logging, automatically retrying, etc. Filters are objects that implement a method with the signature:

function handle (requestOptions, next)

요청 옵션에 대한 전처리를 수행한 후 메서드는 다음 서명을 사용하여 콜백을 전달하는 "next"를 호출해야 합니다.After doing its preprocessing on the request options, the method needs to call "next" passing a callback with the following signature:

function (returnObject, finalCallback, next)

이 콜백에서 returnObject(서버에 요청 응답 반환)를 처리한 후 콜백은 next(있는 경우)를 호출하여 다른 필터를 계속 처리하거나 finalCallback을 호출하여 서비스 호출을 종료해야 합니다.In this callback, and after processing the returnObject (the response from the request to the server), the callback needs to either invoke next if it exists to continue processing other filters or simply invoke finalCallback otherwise to end up the service invocation.

Node.js용 Azure SDK에는 재시도 논리를 구현하는 두 필터 ExponentialRetryPolicyFilterLinearRetryPolicyFilter가 포함되어 있습니다.Two filters that implement retry logic are included with the Azure SDK for Node.js, ExponentialRetryPolicyFilter and LinearRetryPolicyFilter. 다음은 ExponentialRetryPolicyFilter를 사용하는 QueueService 개체를 만듭니다.The following creates a QueueService object that uses the ExponentialRetryPolicyFilter:

var retryOperations = new azure.ExponentialRetryPolicyFilter();
var queueSvc = azure.createQueueService().withFilter(retryOperations);

방법: 큐에 메시지 삽입How To: Insert a Message into a Queue

큐에 메시지를 삽입하려면 createMessage 메서드를 사용하여 새 메시지를 만들고 이 메시지를 큐에 추가하면 됩니다.To insert a message into a queue, use the createMessage method to create a new message and add it to the queue.

queueSvc.createMessage('myqueue', "Hello world!", function(error, results, response){
  if(!error){
    // Message inserted
  }
});

방법: 다음 메시지 피킹How To: Peek at the Next Message

큐에서 메시지를 제거하지 않고도 peekMessages 메서드를 호출하여 큐의 맨 앞에서 원하는 메시지를 볼 수 있습니다.You can peek at the message in the front of a queue without removing it from the queue by calling the peekMessages method. 기본적으로 peekMessages 는 단일 메시지를 볼 수 있게 해 줍니다.By default, peekMessages peeks at a single message.

queueSvc.peekMessages('myqueue', function(error, results, response){
  if(!error){
    // Message text is in results[0].messageText
  }
});

result 에 메시지가 포함됩니다.The result contains the message.

참고

큐에 메시지가 없을 때 peekMessages 를 사용하면 오류가 반환되지 않지만 메시지도 반환되지 않습니다.Using peekMessages when there are no messages in the queue will not return an error, however no messages will be returned.

방법: 큐에서 다음 메시지 제거How To: Dequeue the Next Message

메시지 처리는 2단계 프로세스입니다.Processing a message is a two-stage process:

  1. 메시지를 큐에서 제거합니다.Dequeue the message.
  2. 메시지를 삭제합니다.Delete the message.

메시지를 큐에서 제거하려면 getMessage를 사용합니다.To dequeue a message, use getMessages. 그러면 큐에서 메시지가 보이지 않으므로 다른 클라이언트에서 처리할 수 없습니다.This makes the messages invisible in the queue, so no other clients can process them. 애플리케이션에서 메시지를 처리하고 나면 deleteMessage를 호출하여 큐에서 삭제합니다.Once your application has processed a message, call deleteMessage to delete it from the queue. 다음 예제에서는 메시지를 가져온 후 삭제합니다.The following example gets a message, then deletes it:

queueSvc.getMessages('myqueue', function(error, results, response){
  if(!error){
    // Message text is in results[0].messageText
    var message = results[0];
    queueSvc.deleteMessage('myqueue', message.messageId, message.popReceipt, function(error, response){
      if(!error){
        //message deleted
      }
    });
  }
});

참고

기본적으로 메시지는 30초 동안만 숨겨져 있다가 다른 클라이언트에 표시됩니다.By default, a message is only hidden for 30 seconds, after which it is visible to other clients. options.visibilityTimeoutgetMessages를 사용하여 다른 값을 지정할 수 있습니다.You can specify a different value by using options.visibilityTimeout with getMessages.

참고

큐에 메시지가 없을 때 getMessages 를 사용하면 오류가 반환되지 않지만 메시지도 반환되지 않습니다.Using getMessages when there are no messages in the queue will not return an error, however no messages will be returned.

방법: 큐 대기 메시지의 콘텐츠 변경How To: Change the Contents of a Queued Message

updateMessage를 사용하면 큐에 있는 메시지의 콘텐츠를 변경할 수 있습니다.You can change the contents of a message in-place in the queue using updateMessage. 다음 예제에서는 메시지의 텍스트를 업데이트합니다.The following example updates the text of a message:

queueSvc.getMessages('myqueue', function(error, getResults, getResponse){
  if(!error){
    // Got the message
    var message = getResults[0];
    queueSvc.updateMessage('myqueue', message.messageId, message.popReceipt, 10, {messageText: 'new text'}, function(error, updateResults, updateResponse){
      if(!error){
        // Message updated successfully
      }
    });
  }
});

방법: 큐에서 메시지를 제거하는 추가 옵션How To: Additional Options for Dequeuing Messages

큐에서 메시지 검색을 사용자 지정할 수 있는 방법으로는 두 가지가 있습니다.There are two ways you can customize message retrieval from a queue:

  • options.numOfMessages - 메시지 배치를 검색합니다(최대 32개).options.numOfMessages - Retrieve a batch of messages (up to 32.)
  • options.visibilityTimeout - 표시하지 않는 시간 제한을 더 길거나 짧게 설정합니다.options.visibilityTimeout - Set a longer or shorter invisibility timeout.

다음 예에서는 getMessages 메서드를 사용하여 한 번 호출에 15개의 메시지를 가져옵니다.The following example uses the getMessages method to get 15 messages in one call. 그런 다음에 for 루프를 사용하여 각 메시지를 처리합니다.Then it processes each message using a for loop. 또한 이 메서드에서 반환되는 모든 메시지의 표시하지 않는 시간 제한을 5분으로 설정합니다.It also sets the invisibility timeout to five minutes for all messages returned by this method.

queueSvc.getMessages('myqueue', {numOfMessages: 15, visibilityTimeout: 5 * 60}, function(error, results, getResponse){
  if(!error){
    // Messages retrieved
    for(var index in result){
      // text is available in result[index].messageText
      var message = results[index];
      queueSvc.deleteMessage(queueName, message.messageId, message.popReceipt, function(error, deleteResponse){
        if(!error){
          // Message deleted
        }
      });
    }
  }
});

방법: 큐 길이 가져오기How To: Get the Queue Length

getQueueMetadata 에서는 큐에서 대기 중인 메시지의 대략적인 수와 같이 큐에 관련된 메타데이터를 반환합니다.The getQueueMetadata returns metadata about the queue, including the approximate number of messages waiting in the queue.

queueSvc.getQueueMetadata('myqueue', function(error, results, response){
  if(!error){
    // Queue length is available in results.approximateMessageCount
  }
});

방법: 큐 나열How To: List Queues

큐 목록을 검색하려면 listQueuesSegmented를 사용합니다.To retrieve a list of queues, use listQueuesSegmented. 특정 접두사를 기준으로 필터링된 목록을 검색하려면 listQueuesSegmentedWithPrefix를 사용합니다.To retrieve a list filtered by a specific prefix, use listQueuesSegmentedWithPrefix.

queueSvc.listQueuesSegmented(null, function(error, results, response){
  if(!error){
    // results.entries contains the list of queues
  }
});

큐를 모두 반환할 수 없는 경우에는 result.continuationTokenlistQueuesSegmented의 첫 번째 매개 변수나 listQueuesSegmentedWithPrefix의 두 번째 매개 변수로 사용하여 더 많은 결과를 검색할 수 있습니다.If all queues cannot be returned, result.continuationToken can be used as the first parameter of listQueuesSegmented or the second parameter of listQueuesSegmentedWithPrefix to retrieve more results.

방법: 큐 삭제How To: Delete a Queue

큐 및 해당 큐의 모든 메시지를 삭제하려면 큐 개체의 deleteQueue 메서드를 호출합니다.To delete a queue and all the messages contained in it, call the deleteQueue method on the queue object.

queueSvc.deleteQueue(queueName, function(error, response){
  if(!error){
    // Queue has been deleted
  }
});

큐를 삭제하지 않고 모든 메시지를 지우려면 clearMessages를 사용합니다.To clear all messages from a queue without deleting it, use clearMessages.

방법: 공유 액세스 서명으로 작업How to: Work with Shared Access Signatures

SAS(공유 액세스 서명)는 스토리지 계정 이름이나 키를 제공하지 않으면서 큐에 세분화된 액세스 권한을 안전하게 제공하는 방법입니다.Shared Access Signatures (SAS) are a secure way to provide granular access to queues without providing your storage account name or keys. SAS는 모바일 앱에서 메시지를 제출하도록 허용하는 경우와 같이 큐에 대해 제한된 액세스를 제공하는 경우에 자주 사용합니다.SAS are often used to provide limited access to your queues, such as allowing a mobile app to submit messages.

클라우드 기반 서비스와 같이 신뢰할 수 있는 애플리케이션에서는 QueueServicegenerateSharedAccessSignature를 사용하여 SAS를 생성하고 신뢰할 수 없거나 신뢰가 약한 애플리케이션에 제공합니다.A trusted application such as a cloud-based service generates a SAS using the generateSharedAccessSignature of the QueueService, and provides it to an untrusted or semi-trusted application. 예를 들면 모바일 앱이 여기에 해당됩니다.For example, a mobile app. SAS는 SAS가 유효한 시작 및 종료 날짜와 SAS 소유자에게 부여되는 액세스 수준을 설명하는 정책을 사용하여 생성됩니다.The SAS is generated using a policy, which describes the start and end dates during which the SAS is valid, as well as the access level granted to the SAS holder.

다음 예에서는 SAS 소유자가 큐에 메시지를 추가할 수 있도록 허용하며 만든 후 100분이 지나면 만료되는 새 공유 액세스 정책을 생성합니다.The following example generates a new shared access policy that will allow the SAS holder to add messages to the queue, and expires 100 minutes after the time it is created.

var startDate = new Date();
var expiryDate = new Date(startDate);
expiryDate.setMinutes(startDate.getMinutes() + 100);
startDate.setMinutes(startDate.getMinutes() - 100);

var sharedAccessPolicy = {
  AccessPolicy: {
    Permissions: azure.QueueUtilities.SharedAccessPermissions.ADD,
    Start: startDate,
    Expiry: expiryDate
  }
};

var queueSAS = queueSvc.generateSharedAccessSignature('myqueue', sharedAccessPolicy);
var host = queueSvc.host;

SAS 소유자가 큐에 액세스할 때 필요하므로 호스트 정보도 제공해야 합니다.Note that the host information must be provided also, as it is required when the SAS holder attempts to access the queue.

그런 다음, 클라이언트 애플리케이션은 QueueServiceWithSAS에서 SAS를 사용하여 큐에 대한 작업을 수행합니다.The client application then uses the SAS with QueueServiceWithSAS to perform operations against the queue. 다음 예에서는 큐를 연결하고 메시지를 만듭니다.The following example connects to the queue and creates a message.

var sharedQueueService = azure.createQueueServiceWithSas(host, queueSAS);
sharedQueueService.createMessage('myqueue', 'Hello world from SAS!', function(error, result, response){
  if(!error){
    //message added
  }
});

SAS가 추가 액세스만으로 생성되었기 때문에 메시지를 읽거나 업데이트, 삭제하려고 하면 오류가 반환됩니다.Since the SAS was generated with add access, if an attempt were made to read, update or delete messages, an error would be returned.

액세스 제어 목록Access control lists

ACL(Access Control 목록)을 사용하여 SAS에 액세스 정책을 설정할 수도 있습니다.You can also use an Access Control List (ACL) to set the access policy for a SAS. 이 방법은 여러 클라이언트에서 큐에 액세스하게 하면서 각 클라이언트에 서로 다른 액세스 정책을 제공하려는 경우에 유용합니다.This is useful if you wish to allow multiple clients to access the queue, but provide different access policies for each client.

ACL은 각 정책에 ID가 연결된 액세스 정책 배열을 사용하여 구현됩니다.An ACL is implemented using an array of access policies, with an ID associated with each policy. 다음 예에서는 'user1'과 'user2'에 대해 하나씩, 두 개의 정책을 정의합니다.The following example defines two policies; one for 'user1' and one for 'user2':

var sharedAccessPolicy = {
  user1: {
    Permissions: azure.QueueUtilities.SharedAccessPermissions.PROCESS,
    Start: startDate,
    Expiry: expiryDate
  },
  user2: {
    Permissions: azure.QueueUtilities.SharedAccessPermissions.ADD,
    Start: startDate,
    Expiry: expiryDate
  }
};

다음 예에서는 myqueue에 대한 현재 ACL을 가져온 다음 setQueueAcl을 사용하여 새 정책을 추가합니다.The following example gets the current ACL for myqueue, then adds the new policies using setQueueAcl. 이 접근 방식을 통해 다음을 수행할 수 있습니다.This approach allows:

var extend = require('extend');
queueSvc.getQueueAcl('myqueue', function(error, result, response) {
  if(!error){
    var newSignedIdentifiers = extend(true, result.signedIdentifiers, sharedAccessPolicy);
    queueSvc.setQueueAcl('myqueue', newSignedIdentifiers, function(error, result, response){
      if(!error){
        // ACL set
      }
    });
  }
});

ACL이 설정되고 나면 정책의 ID를 기반으로 SAS를 만들 수 있습니다.Once the ACL has been set, you can then create a SAS based on the ID for a policy. 다음 예에서는 'user2'에 대해 새 SAS를 만듭니다.The following example creates a new SAS for 'user2':

queueSAS = queueSvc.generateSharedAccessSignature('myqueue', { Id: 'user2' });

다음 단계Next Steps

이제 Queue Storage의 기본 사항을 배웠으므로 다음 링크를 따라 좀 더 복잡한 스토리지 작업에 대해 알아보세요.Now that you've learned the basics of queue storage, follow these links to learn about more complex storage tasks.

Azure App Service에서 Node.js 웹앱 만들기Create a Node.js web app in Azure App Service

Azure Cloud Service에서 Node.js 애플리케이션 빌드 및 배포Build and deploy a Node.js application to an Azure Cloud Service