零基础5分钟上手亚马逊云科技-利用MQ为应用解耦

news2024/11/23 22:30:46

简介:

欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。

我会每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿云开发/架构技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS最佳实践,并应用到自己的日常工作里。本次介绍的是如何利用亚马逊云科技上的MessageQueue为应用程序解耦,实现异步处理,提升应用扩展性、可用性和容错性的全部方案。本方案架构图如下:

方案所需基础知识 

什么是亚马逊云科技 SQS 服务?

亚马逊云科技的简单队列服务(Amazon Simple Queue Service,SQS)是一项全托管的消息队列服务,允许不同的应用组件之间发送、存储和接收消息。SQS 使得微服务、分布式系统和无服务器应用可以在高容量下解耦和扩展,不会丢失消息,也不需要各个服务同时在线。

利用 SQS 为应用解耦的优势

提高可扩展性

SQS 使得应用的不同组件能够独立扩展。通过解耦服务,各组件可以根据自身的需求独立扩展,不会相互影响,从而更有效地处理不同的负载。

增强可靠性

SQS 确保了服务之间消息传递的可靠性,即使其中一个服务暂时不可用,也不会丢失消息。这种机制使系统能够平稳运行,提高了应用的整体可靠性。

简化维护

通过解耦应用组件,SQS 减少了管理服务之间依赖关系的复杂性。这使得更新、修改或替换单个组件变得更加容易,不会影响整个系统。

增加灵活性

SQS 提供异步通信,允许各个服务以自己的节奏处理消息。这种灵活性特别适合工作负载不均或需要整合运行速度不同的服务的场景。

成本优化

使用 SQS,可以根据需要扩展特定的组件,而不是为整个系统过度配置资源。这种有针对性的扩展优化了资源利用率,节省了成本。

本方案包括的内容

1. 创建一个亚马逊云科技消息服务SNS

2. 创建一个亚马逊云科技Message Queue队列SQS

3. 将SQS队列订阅到SNS服务上

项目搭建具体步骤 

1. 首先我们登录亚马逊云科技控制台,进入亚马逊云科技SNS消息服务

2.  创建一个SNS消息话题“ImageNotification”,每一个话题就是一个传递消息的通道。点击“Next Step”进入创建页面,点击Create创建。

3. 点击进入该SNS话题,复制SNS的ARN ID。

4. 我们再进入Message Queue:SQS服务,点击"Create Queue"创建一个SQS。为Queue命名为“ImageQueue”

5. 在Access Policy中复制以下内容,将刚刚复制的SNS ARN ID替换到“SNS_TOPIC_ARN”的值,授权SNS发送消息到SQS中。最后点击"Create Queue"创建该队列。

,{
    "Effect":"Allow",
    "Principal": {
        "Service": "sns.amazonaws.com"
    },
    "Action":"sqs:SendMessage",
    "Resource":"SQS_QUEUE_ARN",
    "Condition":{
        "ArnEquals":{
            "aws:SourceArn":"SNS_TOPIC_ARN"
        }
    }
}

6. 接下来我们进入创建的Queue中,复制访问该Queue的URL,该URL可以用过API “sqs.send_message()调用”。

7. 接下来我们将该Queue订阅到我们刚刚创建的SNS消息通道。

8. 接下来我们选择订阅到我们刚刚创建的SNS话题“ImageNotification”,点击Save保存。

9. 接下来我们就可以通过以下代码示例向SNS发送消息,并将SNS消息同时发送给多个订阅者(微服务),相对于点对点的SQS订阅,有更好灵活的分发功能。

import boto3
import json

# 配置 AWS 认证
# 注意:你可以通过AWS CLI配置文件或者环境变量来设置你的凭证
sns = boto3.client('sns', region_name='us-east-1')

# 替换为你的SNS话题ARN
topic_arn = 'arn:aws:sns:us-east-1:123456789012:my-topic'

# 发送消息到SNS话题
def publish_message():
    message = {
        'order_id': '123456',
        'status': 'created',
        'customer_id': '78910'
    }
    response = sns.publish(
        TopicArn=topic_arn,
        Message=json.dumps(message),
        Subject='Order Created',
        MessageAttributes={
            'AttributeOne': {
                'StringValue': 'Value1',
                'DataType': 'String'
            }
        }
    )
    print(f"Message sent with ID: {response['MessageId']}")

if __name__ == '__main__':
    publish_message()

 

如何用Python代码创建Amazon SNS和SQS为应用解耦

import boto3

# 配置 AWS 区域
region_name = 'us-east-1'

# 创建 SNS 客户端
sns = boto3.client('sns', region_name=region_name)

# 创建 SQS 客户端
sqs = boto3.client('sqs', region_name=region_name)

# 创建 SNS 主题
def create_sns_topic(topic_name):
    response = sns.create_topic(Name=topic_name)
    topic_arn = response['TopicArn']
    print(f"Created SNS topic with ARN: {topic_arn}")
    return topic_arn

# 创建 SQS 队列
def create_sqs_queue(queue_name):
    response = sqs.create_queue(QueueName=queue_name)
    queue_url = response['QueueUrl']
    print(f"Created SQS queue with URL: {queue_url}")
    return queue_url

# 获取 SQS 队列的 ARN
def get_sqs_queue_arn(queue_url):
    response = sqs.get_queue_attributes(
        QueueUrl=queue_url,
        AttributeNames=['QueueArn']
    )
    return response['Attributes']['QueueArn']

# 订阅 SQS 到 SNS 主题
def subscribe_sqs_to_sns(topic_arn, queue_arn):
    response = sns.subscribe(
        TopicArn=topic_arn,
        Protocol='sqs',
        Endpoint=queue_arn
    )
    subscription_arn = response['SubscriptionArn']
    print(f"Subscribed SQS to SNS with Subscription ARN: {subscription_arn}")
    return subscription_arn

# 设置 SQS 队列策略,允许SNS发送消息到SQS队列
def set_sqs_policy(queue_url, queue_arn, topic_arn):
    policy = {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {"Service": "sns.amazonaws.com"},
                "Action": "SQS:SendMessage",
                "Resource": queue_arn,
                "Condition": {
                    "ArnEquals": {"aws:SourceArn": topic_arn}
                }
            }
        ]
    }
    
    sqs.set_queue_attributes(
        QueueUrl=queue_url,
        Attributes={
            'Policy': json.dumps(policy)
        }
    )
    print("SQS policy set to allow SNS topic to send messages.")

if __name__ == '__main__':
    # 定义 SNS 主题和 SQS 队列的名称
    topic_name = 'my-sns-topic'
    queue_name = 'my-sqs-queue'
    
    # 创建 SNS 主题
    topic_arn = create_sns_topic(topic_name)
    
    # 创建 SQS 队列
    queue_url = create_sqs_queue(queue_name)
    
    # 获取 SQS 队列的 ARN
    queue_arn = get_sqs_queue_arn(queue_url)
    
    # 设置 SQS 队列策略,允许SNS发送消息到SQS
    set_sqs_policy(queue_url, queue_arn, topic_arn)
    
    # 订阅 SQS 队列到 SNS 主题
    subscribe_sqs_to_sns(topic_arn, queue_arn)
    
    print("SNS topic and SQS queue setup completed.")

代码解释:

创建SNS Topic (create_sns_topic):

使用create_topic方法创建一个SNS话题,并返回其ARN(Amazon Resource Name)。

创建SQS队列 (create_sqs_queue):

使用create_queue方法创建一个SQS队列,并返回其URL。

获取SQS队列的ARN (get_sqs_queue_arn):

使用get_queue_attributes方法获取队列的ARN,这是订阅SNS话题所需要的。

设置SQS队列的策略 (set_sqs_policy):

创建并应用一个队列策略,使SNS话题能够向SQS队列发送消息。这一步是必须的,否则即使SNS订阅成功,消息也无法发送到SQS队列。

订阅SQS到SNS话题 (subscribe_sqs_to_sns):

使用subscribe方法将SQS队列订阅到SNS话题。这里需要提供队列的ARN和SNS话题的ARN。

设置SQS队列策略 (set_sqs_policy):

这里设置SQS队列的访问策略,允许SNS话题向该队列发送消息。

以上就是在亚马逊云科技上利用Message Queue为应用解耦,提升可用性和容错性的全部步骤。欢迎大家关注0基础5分钟上手AWS系列,未来获取更多国际前沿的AWS云开发/云架构方案!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭秘AI绘画赚钱之道:学会这十大技巧,轻松踏入高薪岗位,实现财务自由!

亲爱的学友们,当我们谈论AI绘画,不仅仅是在描绘科技如何重塑艺术疆界,更是在探索一场颠覆性的商业革命。自从AI绘画技术从萌芽走向繁荣,它已经从简单的图像风格转换跃升为能读懂人心、创世般生成各类视觉作品的神奇力量。今天&…

哈夫曼树和哈夫曼编码详解(包含Java代码实现)

目录 什么是哈夫曼树?如何构造哈夫曼树?构造过程代码实现哈夫曼树的结构构建哈夫曼树并计算WPL值测试代码 什么是哈夫曼编码?如何构建哈夫曼编码?构建过程代码实现 什么是哈夫曼树? 哈夫曼树又称为最优树,是…

应用实例 | Simufact 增材制造工艺仿真助力保时捷薄壁件打印

在过去的 30 多年里,增材制造技术被广泛应用于各行各业,尤其在医疗器械、航空领域尤为突出。其中激光束进行金属粉末床熔融的工艺应用最为广泛,由该工艺制造的零部件普遍兼具高设计自由度、高灵活性、优异机械性能等特点。对于汽车行业&#…

百日筑基第六十天-学习一下Tomcat

百日筑基第六十天-学习一下Tomcat 一、Tomcat 顶层架构 Tomcat 中最顶层的容器是 Server,代表着整个服务器,从上图中可以看出,一个 Server可以包含至少一个 Service,用于具体提供服务。Service 主要包含两个部分:Conn…

都说25张宇是大趋势,那660、880还刷吗?

25上半年张宇很火,是有客观原因的: 1. 大纲改革后,大题变少了,选填变多了; 2. 但是考试覆盖的知识点不能少, ——因为知识点越少,随机性越高,这个考试就越不公平。 这直接导致了&…

vue组件和插件使用

前端组件 1、安装pinia(Vue 的专属状态管理库): npm install pinia2、安装pinia-plugin-persistedstate(持久存储插件): npm install pinia-plugin-persistedstate浏览器刷新时,有些数据希望是保存下来的。如用户登录后,用户信息会存储在全…

Scheme5.0标准之重要特性及用法实例(三十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…

设置虚拟机使用主机以太网而不是WiF连接

虚拟机使用主机的以太网连接而不是Wi-Fi连接,可以通过在虚拟化软件中配置虚拟机的网络设置来实现。以下是一些常见的虚拟化软件(如VMware和VirtualBox)中设置虚拟机网络以使用以太网连接的步骤: 一、VMware中设置 1、打开虚拟网…

Python画笔案例-007 绘制水滴

1、绘制水滴 通过 python 的turtle 库绘制一个水滴的图案,如下图: 2、实现代码 今天绘制的水滴,在tuitle 库里并没有直接的功能可以绘制,我们仔细观察,可以看出,水滴往下越来越粗,所以我们可以…

API商品数据接口(电商数据api)——京东淘宝价格详情

众多品牌选择使用比价工具进行采购,主要是出于以下几个重要原因: 提高开发效率:API接口允许不同的应用程序之间高效地进行交互,节省了大量的人力物力成本,使得开发者可以将更多时间和精力集中于自身的核心业务。 增加数…

正则表达式匹配成对括号

匹配一对括号,用于在一个html文本中提取JSon 文本。例如 { “duration”:7599,"minBufferTime{second bracket }{third bracket} } 一对加粗的{} ,而不要中间的{}。简单写法会出现错误匹配。 在.Net Framework的正则表达式中,提供了”…

在Activity中使用Toast

在Activity中使用Toast Toast是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间,我们现在就尝试一下如何在活动中使用Toast。 …

谷粒商城篇章11--P311-P325--秒杀服务【分布式高级篇八】

目录 1 后台添加秒杀商品 1.1 配置优惠券服务网关 1.2 添加秒杀场次 1.3 上架秒杀商品 2 定时任务 2.1 cron 表达式 2.2 cron表达式特殊字符 2.3 cron示例 3 秒杀服务 3.1 创建秒杀服务模块 3.1.1 pom.xml 3.1.2 application.yml配置 3.1.3 bootstrap.yml配置 3.…

【赵渝强老师】Docker三剑客

在Docker容器中提供了三个非常有用的工具,它们分别是:Docker Compose、Docker Machine和Docker Swarm。下面分别进行介绍。 视频讲解如下: Docker三剑客 【赵渝强老师】Docker的三剑客 一、容器编排工具Docker Compose 在使用Docker部署应用…

如何在 Nuxt 中动态设置页面布局

title: 如何在 Nuxt 中动态设置页面布局 date: 2024/8/24 updated: 2024/8/24 author: cmdragon excerpt: 摘要:本文介绍如何在Nuxt框架中通过设置setPageLayout函数动态调整页面布局,包括安装Nuxt、创建不同布局文件及中间件,并通过示例演示如何根据不同路径设置相应布局…

Transformer模型-1-概述、核心部件及应用场景

Transformer概述 什么是Transformer Transformer模型是由谷歌公司提出的一种基于自注意力机制的神经网络模型,用于处理序列数据。相比于传统的循环神经网络模型,Transformer模型具有更好的并行性能和更短的训练时间,因此在自然语言处理领域…

设计模式—工厂模式

文章目录 工厂模式1、没有使用工厂2、简单工厂模式3、工厂方法模式4、抽象工厂模式5、工厂模式小结 工厂模式 1、没有使用工厂 需求 看一个披萨的项目:要便于披萨种类的扩展,要便于维护 披萨的种类很多(比如 GreekPizz、CheesePizz 等)披萨的制作有 pr…

谷粒商城实战笔记-252~254-商城业务-消息队列-Exchange-三种type的使用

文章目录 一,252-商城业务-消息队列-Direct-Exchange1,创建4个队列2,exchange绑定queue3,发送消息 二,253-商城业务-消息队列-Fanout-Exchange1,创建一个type为fanout的exchange2,给这个exchang…

通过C# 读取PDF页面大小、方向、旋转角度

在处理PDF文件时,了解页面的大小、方向和旋转角度等信息对于PDF的显示、打印和布局设计至关重要。本文将介绍如何使用免费.NET 库通过C#来读取PDF页面的这些属性。 文章目录 C# 读取PDF页面大小(宽度、高度)C# 判断PDF页面方向C# 检测PDF页面…

VMWare中添加Ubuntu20.04.06镜像

一、下载Ubuntu镜像 Ubuntu20.04: 官方下载地址https://releases.ubuntu.com/20.04.6/ 进入官网 点击下图红框位置,下载镜像镜像名为ubuntu-20.04.6-desktop-amd64.iso 也可点击下面链接直接下载:https://releases.ubuntu.com/20.04.6/ubu…