微服务实例之间的 AWS ECS Spring 引导共享列表<String>

AWS ECS Spring boot share List<String> between microservice instances

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

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

在微服务 A 上,我有一个具有 List<String> 属性的 Spring 服务。根据每个请求,我都会在此列表中添加一些内容。 该列表保存在内存中,我不想将此列表放入数据库中。 在我的例子中,每个进一步的请求都会交替填充微服务 A 实例 1 和微服务 A 实例 2 的列表。但是我只想为每个未来的请求填充一个列表,这样我的列表输入就不会分布在我的微服务实例中。

所以我的问题是:

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

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

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

我通常喜欢@mreferre 的方法。

您可以查看 AWS Sticky Sessionshttps://docs.aws.amazon.com/elasticloadbalancing/latest/application/sticky-sessions.html

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