Microservices 使用动态分区跨microservice实例拆分工作
我在DB中有一个“要发送的消息”表。相同目的地的消息顺序很重要 例如:Microservices 使用动态分区跨microservice实例拆分工作,microservices,partitioning,worker,Microservices,Partitioning,Worker,我在DB中有一个“要发送的消息”表。相同目的地的消息顺序很重要 例如: create table outbox ( id int serial, destination varchar payload varchar ) 目前我有一个线程,它通过id从发件箱订单中选择*,因为id是已订购的,所以我可以根据目的地将其分组并发送 现在我想让它成为一个独立的微服务,但如果我必须扩展它,我不确定如何处理它。这将扩展到DB可以扩展的范围(因为您将同步的负担放在DB上) 请注意,您
create table outbox (
id int serial,
destination varchar
payload varchar
)
目前我有一个线程,它通过id从发件箱订单中选择*,因为id是已订购的,所以我可以根据目的地将其分组并发送
现在我想让它成为一个独立的微服务,但如果我必须扩展它,我不确定如何处理它。这将扩展到DB可以扩展的范围(因为您将同步的负担放在DB上) 请注意,您的ID是全局同步的,而您实际上只需要对每个目的地进行同步。通过按目的地对发件箱表进行分片,您可以走得更远:创建
N
发件箱表,并一致地将给定的目的地映射到给定的发件箱表。您可以根据需要增加发件箱表的数量,只要这样做不会导致现有目标使用的发件箱表发生变化(这可以通过表跟踪给定目标要使用的发件箱表来实现:可以通过发件箱表的哈希模数将条目添加到该表中)。在极限情况下,当您将其向外扩展时,每个目的地可能会有一个发件箱表
上述内容在任何情况下都是可以实现的
这就是说,消息发送的重要顺序要求与actor计算模型惊人地相似(例如,大多数(如果不是全部的话)actor实现提供了一种保证,即如果actor a向actor B发送消息X、Y、Z,actor B将按照发送的顺序接收这些消息)。许多参与者模型框架(例如JVM上的Akka、Akka.Net、Orleans、Lagom、Cloudstate、Ray(?)支持跨集群切分参与者并使用事件源持久性的概念,这将管理我上面为您概述的许多方面。因此,值得研究这种方法,而不是自己尝试实现所有这些