Boto3 操作AWS的SQS

  1. SQS 介绍:
    Amazon Simple Queue Service (SQS) 是一项快速可靠、可扩展且完全托管的消息队列服务。Amazon SQS 可以简单、经济高效地解耦云应用程序的各个组件。您可以使用 Amazon SQS 来传输任何规模的数据,而不会丢失消息,也不要求其他服务始终可用。Amazon SQS 包括具有高吞吐量和至少一次处理的标准队列,还包括能提供 FIFO (先进先出) 传送和严格一次处理的 FIFO 队列。
  2. 优点:
    可靠
    Amazon SQS 在 Amazon 高度可用的数据中心中运行,因此队列在应用程序需要的任何时候都能保持可用。为防止消息丢失或不可用,所有消息都以冗余形式存储在多个服务器和数据中心内。
    简便
    开发人员最初使用 Amazon SQS 时只需用到 3 个 API:SendMessage、ReceiveMessage 和 DeleteMessage。其他 API 则可用于提供高级的功能。
    灵活
    根据应用程序的需要,使用适当的队列。标准队列提供最高吞吐量、最大努力排序和至少一次传送。FIFO 队列可确保严格排序和严格一次处理,但仅具有有限吞吐量。
    可扩展
    Amazon SQS 可随应用程序一起动态扩展,因此您无需担心提前预置的问题。您可以使用的队列和消息数量没有限制,而且标准队列能提供几乎无限的吞吐量。
    安全
    提供了身份验证机制,确保 Amazon SQS 队列中的消息受到保护,防止遭到未经授权的访问。
    便宜
    Amazon SQS 无前期费用或固定开支。您可以按 API 请求数支付小额费用。如果您跨 AWS 区域传输数据,需支付额外的数据传输费。

  3. 简单的例子:
    创建SQS例子

# Get the service resource
sqs = boto3.resource('sqs')

# Create the queue. This returns an SQS.Queue instance
queue = sqs.create_queue(QueueName='test', Attributes={'DelaySeconds': '5'})

# You can now access identifiers and attributes
print(queue.url)
print(queue.attributes.get('DelaySeconds'))
  • 使用现有的SQS
# Get the service resource
sqs = boto3.resource('sqs')

# Get the queue. This returns an SQS.Queue instance
queue = sqs.get_queue_by_name(QueueName='test')

# You can now access identifiers and attributes
print(queue.url)
print(queue.attributes.get('DelaySeconds'))
  1. 如何跨region使用服务
    由于国内的独特的政策原因,中国区的服务是独立于国外的,所以一旦你需要国外也使用AWS的服务,就面临着同时操作多个账号和不同的region的情况,那么你就需要使用多个密yao,所以官方文档介绍的第一种方法,就不再适用了,我在这里给大家介绍一种简便的方法:
from boto3 import Session
session = Session(region_name='',
        aws_access_key='',
        aws_secret_access_id='')
sqs = session.resource('sqs')
queue = sqs.get_queue_by_name(QueueName='test')

这里缺点是如果没有动态加载密码的系统的话,可能需要hardcode密码,建议一定要动态加载密码。

5.面向对象服务的SQS
下面是一个实际开发中我写的一个面向的对象使用SQS,返回queue对象。

# coding:utf-8
from boto3 import Session
import json
import logging
from error import SqsConnectionError

class SqsConnectionError(Exception):
    pass 

logger = logging.getLogger(__name__)

class MyServiceSqs(object):

    def __init__(self, **kwargs):
        """
        example kwargs = {'region':region_name,'access_key':'dadaderefa1432','secret_key':'jhfoiewhro43h53'}
        """
        self.region = kwargs['region']
        self.access_key = kwargs['access_key']
        self.secret_key = kwargs['secret_key']
        self.session = self.__session()

    def __session(self):
        try:
            session = Session(aws_access_key_id=self.access_key,
                            aws_secret_access_key=self.secret_key,region_name=self.region)
        except:
            raise SqsConnectionError("Failed to connect session in region{0}".format(self.region))

        return session

    def sqs_connect_queue(self, queue_name):
        """
        """
        try:
            sqs = self.session.resource('sqs')
         except:
            raise SqsConnectionError("Failed to retrieve queue{0}".format(queue_name))
        try:
            queue = sqs.get_queue_by_name(QueueName=queue_name)
        except:
            raise SqsConnectionError("Failed to retrieve queue {0} in{1}".format(queue_name))
        return queue


    def poll_message(self, queue_name):
        """
        get batch message from queue, return a list about meesage.body
        """
        queue = self.sqs_connect_queue(queue_name)
        response = queue.receive_messages(MaxNumberOfMessages=10, WaitTimeSeconds=5)
        messages = []
        if not response:
            logger.info("{0} queue don't has any message Notification")
        try:
            for message in response:
                notice = json.loads(message.body)
                messages.append(notice['Message'])
                message.delete
        except:
            logger.error("Can't get message from queue{0}".format(queue))
        return messages

源码:https://github.com/Dushibing/aws/blob/master/MySqsConnector.py
参考文档:
http://boto3.readthedocs.io/en/latest/reference/services/sqs.html
几种主要服务的例子
https://github.com/boto/boto3/tree/develop/docs/source/guide

你可能感兴趣的:(pyhton)