【问题标题】:Lagom: is it possible to split service instances across multiple clusters?Lagom:是否可以跨多个集群拆分服务实例?
【发布时间】:2019-06-03 09:46:02
【问题描述】:

假设我有Hello-Service。在 Lagom 中,此服务可以跨单个集群的多个节点运行。

所以在集群 1 中,我们可以有多个“副本”Hello-Service

Cluster1: Hello-Service-1, Hello-Service-2, Hello-Service-3

但是是否可以跨多个集群运行服务Hello-Service

像这样:

Cluster1: Hello-Service-1, Hello-Service-2, Hello-Service-3,
Cluster2: Hello-Service-4, Hello-Service-5, Hello-Service-6

我想要实现的是读取端处理器和事件消费者的更好可扩展性:

在 Lagom 中,我们需要预先设置集群内给定事件标签的分片数。

所以我想知道是否可以添加另一个集群来在它们之间分配负载。

当然,我想通过某个键对持久实体进行分片。

(假设我正在构建一个多租户应用程序,我将按组织 ID 对实体进行分片,因此某些组织集合的所有实体将进入集群 1,而另一组组织的实体将进入集群2,因此我可以在每个集群中使用分片读取端处理器,这些处理器仅处理集群中的事件/实体的子集(以获得更好的可扩展性)。

使用单集群方法,随着系统的增长,单个集群中的分片处理器可能会变得越来越慢,因为它需要处理越来越多的事件。

所以随着系统的增长,我只需添加一个新集群(假设是集群 2,然后是集群 3,它们将处理自己的事件/实体子集)

【问题讨论】:

    标签: scala event-sourcing akka-cluster lagom


    【解决方案1】:

    如果您使用分片读取端,Lagom 会将分片的处理分布在集群中的所有节点上。因此,如果您在 1 个集群中有 10 个分片和 6 个节点,那么每个节点将处理 1-2 个分片。如果您尝试部署两个集群,每个集群 3 个节点,那么最终每个节点将处理 3-4 个分片,但每个事件将被处理两次,每个集群一次。这无助于可扩展性,它的工作量是需要完成的两倍。所以我不明白你为什么想要两个集群,只有一个集群,Lagom 会在其中均匀分布分片。

    如果您不使用分片读取端,那么无论集群中有多少节点,所有事件都将由一个节点处理。如果你部署第二个集群,它不会分担负载,它也会处理相同的事件,所以你会得到每个集群对每个事件的双重处理,这不是你想要的。

    所以,只需使用分片读取端,让 Lagom 为您在单个集群中分配工作,这就是它的设计目的。

    【讨论】:

    • 我想要实现的是 2 个集群处理它们自己的事件子集(没有相同的事件处理两次)。 Cluster1 的组织事件从 1 到 1000,在 Cluster2-组织的事件从 1001 到 2000。Cluster1 将有 numShards=20 的分片读取端处理器,它只处理来自 Cluster1 的事件,而 Cluster2 将有自己的分片读取端仅处理来自 Cluster2 的事件的处理器。因此我可以实现更好的可扩展性,因为对于单个集群,随着系统的增长,单个集群中的分片处理器可能会变得越来越慢。
    • 所以随着系统的增长,我只需要添加一个新的集群(比如说,Cluster3 包含从 org2001 到 org3000 的组织事件)
    • 您可以通过将组织的每个“分片”的读取端处理器配置为仅在单个角色上运行来实现您所说的集群角色 (doc.akka.io/docs/akka/current/cluster-usage.html#node-roles)。我认为可以使用 Lagom 来实现,但直接使用 Akka 持久性可能会更容易。
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2012-09-15
    • 2019-06-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多