【发布时间】:2017-08-18 02:24:43
【问题描述】:
我在 AWS Elasic Beanstalk 中运行的 spring-boot 应用程序从 Amazon S3 中的某个位置加载数据。数据每 10 分钟刷新一次,我希望 beanstalk 的所有实例都从 S3 重新加载数据。
我有一个巧妙的方法来完成这项工作。我做了以下。
1. Implemented an end point in beanstalk application which, when called, triggers the reload.
2. I have a script that determines the IP address of each beanstalk instance given the beanstalk application's `environment name`.
3. I then iterate through all these IP addresses and call the end point mentioned in point 1 above.
到目前为止,这很有效,因为实例的 IP 地址是可公开寻址的。这将不再是这种情况,因为我们只能使用私有 IP。
触发数据重新加载的正确方法是什么?我在想以下几点:
1. Set up Amazon S3 bucket to generate an event and post to a SNS topic.
2. Have an SNS client in my beanstalk application which subscribes to that topic and listens for events.
3. Upon receiving an event from that topic, trigger the data reload.
我做了(1),但不知道怎么做(2)和(3)。如何订阅 Java 代码中的主题? SNS 仅允许 3 种通知方法 - 使用 SQS(AWS 简单排队服务)、SMS 和通过 HTTP/HTTPS URL。
URL 方法不起作用,因为它只会将请求转发到负载均衡器后面的一个实例。因此,并非所有实例都会重新加载。
SQS 也不会工作,因为一旦一个实例读取了消息,该消息就会出队,而其他实例将不会收到触发消息。
电子邮件也不起作用(或者我不知道如何使它起作用)。
任何帮助/想法?非常感谢指向 Java 代码的指针。
【问题讨论】:
-
如果有一些数据需要在每个 EBS 实例上重新加载,那么为什么不将数据保留在 S3 本身上呢?
-
对不起。我没明白你的意思@KaranShah。数据已经驻留在 S3 中。它每 10 分钟更新一次。然后需要提醒 beanstalk 实例来提取刷新的数据。
-
根据您的描述,您的要求是从 s3 大约每隔 10 分钟将数据加载到您的 EB 实例,对吗?如果您能告知我们为什么计划加载数据的要求,那么为您提供答案会更容易。
-
@Ashan:beantalk 应用程序需要数据。由于应用程序可能运行多个服务器,每个服务器都需要相同的数据,因此将数据存储在所有实例加载数据的位置是有意义的。所以我将这些数据存储在 S3 中。这些数据是关于产品可用性的,它不断变化。所以每 10 分钟,我在 S3 中更新这些数据(使用后台脚本)。
标签: java amazon-s3 notifications amazon-sns amazon-elastic-beanstalk