我开始了解亚马逊网络服务,我正在尝试开发一个简单的应用程序,以开始更好地学习这些概念。
此时的应用程序体系结构包括一个客户端,它将文本文件,映射文件和reducer文件发送到s3,并向sqs发送一条消息,指示客户端要求处理该文件。然后我有一个弹性mapreduce集群,其中ec2实例启动并从sqs获取消息,从s3获取文件,处理文件,然后将结果处理文件存储在s3中。在此处理之后发送通知,使用sns向用户说明结果文件在s3中可用。
现在我想在这个应用程序中使用更多服务来拥有容错和高可用性的架构,这样我就可以更好地理解这两个概念。
但我现在的怀疑是:在这个简单的应用程序中,我可以使用哪些服务,以便应用程序可以容忍?我可以使用哪种服务,以便应用程序具有较高的可用性?
我正在阅读弹性负载平衡,有多个可用区域,如果ec2停止在特定的可用区域工作,这不是问题,因为我们有elb与其他可用区域。
但在我的应用示例中,我总是没有运行服务器/ ec2实例,它只是在客户端发送文件进行处理时才开始运行,并且此时弹性mapreduce集群启动一个ec2实例来处理文件。
所以我怀疑,如果在我的基本应用场景中我可以实现宽容和高可用性,如果是,那么这将是一个很好的方法/服务吗?
答案 0 :(得分:1)
首先,我将使用新的Lambda服务将消息放入SQS队列,因为它使您的应用程序更加健壮。如果您这样做,那么将任务上传到S3的客户端只需要能够处理S3。然后由S3触发Lambda它有新文件并将消息放入SQS。
S3,SQS是HA和容错的。使用这些服务可以使您的应用程序健壮(但您需要注意所有组件)。
由于您的作业在SQS中完成,直到作业完成,如果作业执行失败,在一个时间限制后,作业再次激活,另一个执行者将开始处理它。这使您的EMR作业也具有容错能力。
如果整个可用区出现问题,整个EMR堆栈将会关闭。经过一段时间后,你失败的工作将在线上获得批准。因此,如果您通过相同的SQS在2个单独的AZ馈送中有2个集群,则可以容忍整个AZ故障。 EMR and AZ-s
如果您需要更高的稳健性,例如处理Region问题,您也可以这样做,但这样做要复杂得多。