【问题标题】:AWS ECS Spring boot share List<String> between microservice instances微服务实例之间的 AWS ECS Spring boot 共享 List<String>
【发布时间】:2021-07-04 08:59:18
【问题描述】:

我有两个 Spring Boot 微服务(微服务 A)实例和一个负载均衡器。 Spring boot 应用程序在 AWS Fargate 中运行,具有 2 个所需任务(微服务 A 的 2 个实例)。

如果我请求微服务 A,负载均衡器会在第一次请求时将我引导至微服务 A 实例 1。 下一个请求将负载均衡到微服务 A 实例 2。这会在以后的每个请求中交替进行。

在微服务 A 上,我有一个具有 List&lt;String&gt; 属性的 Spring Service。在每次请求时,我都会在此列表中添加一些内容。 该列表保存在内存中,我不想将此列表放入数据库中。 在我的情况下,每个进一步的请求都会交替填充微服务 A 实例 1 和微服务 A 实例 2 的列表。但是我想在以后的每个请求中只填写一个 List,这样我的 List 输入就不会分布在我的微服务实例中。

所以我的问题是:

有没有办法在这两个微服务实例之间共享一个 List?

我是否必须在他们之间建立某种沟通,或者是否有更好的解决方案?还是我必须配置我的负载均衡器? 一个解决方案是将其存储在数据库中。但这会产生很多数据库调用,我想防止这种情况发生,因为代码的目的是防止数据库调用。

【问题讨论】:

    标签: amazon-web-services spring-boot amazon-ecs aws-fargate


    【解决方案1】:

    为了您的目标,使用外部服务 (Redis | DynamoDB | ....) 是一种常见模式。如果您不想使用数据库(或无论如何进行 API 调用),我能想到的另一件事是使用共享文件系统 (EFS) 来保持这种状态。 See here for more info,尤其是博客末尾的用例。与其将列表存储在内存中,不如将其刷新到文件系统(恰好在任务之间共享)。同一服务中的不同任务之间没有其他方式进行通信。我不知道您的确切要求(并发性、延迟等),但使用 DynamoDB 似乎是最好的方法。非常低的延迟,“管理数据库”的 0 负担。

    【讨论】:

      【解决方案2】:

      我一般喜欢@mreferre 的方法。

      您可以查看 AWS 粘性会话https://docs.aws.amazon.com/elasticloadbalancing/latest/application/sticky-sessions.html

      但是警告:如果用户的粘性目标正在下降,您需要确保不会不断地将用户发送到现在下降的目标。 您需要仔细考虑粘性会话是否与您的用例匹配。 也许您可以使用持续时间较短的 cookie 来最大限度地减少不良粘性连接的持续时间。

      【讨论】:

        猜你喜欢
        • 2017-09-26
        • 2020-02-06
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        • 2017-05-27
        • 2016-07-30
        • 2016-11-05
        • 1970-01-01
        相关资源
        最近更新 更多