Java 如何添加EC2节点并让它们开始从共享工作池中拾取?

Java 如何添加EC2节点并让它们开始从共享工作池中拾取?,java,amazon-ec2,distributed-computing,Java,Amazon Ec2,Distributed Computing,我是AWS新手,但这是我们使用的堆栈,所以这需要在AWS上工作 在AWS工具集中,我看不到任何东西可以帮助我启动另一个EC2节点,然后自动处理一系列任务分配给新节点的情况 因此,作为一个例子,我可能有一堆创建斐波那契数的请求。最初,单个EC2节点上的单个JVM可能会启动,窃取一批要处理的数字,然后进行处理 随着负载的增加,第二个节点可能会启动,其JVM会窃取下一批要处理的数据 注:理想情况下,单个数字不得处理多次。奇怪的重复并不重要,但我们需要避免在要完成的整批工作上发生冲突 我可以将任务存储在

我是AWS新手,但这是我们使用的堆栈,所以这需要在AWS上工作

在AWS工具集中,我看不到任何东西可以帮助我启动另一个EC2节点,然后自动处理一系列任务分配给新节点的情况

因此,作为一个例子,我可能有一堆创建斐波那契数的请求。最初,单个EC2节点上的单个JVM可能会启动,窃取一批要处理的数字,然后进行处理

随着负载的增加,第二个节点可能会启动,其JVM会窃取下一批要处理的数据

注:理想情况下,单个数字不得处理多次。奇怪的重复并不重要,但我们需要避免在要完成的整批工作上发生冲突

我可以将任务存储在RDS中,也可以存储在DynamoDB中。然后,我必须将条目标记为由特定EC2节点保留以进行处理,并在完成后将其清除。更糟糕的是,如果EC2节点发生故障并留下一些标记以供处理,我必须有某种恢复逻辑

我可以使用一些非AWS-y的东西,比如Redis,通过JVM在内存中分发数据。我仍然需要在某个时刻保留条目,因为它们需要持久,但这可能会更有效


我想这一定是一个非常普遍的要求:拥有共享状态并在不断变化的节点数上处理它,必须已经有了解决方案。

要完成的任务应该发布到SQS队列中。然后,对每个实例执行工作的应用程序将从队列中使用。如果启动一个新的EC2实例,它将从队列中开始使用。任务成功完成后,应用程序可以将其从队列中删除。如果任务未成功完成(实例被终止或应用程序意外死亡),任务将保留在队列中,等待下一个使用应用程序

请注意,SQS保证消息将“至少传递一次”(),因此您的应用程序应该能够适当地处理重复的任务


此外,您可以根据SQS队列的大小设置自动缩放策略,以便在高峰负载时间使用所有任务。

请参阅:我看不到任何解决共享状态或池中工作分配的内容。假设ASG中的所有节点都配置了相同的AMI,您可以根据CPU使用情况或couldwatch上可用的其他指标创建自动缩放规则,这样,当ASG过载时,AWS将自动启动新实例。如果您没有将实例逻辑烘焙到AMI中,也就是说,如果您正在添加的任何新实例需要手动安装和配置,那么AFAIK不可能在没有手动干预的情况下自动缩放。这不是缩放AWS实例,而是缩放在这些实例上运行的应用程序。当一个新实例启动时,在其上运行的应用程序需要保留大量的工作要做。当它消亡时,其他应用程序节点需要意识到工作现在是自由的。您正在运行自己的逻辑,AWS服务对您的逻辑没有上下文/洞察力-这些是您需要自己实现的事情。也就是说,有一些开源项目可以完全满足您的需求。举个例子,这很有趣——这可能适用于斐波那契的例子。不过,我还有一个额外的复杂问题:工作是基于时间的,即在时间1,执行任务集A,然后在时间2,执行任务集B。事实上,在我的情况下,任务是将消息发送到消息队列。。。但仅在调用方设置的时间间隔内。有点像闹钟。如果你有两组任务(A和B),你可以使用两个SQS队列。然后,您的应用程序可以在设置的时间段内使用相应队列中的数据。(您可以使用第三个SQS队列作为消息目标队列。)