amazon-web-services - 预配置 EC2 上的 AWS 系统设计
问题描述
我有一个 AWS 工作流程,如下所示:
API 调用 -> Lambda 函数(Paramiko 远程连接)-> EC2 -> 输出
基本上,我有一个 API 调用,它触发了一个 lambda 函数。在 lambda 函数中,我使用 Python Paramiko 远程连接到预配置的 EC2 实例,在 ec2 实例上运行一些命令,然后返回输出。我对这种设计有两个主要关注点:1.) 延迟和 2.) 可扩展性。
对于延迟:
当我调用 API 时,需要 8-9 秒才能运行,但如果我直接在 EC2 实例上运行作业,则需要 1-2 秒。ssh_client.connect()
和ssh_client.exec_command()
导致运行时间显着增加吗?此外,我正在 t2-micro ubuntu 18.04 免费层 EC2 实例上实现此功能。使用付费版本会导致运行时间不同吗?
对于可扩展性:
我确信 AWS 对此有解决方案,但假设有多个同时进行的 API 调用。我确信我不能只有 1 个可用的 EC2 实例来运行该作业。我是否应该预先配置多个 EC2 实例并使用负载均衡器?我可以使用哪些 AWS 功能来扩展此系统?
如果有什么不清楚的,请询问,我会详细说明。
解决方案
在 EC2 实例上运行命令的更“云友好”的方法不是使用 Paramiko,而是使用AWS Systems Manager Run Command,它使用代理在 instance 上运行命令。它甚至可以在多个实例以及安装了代理的本地计算机上运行命令。
另一种设计选择是将“作业”消息推送到 Amazon SQS 队列。工作实例可以轮询 SQS 队列请求工作。当他们收到消息时,他们可以执行工作。这更像是一个异步模型,因为主系统不会“等待”作业完成,因此它需要一个返回路径来提供结果(例如另一个 SQS 队列)。但是,它具有高度可扩展性且更具弹性,不需要负载平衡器。这是一种常见的设计模式。
推荐阅读
- javascript - 如何使用 Joi 验证电子邮件
- mysql - MariaDB服务器版本上参数错误的SQL存储过程LIKE操作
- javascript - 为什么最初没有调用我的 useEffect ?
- apache-flink - Flink 第一个窗口触发
- multithreading - 创建多个线程并调用异步方法进行测试
- java - noHandlerFound 尝试获取 url
- python - 随着时间跨度的多个工作中心的员工轮班安排
- javascript - 尝试在表上创建查找器时出错
- javascript - Nightbot 可以计算用户的特定聊天吗?
- elasticsearch - Kibana 中的通配符搜索消息字段中的字符串文本