 |
|
난이도 : 초급 Prabhakar Chaganti, CTO, Ylastic, LLC
원문 게재일 : 2008 년 12 월 02 일 번역 게재일 : 2009 년 4 월 14 일 기본적인 Amazon SDB(SimpleDB) 개념에 대해 알아보고 SDB와 상호 작용하기
위한 오픈 소스 Python 라이브러리인 boto에서 제공하는 일부 기능을 살펴보십시오. 이 "Amazon
Web Services를 사용한 클라우드 컴퓨팅" 시리즈에서는 Amazon Web Services를 사용한 클라우드
컴퓨팅에 대해 설명합니다. 신뢰할 수 있으며 확장 가능한 애플리케이션을 만들고 빌드할 수 있는
Amazon Web Services의 뛰어난 기능을 살펴보십시오. 이 기사에서는 Amazon SQS(Simple Queue
Service)에서 제공하는 신뢰할 수 있으며 확장 가능한 메시징 서비스에 대해 설명합니다.
Amazon SQS
Amazon SQS(Simple Queue Service)는 텍스트 메시지를 간편하게 생성, 저장 및
검색할 수 있는 신뢰할 수 있으며 확장 가능한 메시징 프레임워크이다. SQS는 Amazon Web Services
기반 애플리케이션을 통합하기 위한 기본 프레임워크로 사용할 수 있다. SQS를 사용하면 완전히
분리된 웹 확장 애플리케이션을 효율적으로 빌드할 수 있다. 메시지 사용량을 기준으로 비용을
지불하게 된다. 전체 큐잉 프레임워크는 Amazon 데이터 센터의 안전한 환경 내에서 실행된다.
SQS에는 다음과 같은 특징이 있다.
- 신뢰성
- SQS를 사용하면 메시지를 여러 데이터 센터에 중복해서 저장해 두고 항상 사용 가능한 상태로 유지할 수 있다.
- 단순성
- 단순한 프로그래밍 모델을 사용하여 SQS에 액세스하고 사용할 수 있으며 다양한 프로그래밍 언어가 지원된다.
- 보안
- SQS는 높은 수준의 보안을 제공한다. 인증된 사용자만 메시지에 액세스할 수 있다.
- 확장성
- SQS에서는 메시지를 무제한으로 읽고 쓸 수 있는 큐 기반 애플리케이션을 만들 수 있다.
- 경제성
- SQS는 사용자의 메시징 요구에 효과적으로 대응하기 위해 높은 경제성과 경쟁력을 갖춘 요금 체계로 운영된다.
이 섹션의 나머지 부분에서는 SQS 프레임워크의 기본 개념에 대해 살펴본다.
메시지
메시지는 최대 8KB의 텍스트 데이터를 포함한다. 각 메시지는 수신 애플리케이션에서
해당 메시지를 검색할 때까지 저장된다. 수신 애플리케이션이 큐에 있는 메시지를 읽으면 가시성 제한 시간
값(초)이 설정된다. 이 설정은 잠금 기능과 유사하며 지정된 기간 동안 메시지가 다음과 같이
처리된다. - 검색된 메시지는 큐의 다른 소비자가 사용할 수 없다.
- 읽고 있는 프로세스가 메시지를 지우지 않은 상태에서 제한 기간이 만료된 경우에만 메시지가 큐에 다시 표시된다.
메시지는 4일 동안 큐에 보관된다.
 | | Amazon CTO Werner Vogels는 블로그에서 결과적 일관성에 대한 의견을
제시하고 있다(참고자료 참조). |
|
SQS는 큐에 보관된 기간이 4일을 경과한 모든 메시지를 자동으로 삭제한다. SQS는
"결과적 일관성" 모델을 따른다. 즉, 사용자는 메시지를 큐에 전송할 수 있지만 해당 큐의 소비자에게는
해당 메시지가 일정 기간 동안 표시되지 않는다. 그런 다음 결과적으로 메시지가 전달된다. 이는
애플리케이션에서 메시지의 순서를 중요하게 간주하는 경우에 고려해야 하는 중요한 부분이다.
표 1에서는 메시지의 구성 요소를 보여 준다.
표 1. 메시지의 구성 요소
| 구성 요소 | 설명 |
|---|
| MessageId | 메시지를 참조하는 고유 ID |
|---|
| ReceiptHandle | 큐에 있는 메시지가 수신될 때 리턴되는 고유 핸들이다. 이 핸들은 큐에 있는
메시지를 수신할 때마다 달라진다. 이 핸들은 메시지를 삭제할 때 필요하다. |
|---|
| MD5OfBody | URL 인코딩되지 않은 메시지 본문 문자열의 MD5 digest |
|---|
| Body | 실제 메시지 데이터 |
|---|
큐
큐는 메시지의 컨테이너이다. 각 메시지에는 메시지를 저장할 큐가 지정되어
있어야 한다. 큐에 보내진 메시지는 사용자가 명시적으로 삭제할 때까지 큐에 유지된다. 큐는 선입선출(FIFO) 방식으로 정렬되지만
메시지의 순서가 보장되지는 않는다. 각 큐의 기본 가시성 제한
시간은 30초이지만 전체 큐에 대해 이 값을 변경하거나 검색 시 각 메시지에 대해 개별적으로 설정할
수 있다. 큐 또는 메시지의 최대 가시성 제한 시간은 2시간(7,200초)이다. SQS는 30일 동안 어떠한
작업도 수행되지 않은 큐를 자동으로 삭제할 수 있는 권한을 가지고 있다.
설계 고려 사항
SQS에는 일반적인 큐 프레임워크와 약간 다른 점이 있다. SQS 기반 애플리케이션을
설계하기 전에 다음 세 가지 사항을 고려해야 한다.
- SQS는 큐에 있는 메시지의 순서를 보장하지 않는다.
큐에 있는 메시지는 제대로 정렬되지 않는다. 즉, 메시지가 큐에
추가된 순서와 저장된 순서가 서로 다르다. SQS에서는 가능한 한 메시지의 순서를 유지하려고
하지만 메시지를 보낼 때와는 다른 순서로 메시지를 받게 될 수도 있다. 애플리케이션에서
메시지의 순서가 중요한 경우에는 각 메시지에 시퀀싱 데이터를 추가해야 한다.
-
SQS는 큐에 있는 메시지의 삭제를 보장하지 않는다.
같은 메시지가 두 번 이상 처리된 경우 영향을 받지 않도록 애플리케이션을
설계해야 한다. 중복성과 고가용성을 제공하기 위해 SQS는 각 메시지를 여러 서버에 저장한다. 드문
경우이기는 하지만 메시지를 삭제하는 동안 여러 서버 중 한 서버가 중단된 경우, 메시지를 검색할 때
메시지 사본을 다시 가져올 수 있다.
-
SQS는 쿼리의 메시지 중 쿼리된 모든 메시지가 리턴된다고 보장하지 않는다.
SQS는 가중 불규칙 분포를 기반으로 하는 메시지 샘플링을 사용하므로
사용자가 메시지를 쿼리할 경우 샘플링된 일부 서버에 있는 메시지만 리턴한다. 특정 요청이 큐의
모든 메시지를 리턴하지 않더라도 지속적으로 큐를 검색하게 되면 모든 서버가 샘플링되고, 결과적으로
모든 메시지가 리턴된다.
API 버전
SQS에는 초기 버전(2007-05-01)과 2008-01-01 버전이 있다. 각 버전의 API는
주로 릴리스 날짜를 사용하여 구분한다. 2007-05-01 API는 2009년 5월 6일까지만 지원되며,
이후에는 최신 버전의 API만 지원된다. 다음은 강력한 권장 사항이다.
- 기존 버전의 API를 사용하여 빌드된 애플리케이션을 가능한 빨리 마이그레이션한다.
- 혼란을 최소화하기 위해 SQS를 사용하여 새 애플리케이션을 만들 때 최신 버전의 API를 사용한다.
2008-01-01 버전에는 추가 기능 및 수정 사항이 포함되어 있으며, 가격이 변경되었다(대부분
사용자의 경우 SQS 사용 비용이 줄어듬). 하지만 이 버전에 적용된 변경 사항 중에는 이전 버전의 API와
호환되지 않는 중요 사항이 있으므로 이전 버전에서 빌드된 모든 라이브러리와 도구를 수정해야 한다. 버전 간
변경 사항에 대한 자세한 설명은 SQS 웹 사이트(참고자료 참조)에서 볼 수 있다.
가격
다음 세부 가격은 2008-01-01 버전에만 해당한다. 기존 버전의 가격 체계에 대한
세부 사항은 SQS 사이트(참고자료 참조)에서 볼 수 있다. 가격 기준은 다음과 같다.
- 다음과 같은 작업을 포함한 SQS에 보낸 요청 수:
- CreateQueue
- ListQueues
- DeleteQueue
- SendMessage
- ReceiveMessage
- DeleteMessage
- SetQueueAttributes
- GetQueueAttributes
표 2. 요청 가격
|
유형
|
비용
| | SQS 요청 | 요청당 0.000001달러 |
- SQS를 통해 송수신된 데이터의 용량. SQS 및 EC2 인스턴스 사이에
전송된 데이터에는 비용이 부과되지 않는다.
표 3. 데이터 전송 가격
|
전송 유형
|
비용
| | 모든 데이터 전송 | 0.100달러/GB — 모든 수신 데이터
0.170달러/GB — 월간 송신 데이터 중 최초 10TB 0.130달러/GB
— 월간 송신 데이터 중 이후 40TB 0.110달러/GB — 월간 송신 데이터 중 이후 100TB
0.100달러/GB — 월간 송신 데이터 중 150TB를 초과하는 용량 |
Amazon SQS에서 최신 가격 정보를 확인할 수 있으며 Amazon Web Services Simple Monthly Calculator를
사용하여 SQS 및 기타 Amazon Web Services에 대한 월간 사용 비용을 계산할 수 있다(참고자료 참조).
Amazon Web Services 및 SQS 시작하기
SQS를 시작하려면 먼저 Amazon Web Services 계정(참고자료 참조)을
등록해야 한다. Amazon Web Services 등록에 대한 자세한 지침은 이 시리즈의 Part 2에서
볼 수 있다.
Amazon Web Services 계정을 만든 후에는 다음 단계를 수행하여 계정에 대한 Amazon SQS 서비스를
활성화해야 한다.
-
사용자의 Amazon Web Services 계정에 로그인한다.
- SQS 홈 페이지로 이동한다.
- 오른쪽에 있는 Sign Up For Amazon SQS를 클릭한다.
- 요청된 정보를 제공하고 등록 프로세스를 완료한다.
모든 Amazon Web Services 통신은 SOAP 인터페이스 또는 쿼리 인터페이스를
통해서 이루어진다. 이 기사에서는 쿼리 인터페이스를 사용하여 써드파티 라이브러리를 통해
SQS와 통신한다.
액세스 키를 받아야
한다. 액세스 키는 Web
Services Account 정보 페이지에서 View Access Key Identifiers를 선택하여 액세스할
수 있다. 이제 Amazon Web Services를 사용할 준비가 완료되었으며 SQS 서비스를 사용할 수 있게 되었다.
SQS와 상호 작용하기
이 예제에서는 Python 쉘에서 간단한 코드를 실행하여 오픈 소스 써드파티
Python 라이브러리인 boto를
통해 SQS를 익힌다.
boto 설치 및 환경 설정
boto를 다운로드한다. 이
기사를 쓸 때 최신 버전은 1.4c였다. 아카이브를 원하는 디렉토리에 압축 풀기한다. Listing 1과 같이 압축 풀기한
디렉토리로 변경한 후 setup.py를 실행하여 boto를 로컬 Python 환경에 설치한다.
Listing 1. boto 설치하기
$ cd directory_where_you_unzipped_boto
$ python setup.py install
|
Amazon Web Services 액세스 키를 가리키도록 일부 환경 변수를 설정한다. 액세스
키는 Web Services Account 정보에서
확인할 수 있다.
Listing 2. 환경 변수 설정하기
# Export variables with your AWS access keys
$ export AWS_ACCESS_KEY_ID=Your_AWS_Access_Key_ID
$ export AWS_SECRET_ACCESS_KEY=Your_AWS_Secret_Access_Key
|
Listing 3과 같이 Python 쉘을 시작하고 boto 라이브러리를 가져와서 모든 설정이 올바르게 지정되었는지 확인한다.
Listing 3. 설정 확인하기
$ python
Python 2.4.5 (#1, Apr 12 2008, 02:18:19)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto
>>>
|
boto로 SQS 탐색하기
이 예제에서는 SQSConnection 클래스를 사용하여
SQS와 상호 작용하기 위한 기본 인터페이스를 제공한다. boto는 대개 Python 콘솔에서 사용한다. 이
예제에서는 SQSConnection 오브젝트의 다양한 메소드를 호출하여 SQS에서
리턴하는 응답을 확인한다. 이 과정을 통해 API를 익히고 SQS의 기본 개념을 살펴볼 수 있다.
첫 번째 단계에서는 앞에서 사용자의 환경으로 내보낸 Amazon Web Services 액세스
키를 사용하여 SQS에 대한 연결 오브젝트를 생성한다. boto 라이브러리는 항상 이러한 변수가 설정되었는지
확인하기 위해 환경을 먼저 검사한다. 변수가 설정되어 있으면 boto는 연결을 생성할 때 이러한 변수를
자동으로 사용한다.
Listing 4. SQS 연결 생성하기
>>> import boto
>>> sqs_conn = boto.connect_sqs()
>>>
|
이 기사의 나머지 부분에서는 위에서 생성한 sqs_conn 오브젝트를
사용하여 SQS와 통신할 수 있다. 큐의 이름과 옵션 값인 가시성 제한 시간 값을 지정하여 큐를 생성할 수 있다. 제한
시간 값을 생략할 경우 boto는 SQS에서 제공하는 기본값인 30초를 사용하여 큐를 생성한다.
Listing 5. 큐 생성하기
>>> q1 = sqs_conn.create_queue('devworks-sqs-1')
>>>
>>> q1.get_timeout()
30
>>> q2 = sqs_conn.create_queue('devworks-sqs-2', 60)
>>>
>>> q2.get_timeout()
60
>>>
|
Listing 6과 같이 모든 큐 목록을 검색한다. 그러면 Python 목록인 결과 세트 오브젝트가
리턴된다. 이 목록 전체를 반복하여 각 큐에 대한 모든 관련 정보에 액세스할 수 있다.
Listing 6. 모든 큐 표시하기
큐를 삭제하기 전에 큐에 있는 모든 메시지를 삭제해야 한다. boto의 clear()
메소드를 사용하여 큐의 모든 메시지를 삭제할 수 있다.
Listing 7. 큐를 지우고 삭제하기
>>> q2.clear()
0
>>> sqs_conn.delete_queue(q2)
True
>>>
|
최대 8KB 크기의 텍스트 메시지를 큐에 보낼 수 있다. Listing 8과 같이
boto Message 클래스를 사용하여 새 메시지를 생성한다.
Listing 8. 메시지 보내기
>>> from boto.sqs.message import Message
>>>
>>> m1 = Message()
>>>
>>> m1.set_body('Hi there devworks!')
>>>
>>> status = q1.write(m1)
>>>
>>> print status
True
>>>
|
큐의 메시지를 검색하면 메시지 오브젝트가 포함된 Python 목록인 결과 세트
오브젝트가 리턴된다. 각 메시지 오브젝트에는 고유 ID 및 연관된 수신 핸들이 있다. 사용자가
큐의 메시지를 읽게 되면 설정된 큐의 가시성 제한 시간이 만료될 때까지 해당 메시지는 큐의
다른 모든 소비자에게 보이지 않도록 자동 설정된다. 만료 시간이 경과된 후에는 메시지가 큐에
다시 표시되며, 이제 다른 소비자가 해당 메시지를 검색하고 처리할 수 있다. 하지만 가시성
제한 시간이 만료되기 전에 메시지가 큐에서 삭제된 경우에는 메시지가 완전히 제거되었기 때문에
큐에 표시되지 않는다.
Listing 9. 메시지 검색하기
>>> msgs = q1.get_messages()
>>>
>>> len(msgs)
1
>>>
>>> for msg in msgs:
... print "Message ID: ",msg.id
... print "Message Handle: ",msg.receipt_handle
... print "Queue ID: ", msg.queue.id
... print "Message Body: ", msg.get_body()
...
Message ID: 9a930aaf-87de-48ad-894d-b22dd0b1cd1b
Message Handle: Prl0vft3nRjgDDT33svtLnzyPQGWFpRusXdn2v3Lwq+TDtD3hk3aBKbSH1mGc4hzO/VZO
IC0RFyAd7MhbJKPGHn3x35CTz9dAQeNoKYAHiwERXc/xrYXBLGngyuJI+kGmbjvIKqA/wpfQpqzPk2bVA==
Queue ID: /devworks-sqs-1
Message Body: Hi there devworks!
>>>
|
메시지 번호를 지정하여 두 개 이상의 메시지를 검색할 수 있다. boto의 기본
옵션은 한 개의 메시지를 리턴하는 것이다. Listing 10과 같이 다른 메시지를 큐에 추가한 후 모든
메시지를 검색해 보자. 새로 추가한 메시지가 큐에 표시될 때까지 약간의 시간이 소요된다.
Listing 10. 여러 메시지 검색하기
>>> m2 = Message()
>>>
>>> m2.set_body('Still there?')
>>>
>>> status = q1.write(m2)
>>>
>>> print status
True
>>>
>>> msgs = q1.get_messages(10)
>>>
>>> len(msgs)
2
>>>
>>> for msg in msgs:
... print "Message ID: ",msg.id
... print "Message Handle: ",msg.receipt_handle
... print "Queue ID: ", msg.queue.id
... print "Message Body: ", msg.get_body()
... print "*"*80
...
Message ID: 9a930aaf-87de-48ad-894d-b22dd0b1cd1b
Message Handle: Prl0vft3nRjgDDT33svtLnzyPQGWFpRusXdn2v3Lwq+TDtD3hk3aBKbSH1mGc4hzO/VZOIC0R
FyAd7MhbJKPGHn3x35CTz9dAQeNoKYAHiwERXc/xrYXBLGngyuJI+kGmbjvIKqA/wpfQpqzPk2bVA==
Queue ID: /devworks-sqs-1
Message Body: Hi there devworks!
Message ID: ce1632b3-0a6e-4ee2-a5b0-b2e9821d150f
Message Handle: Prl0vft3nRiRunVNVvjOQEc7Tm+uSBQpW4bZcpFMbzWTDtD3hk3aBKbSH1mGc4hzO/VZOIC0R
FxbhtlykUxvNbRQNWJqrMXrxj5m6GwhA7iX0Nu9mqjo+9/hnda8Ou0df+LQ3dOMfXSybzbhed128w==
Queue ID: /devworks-sqs-1
Message Body: Still there?
>>>
|
delete_message()를 호출하여 큐에서 메시지를
삭제할 수 있다. 큐를 삭제하기 전에 큐에 있는 모든 메시지를 삭제해야 한다.
Listing 11. 메시지 삭제하기
>>> msgs = q1.get_messages()
>>>
>>> len(msgs)
1
>>> print msgs[0].get_body()
Hi there devworks!
>>>
>>> q1.delete_message(msgs[0])
True
>>>
|
결론
이 기사에서는 Amazon의 SQS 서비스와 기본 개념을 설명한 후 SQS와 통신하는
기능을 제공하는 오픈 소스 Python 라이브러리인 boto의 일부 기능을 살펴보았다. Amazon SQS
Developer Guide에서 더 많은 정보를 살펴보기를 권한다(참고자료 참조).
이 "Amazon
Web Services를 사용한 클라우드 컴퓨팅" 시리즈의 Part 5에서는
Amazon SimpleDB를 사용하여 클라우드에서 데이터세트를 처리하는 방법에 대해 설명한다.
참고자료 교육
제품 및 기술 얻기
- IBM 제품 평가판을
다운로드하여 DB2®, Lotus®, Rational, Tivoli® 및 WebSphere의
애플리케이션 개발 도구 및 미들웨어 제품을 사용해 보자.
토론
필자소개  | 
|  | Prabhakar Chaganti는 사용자의 전체 AWS 클라우드 컴퓨팅 환경(EC2, S3, SQS 및 SimpleDB
포함)을 설계, 관리 및 모니터링하는 단일 통합 인터페이스를 만들고 있는 신생 업체 Ylastic의
CTO이다. 최근에 Xen Virtualization과 GWT Java AJAX Programming이라는 두 권의
책을 집필했으며, VMware Global Virtual Appliance Challenge에서 가장 혁신적인 가상 어플라이언스에
주어지는 커뮤니티 초이스 상을 수상하기도 했다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|