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

devtools/2024/11/13 15:28:35/

简介:

欢迎来到小李哥全新亚马逊云科技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 队列的 ARNqueue_arn = get_sqs_queue_arn(queue_url)# 设置 SQS 队列策略,允许SNS发送消息到SQSset_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.ppmy.cn/devtools/100767.html

相关文章

软件运维实施维保方案(Doc完整版原件)

1.项目情况 2.服务简述 2.1服务内容 2.2服务方式 2.3服务要求 2.4服务流程 2.5工作流程 2.6业务关系 2.7培训 3.资源提供 3.1项目组成员 3.2服务保障 软件全套资料部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表,产…

大数据技术之Flume 企业开发案例——负载均衡和故障转移(6)

目录 负载均衡和故障转移 1)案例需求 2)需求分析 3)实现步骤 负载均衡和故障转移 1)案例需求 使用 Flume1 监控一个端口,其 sink 组中的 sink 分别对接 Flume2 和 Flume3,采用 FailoverSinkProcessor…

Linux--汇编语法配置初始化的原理

------改编自正点原子Linux开发手册 我们在学习 STM32 的时候几乎没有用到过汇编,可能在学习 UCOS 、 FreeRTOS 等 RTOS 类操作系统移植的时候可能会接触到一点汇编。但是我们在进行嵌入式 Linux 开发的时候是绝 对要掌握基本的 ARM 汇编,因为…

前端常见问题

一、<!DOCTYPE html>作用 <!DOCTYPE>是html文档的第一行&#xff0c;用于声明文档的类型&#xff0c;它会告诉浏览器要用哪一种HTML规范来渲染文档&#xff0c;确保正确渲染页面。 二、src与 href 的区别 &#xff08;一&#xff09;、请求资源类型的不同 在请…

4820道西医综合真题西医真题ACCESS\EXCEL数据库

本题库内容源自某出版物《西医综合真题考点还原与答案解析》&#xff0c;包含4千多道真题。这个数据库包含3个表&#xff0c;一个是分类表&#xff08;SECTION_BEAN&#xff09;&#xff0c;一个是题库主表&#xff08;QUESTION_INFO_BEAN&#xff09;&#xff0c;一个是选项表…

java一键生成数据库说明文档html格式

要验收项目了&#xff0c;要写数据库文档&#xff0c;一大堆表太费劲了&#xff0c;直接生成一个吧&#xff0c;本来想用个别人的轮子&#xff0c;网上看了几个&#xff0c;感觉效果不怎么好&#xff0c;自己动手写一个吧。抽空再把字典表补充进去就OK了 先看效果&#xff1a; …

【R语言实战】——多模型预测及评价

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

Android笔试面试题AI答之Kotlin补充考点

博客中虽然包含了大量关于Kotlin的面试题&#xff0c;但并未涵盖Kotlin所有可能的面试考点。以下是一些博客中未明确提到的面试考点&#xff1a; Kotlin与Java的互操作性&#xff1a; Kotlin如何与Java代码互操作&#xff1f;Kotlin如何调用Java方法&#xff0c;以及Java如何调…