Java 理解Akka簇切分

Java 理解Akka簇切分,java,scala,akka,sharding,akka-cluster,Java,Scala,Akka,Sharding,Akka Cluster,我正在学习Akka切分模块。 关于切分,我有点不明白。 让我们假设您想要切分一个参与者:来自同一参与者的多个实体分布在多个节点上。 每个实体都可以有自己的状态,这可能与另一个实体不同 客户端发出请求,向您的shard actor发送消息以获取其状态值。这是一个实体将要处理的消息,并作为结果返回其值。但如果它被另一个实体处理,结果就会不同。 但是它应该是相同的,因为所有的实体都来自同一个参与者,不是吗?但是[消息响应]应该是相同的,因为所有的实体都来自同一个参与者,不是吗 不,每个演员都有自己的状

我正在学习Akka切分模块。 关于切分,我有点不明白。 让我们假设您想要切分一个参与者:来自同一参与者的多个实体分布在多个节点上。 每个实体都可以有自己的状态,这可能与另一个实体不同

客户端发出请求,向您的shard actor发送消息以获取其状态值。这是一个实体将要处理的消息,并作为结果返回其值。但如果它被另一个实体处理,结果就会不同。 但是它应该是相同的,因为所有的实体都来自同一个参与者,不是吗?

但是[消息响应]应该是相同的,因为所有的实体都来自同一个参与者,不是吗

不,每个演员都有自己的状态,代表着不同的东西。如果您有一个Customer类,您就不会期望每个Customer对象都有相同的数据。每个客户对象都有自己的名称、id等

演员也是如此。参与者有自己的状态并代表某种域实体。如果您向参与者发送一条GetCustomerName消息,您会期望每个参与者给您一个不同的名称

这对于集群分片尤其如此。集群分片的要点是,您可以通过单个节点进行扩展:可伸缩性、弹性或弹性。但他们仍然是演员,每个人都有自己的国家。发送一个GetCustomerName将会并且应该给您一个来自不同参与者的不同响应。切分只是让您能够在多台机器上分发这些参与者,并且参与者的位置对发送者是透明的。

但是[消息响应]应该是相同的,因为所有实体都来自同一个参与者,不是吗

不,每个演员都有自己的状态,代表着不同的东西。如果您有一个Customer类,您就不会期望每个Customer对象都有相同的数据。每个客户对象都有自己的名称、id等

演员也是如此。参与者有自己的状态并代表某种域实体。如果您向参与者发送一条GetCustomerName消息,您会期望每个参与者给您一个不同的名称


这对于集群分片尤其如此。集群分片的要点是,您可以通过单个节点进行扩展:可伸缩性、弹性或弹性。但他们仍然是演员,每个人都有自己的国家。发送一个GetCustomerName将会并且应该给您一个来自不同参与者的不同响应。切分只是让您能够在多台机器上分发这些参与者,并让参与者的位置对发送者透明。

您似乎误解了Akka集群切分的概念,让我用一个例子来解释

假设您的服务负责使用用户配置文件响应请求。为了获得极低的延迟,您决定使用Akka actors在内存中缓存用户配置文件,而不必为每个请求查询DB

如果您的网站只有10个用户,并且每个用户配置文件只有几KB,那么您可以在一个参与者中保存所有10个用户配置文件,而不会出现问题,而且您肯定不需要集群分片。但是,如果您有1000万用户,那么1000万用户配置文件可能无法放入单个参与者的内存中,而且如果参与者宕机,成本也会很高,因为这意味着您需要一个大型数据库查询来从持久性中获取这些数据

在这种情况下,集群分片是一种合适的选择。您将拥有1000万名Akka参与者,分布在您的集群中,每个参与者只存储一个用户配置文件。因此GetUserProfileuserProfileId=123不会给出不同的响应——它将始终路由到为用户123保存用户配置文件的参与者,因此响应将始终相同


路由是如何工作的?检查

中的extractShardId和extractEntityId。似乎您误解了Akka群集分片的概念,让我用一个示例来解释

假设您的服务负责使用用户配置文件响应请求。为了获得极低的延迟,您决定使用Akka actors在内存中缓存用户配置文件,而不必为每个请求查询DB

如果您的网站只有10个用户,并且每个用户配置文件只有几KB,那么您可以在一个参与者中保存所有10个用户配置文件,而不会出现问题,而且您肯定不需要集群分片。但是,如果您有1000万用户,那么1000万用户配置文件可能无法放入单个参与者的内存中,而且如果参与者宕机,成本也会很高,因为这意味着您需要一个大型数据库查询来从持久性中获取这些数据

在这种情况下,集群分片是一种合适的选择。您将拥有1000万名Akka参与者,分布在您的集群中,每个参与者只存储一个用户配置文件。因此getUserProfileUserId=123不会给您不同的响应——它总是会给您不同的响应 被路由到为用户123保存用户简档的参与者,因此响应将始终相同


路由是如何工作的?在Akka集群分片中的

中选中extractShardId和extractEntityId每个参与者都应该有一个唯一的名称通常是实体id并代表一个唯一的实体。当参与者启动/重新启动实体时,通常从数据库加载到参与者状态

如果参与者收到消息以更新实体,则参与者应更新数据库和参与者状态;如果参与者收到消息以读取实体,则参与者应仅从参与者状态读取实体。它保证与数据库中仅由一个参与者处理的所有更新操作相同


如果任何节点出现故障或集群扩展,则可以在另一个节点(shard region)上重新创建请求实体对应的参与者。

在Akka集群切分中,每个参与者都应该具有唯一的名称(通常是实体id)并代表唯一的实体。当参与者启动/重新启动实体时,通常从数据库加载到参与者状态

如果参与者收到消息以更新实体,则参与者应更新数据库和参与者状态;如果参与者收到消息以读取实体,则参与者应仅从参与者状态读取实体。它保证与数据库中仅由一个参与者处理的所有更新操作相同


如果任何节点出现故障或集群扩展,则可以在另一个节点(shard region)上重新创建请求实体对应的actor。

非常感谢我得到了它。非常感谢我得到了它。