Java AWS上的体系结构:在动态节点上运行分布式算法

Java AWS上的体系结构:在动态节点上运行分布式算法,java,spring,amazon-web-services,amazon-ec2,amazon-elastic-beanstalk,Java,Spring,Amazon Web Services,Amazon Ec2,Amazon Elastic Beanstalk,如图所示,我正在处理的pet项目有以下两个组件 a) “RestAPI层”(微服务集) b) “可伸缩并行算法”组件 我计划在AWS上运行它。我意识到我可以使用ElasticBeanTalk来部署我的RestAPI模块 我正在考虑如何构建“可伸缩并行化算法”组件。以下是一些设计细节: 这包括两个节点,它们共享存储在上的相同数据 S3 每个节点对S3数据块执行“算法”。一个节点作为主节点,其余节点将部分结果发送给 这个节点。(令人尴尬的并行,主从模式)。主节点 由RestAPI层调用 “节点”是

如图所示,我正在处理的pet项目有以下两个组件

a) “RestAPI层”(微服务集)

b) “可伸缩并行算法”组件

我计划在AWS上运行它。我意识到我可以使用ElasticBeanTalk来部署我的RestAPI模块

我正在考虑如何构建“可伸缩并行化算法”组件。以下是一些设计细节:

  • 这包括两个节点,它们共享存储在上的相同数据 S3
  • 每个节点对S3数据块执行“算法”。一个节点作为主节点,其余节点将部分结果发送给 这个节点。(令人尴尬的并行,主从模式)。主节点 由RestAPI层调用
  • “节点”是一个Spring引导应用程序,它通过HTTP与其他节点通信
  • “节点”的数量是动态的,这意味着我应该能够根据S3不断增加的数据大小手动添加一个新节点
  • Redis上有一个“节点注册表”,其中包含所有节点的IP。每个节点注册自己,并使用 注册表以相互通信
我的问题是:

1) 我应该使用EC2来部署“节点”还是可以使用ElasticBeanStalk来部署这些节点。我知道使用EC2我可以根据S3数据的大小来管理节点的数量,但是使用ElasticBeanStalk是否可以做到这一点

2) 我能用吗

Inet4Address.getLocalHost().getHostAddress() 
要获取每个节点的IP地址?EC2实例是否有多个IP?该IP应允许RestAPI层与“主”节点通信

3) 我应该使用什么组件将RestAPI层暴露给外部世界?但我不想暴露我的“节点”

更新: 我无法使用MapReduce,因为节点具有状态。也就是说,在初始化过程中,每个节点从S3读取其数据块,并在内存中创建“向量空间”。这是一个耗时的过程,因此应将其存储在内存中。此外,该系统需要近实时响应,不能使用“批处理”像MR.这样的系统。

1)我将研究CloudFormation,以帮助您自动化和协调可伸缩的并行化算法。阅读此常见问题解答

2) 关于问题2,EC2实例可以有私有和公共ip,具体取决于您如何配置它们。您可以从实例中查询AWS EC2元数据服务,以获得如下信息: 或

EC2实例元数据的完整引用:

3) 查看API网关服务,它可能是您正在寻找的:
一些一般原则

  • 使用基础设施自动化:云形成或云形成上的对流层。这将使您的系统干净且易于维护
  • 使用标签:这可以让你的AWS帐户保持整洁。此外,您还可以编写一些时髦的脚本,如基于标记描述所有实例,这可以是一个一行CLI/SDK调用,返回“从属”实例的所有IP
  • 使用更多的标签,它会非常强大
ElasticBeanstalk VS“手动”设置

ElasticBeanstalk对我来说是个不错的选择,但重要的是要看到,它使用的组件与我推荐的相同:

  • 创建一个包含准备就绪的从属实例的AMI,或
  • 创建一个AMI并使用UserData配置您的从属设备,或
  • 创建AMI和/或使用编排工具(如Chef或Puppet)来配置从属实例
  • 在自动缩放启动配置中使用此AMI
  • 创建一个AutoScalingGroup,它可以是固定数量的实例,也可以基于度量进行缩放
  • 专业设置:如果您可以以某种方式计算等待执行的作业,则这可以是自动放大或缩小的度量标准
  • Pro+提示:使用主节点创建作业,将作业放入SQS队列。队列的长度是一个很好的伸缩指标。失败的作业将返回队列,并将重新执行。(SQS消息仅包含引用,而不包含作业的完整数据。)
  • 使用队列将使您的环境解耦,这是强烈建议的
要明确的是,ElasticBeanstalk也做了类似的事情。实际上,如果创建多节点Beanstalk堆栈,它将运行CloudFromation模板,创建ELB、ASG、LCFG和实例。你只需要少一点控制,也少一点管理开销

如果您使用Beanstalk,您需要它,它也会为您创建SQS队列。如果您选择Worker环境,您可以找到教程和工作示例,这会使您的起步更容易

进一步内容如下:

2) 您可以使用CLI,它具有一些过滤功能,也可以使用其他命令(如jq)对输出进行过滤/格式化。 这里有一个类似的例子。 注意:使用标记,然后您可以轻松地筛选实例。也可以基于ELB/ASG进行查询


3) 通过API网关公开API听起来是一个很好的解决方案。我假设您只想公开主节点,因为这就是管理任务的原因。

听起来您正计划执行群集管理并自己实现map/reduce。您是否考虑过使用Hadoop(通过EMR)?也许在Elastic BeanStalk中构建一个简单的web前端,启动EMR集群来完成实际工作。
curl http://169.254.169.254/latest/meta-data/public-ipv4
curl http://169.254.169.254/latest/meta-data/local-ipv4