[AWS SQS] SQS 구축, EC2에서 메시지 폴링

10438 단어 aws-sdksqsAWSRuby

목표


AWS SQS를 구축하고 정보를 대기열에 투입(AWS 콘솔에서 투입)한 다음에 AWS SDK를 이용하여 EC2에서 투입된 정보를 취득(윤문)한다.

이른바 SQS


AWS에서 제공하는 대기열 서비스는 응용 프로그램 간에 교환된 정보를 수신하는 데 사용됩니다.
이것은 수신자가 SQS에 정보를 문의하여 정보를 얻는 Pull형 서비스다.
SQS에 대한 기본 정보는 다음과 같이 간단명료하게 요약된 것이라고 생각합니다.
Amazon SQS

전제 조건


·AWS SDK(이 기사에서 AWS SDK for Ruby 사용)를 사용할 수 있는 EC2 인스턴스(※)를 구축했습니다.
※ AWS SDK for Ruby 구축 시 참고 절차
【AWS SDK】EC2 자동 구축용 스크립트(1.AWS SDK for Ruby 설정)

작업흐름


항목 수
타이틀
1
SQS 구축
2
SQS에 메시지 보내기
3
EC2에서 메시지 폴링

절차.


1. SQS의 구축


① 열기SQS 콘솔
②클릭キューを作成③ 큐 만들기 설정
이번엔 파 사용(※ 1)
대기열의 이름은 임의입니다.
※ 1SQS에는 다음 두 종류의 대기열이 있습니다.특징을 간단히 요약하다.
• 표준 대열
A:최소한한 번씩메시지를보내는것을보증하며,요청한시간에따라같은메시지를여러 번보낼 수 있습니다.
A:메시지 배달 순서는 최선을 다하는 것(메시지 발송과 배달 순서가 다를 수 있음)
FIFO 대기열
A:같은메시지는여러 번보내지지 않습니다.
●메시지 발송순서는선입선출형(메시지 발송과배포순서동일)
●성능이 높아스탠더드보다조금 비쌉니다.

대기열에 대한 자세한 설정(※ 2)을 수행합니다.
이번メッセージ受信待機時間은 20초로 설정되며 이 외에는 기본적으로 변하지 않습니다.
※ 2 이하는 대기열의 상세 설정 내용을 간단하게 기재합니다.
• 가시성 제한 시간
메시지를 받은 후 일정 시간 동안 이 메시지를 다른 시스템에서 볼 수 없게 하는 기능을 말한다.
지정된 가시성 제한 시간 내에 메시지 처리 완료 및 메시지 삭제
동일한 정보에 대한 여러 번의 처리를 방지할 수 있다.
・발송 지연(지연 대기열)
대기열에 메시지를 보낸 후 지정된 시간이 지나면 메시지를 표시하는 기능
· 메시지 수신 대기 시간
긴 폴링 또는 짧은 폴링을 설정할 수 있습니다.
기본값은 짧은 폴링(메시지 수신 대기 시간은 0초)입니다. 대기열이 비어 있어도 즉시 다시 요청합니다.
SQS는 정보의 요청 횟수에 따라 비용을 판단하기 때문에 빈 소식을 반복해서 요청하면 비용이 증가한다.
효과적인 대책은 장윤문(문자 수신 대기 시간이 0초 이상)이다.
긴 윤문 후 빈 메시지를 받을 때 지정한 초를 기다리기 위해 (대기열 연결을 유지합니다)
SQS의 요구 횟수를 줄여 비용을 절약할 수 있다.
요구에 따라 기본적으로 긴 폴링을 사용하는 것은 AWS의 추천이다.

대기열에 대한 액세스 설정은 기본값으로 유지됩니다.

마지막으로 암호화, 사신 대기열(※ 3), 표시된 설정이 있지만 이번에는 설정하지 않습니다.
클릭キューの作成※ 3 사신 대기열
오류가 발생한 메시지를 몇 번 다시 처리한 후 자동으로 다른 대기열로 이동하는 기능
문제가 있는 소식이 다른 대열에 집중되어 있기 때문에 식별이 쉬워 정규 대열에 남아 있는 것을 방지한다.

2. SQS에 메시지 보내기


AWS 콘솔에서 생성된 SQS 큐에 메시지를 보내보십시오.
① 제작된 SQS 큐의 상세 화면에서 클릭メッセージの送受信
② 작성 メッセージ本文 후 클릭メッセージ送信이 절차를 몇 번 반복하다.

③ 메시지 발송 내용 확인
메시지 발송란 아래 메일 수신란에서 メッセージをポーリング
메시지가 뜨면 OK.

3. EC2에서 메시지 폴링


① AWS SDK for Ruby에서 사용 가능한 EC2 인스턴스에 대한 폴링 실행 스크립트

# **********************************************************************************
# <機能概要>
# 指定したSQSキューのメッセージをポーリングする
#
# <機能詳細>
# 常駐プロセスとして稼働し、指定したSQSキューのメッセージをポーリングし取得時刻及びメッセージ本文を標準出力する。
# 取得したメッセージは出力後削除する。
# メッセージが空の場合は指定した時間(wait_time_seconds)分待機した後、キューが空であることを伝えるメッセージを出力する。
#
# <スクリプト用法>
# ruby <スクリプトパス>
# **********************************************************************************

require 'aws-sdk'

# キュー名
queue_name = "MyTestQueue"

# SQS操作用インスタンス作成
sqs = Aws::SQS::Client.new

# キューURLの取得
begin
  queue_url = sqs.get_queue_url(queue_name: queue_name).queue_url
rescue Aws::SQS::Errors::NonExistentQueue
  puts "A queue named '#{queue_name}' does not exist."
  exit(false)
end

loop do
  # キューからメッセージを取得
  receive_message_result = sqs.receive_message({
    queue_url: queue_url, 
    message_attribute_names: ["All"], # 全属性のメッセージを取得
    max_number_of_messages: 5,        # 最大でも5メッセージの取得
    wait_time_seconds: 20             # メッセージが空の場合は20秒待機
  })

  # メッセージを取得した時刻を取得
  timestamp = Time.new

  # メッセージが空のときはemptyメッセージ出力
  if receive_message_result.messages.nil?
    puts "#{timestamp.strftime("%Y-%m-%d %H:%M:%S")}: Message is empty."
  end


  receive_message_result.messages.each do |message|
    # 取得したメッセージ本文を表示
    puts "#{timestamp.strftime("%Y-%m-%d %H:%M:%S")}: #{message.body}" 

    # メッセージをキューから削除
    sqs.delete_message({
      queue_url: queue_url,
      receipt_handle: message.receipt_handle    
    })
  end
end
② 스크립트를 실행하고 정보를 폴링합니다.
AWS 콘솔에서 미리 투입된 3개의 메시지가 즉시 처리되고 메시지가 비어 있을 때 지정된 시간을 기다리는 것을 확인했다.
또 소식을 기다리는 동안 새 소식에 대해 줄을 서면 즉시 처리될 것임을 확인할 수 있다.

[ec2-user@basehost ~]$ ruby queue.rb
2020-07-21 04:13:32: test2          # AWSコンソールから事前投入したメッセージその1
2020-07-21 04:13:33: test3          # AWSコンソールから事前投入したメッセージその2
2020-07-21 04:13:33: test1          # AWSコンソールから事前投入したメッセージその3
2020-07-21 04:13:53: Message is empty.    # wait_time_secondsで指定した時間分(20秒)待機後、emptyメッセージ出力
2020-07-21 04:14:01: This message is the message sent during the waiting time.   # メッセージ待機時間中にキューにプットしたメッセージ、プット後即座に処理された。
2020-07-21 04:14:21: Message is empty.
2020-07-21 04:14:41: Message is empty.
2020-07-21 04:15:01: Message is empty.

좋은 웹페이지 즐겨찾기