当前位置:   article > 正文

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

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

简介:

欢迎来到小李哥全新亚马逊云科技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"创建该队列。

  1. ,{
  2. "Effect":"Allow",
  3. "Principal": {
  4. "Service": "sns.amazonaws.com"
  5. },
  6. "Action":"sqs:SendMessage",
  7. "Resource":"SQS_QUEUE_ARN",
  8. "Condition":{
  9. "ArnEquals":{
  10. "aws:SourceArn":"SNS_TOPIC_ARN"
  11. }
  12. }
  13. }

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

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

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

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

  1. import boto3
  2. import json
  3. # 配置 AWS 认证
  4. # 注意:你可以通过AWS CLI配置文件或者环境变量来设置你的凭证
  5. sns = boto3.client('sns', region_name='us-east-1')
  6. # 替换为你的SNS话题ARN
  7. topic_arn = 'arn:aws:sns:us-east-1:123456789012:my-topic'
  8. # 发送消息到SNS话题
  9. def publish_message():
  10. message = {
  11. 'order_id': '123456',
  12. 'status': 'created',
  13. 'customer_id': '78910'
  14. }
  15. response = sns.publish(
  16. TopicArn=topic_arn,
  17. Message=json.dumps(message),
  18. Subject='Order Created',
  19. MessageAttributes={
  20. 'AttributeOne': {
  21. 'StringValue': 'Value1',
  22. 'DataType': 'String'
  23. }
  24. }
  25. )
  26. print(f"Message sent with ID: {response['MessageId']}")
  27. if __name__ == '__main__':
  28. publish_message()

 

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

  1. import boto3
  2. # 配置 AWS 区域
  3. region_name = 'us-east-1'
  4. # 创建 SNS 客户端
  5. sns = boto3.client('sns', region_name=region_name)
  6. # 创建 SQS 客户端
  7. sqs = boto3.client('sqs', region_name=region_name)
  8. # 创建 SNS 主题
  9. def create_sns_topic(topic_name):
  10. response = sns.create_topic(Name=topic_name)
  11. topic_arn = response['TopicArn']
  12. print(f"Created SNS topic with ARN: {topic_arn}")
  13. return topic_arn
  14. # 创建 SQS 队列
  15. def create_sqs_queue(queue_name):
  16. response = sqs.create_queue(QueueName=queue_name)
  17. queue_url = response['QueueUrl']
  18. print(f"Created SQS queue with URL: {queue_url}")
  19. return queue_url
  20. # 获取 SQS 队列的 ARN
  21. def get_sqs_queue_arn(queue_url):
  22. response = sqs.get_queue_attributes(
  23. QueueUrl=queue_url,
  24. AttributeNames=['QueueArn']
  25. )
  26. return response['Attributes']['QueueArn']
  27. # 订阅 SQS 到 SNS 主题
  28. def subscribe_sqs_to_sns(topic_arn, queue_arn):
  29. response = sns.subscribe(
  30. TopicArn=topic_arn,
  31. Protocol='sqs',
  32. Endpoint=queue_arn
  33. )
  34. subscription_arn = response['SubscriptionArn']
  35. print(f"Subscribed SQS to SNS with Subscription ARN: {subscription_arn}")
  36. return subscription_arn
  37. # 设置 SQS 队列策略,允许SNS发送消息到SQS队列
  38. def set_sqs_policy(queue_url, queue_arn, topic_arn):
  39. policy = {
  40. "Version": "2012-10-17",
  41. "Statement": [
  42. {
  43. "Effect": "Allow",
  44. "Principal": {"Service": "sns.amazonaws.com"},
  45. "Action": "SQS:SendMessage",
  46. "Resource": queue_arn,
  47. "Condition": {
  48. "ArnEquals": {"aws:SourceArn": topic_arn}
  49. }
  50. }
  51. ]
  52. }
  53. sqs.set_queue_attributes(
  54. QueueUrl=queue_url,
  55. Attributes={
  56. 'Policy': json.dumps(policy)
  57. }
  58. )
  59. print("SQS policy set to allow SNS topic to send messages.")
  60. if __name__ == '__main__':
  61. # 定义 SNS 主题和 SQS 队列的名称
  62. topic_name = 'my-sns-topic'
  63. queue_name = 'my-sqs-queue'
  64. # 创建 SNS 主题
  65. topic_arn = create_sns_topic(topic_name)
  66. # 创建 SQS 队列
  67. queue_url = create_sqs_queue(queue_name)
  68. # 获取 SQS 队列的 ARN
  69. queue_arn = get_sqs_queue_arn(queue_url)
  70. # 设置 SQS 队列策略,允许SNS发送消息到SQS
  71. set_sqs_policy(queue_url, queue_arn, topic_arn)
  72. # 订阅 SQS 队列到 SNS 主题
  73. subscribe_sqs_to_sns(topic_arn, queue_arn)
  74. 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云开发/云架构方案!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/1021426
推荐阅读
相关标签
  

闽ICP备14008679号