Boto3 操作AWS的SQS

来源:互联网 发布:完全变态 知乎 编辑:程序博客网 时间:2024/06/18 04:32
  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 resourcesqs = boto3.resource('sqs')# Create the queue. This returns an SQS.Queue instancequeue = sqs.create_queue(QueueName='test', Attributes={'DelaySeconds': '5'})# You can now access identifiers and attributesprint(queue.url)print(queue.attributes.get('DelaySeconds'))
  • 使用现有的SQS
# Get the service resourcesqs = boto3.resource('sqs')# Get the queue. This returns an SQS.Queue instancequeue = sqs.get_queue_by_name(QueueName='test')# You can now access identifiers and attributesprint(queue.url)print(queue.attributes.get('DelaySeconds'))
  1. 如何跨region使用服务
    由于国内的独特的政策原因,中国区的服务是独立于国外的,所以一旦你需要国外也使用AWS的服务,就面临着同时操作多个账号和不同的region的情况,那么你就需要使用多个密yao,所以官方文档介绍的第一种方法,就不再适用了,我在这里给大家介绍一种简便的方法:
from boto3 import Sessionsession = 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-8from boto3 import Sessionimport jsonimport loggingfrom error import SqsConnectionErrorclass 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

0 0
原创粉丝点击