如何扩展聚合?
系统中的每个信息都有一个单一的逻辑权限。对于一个数据的多个权限会导致争用。通过创建更小的、不重叠的边界来扩展写入——每个权限都有更小的责任区域,从而扩展写入。
To borrow from your example, an example of smaller responsibilities would
be to shift from one aggregate for all ORDERS to one aggregate for _each_
ORDER.
It's analogous to the difference between having a key value store with
all ORDERS stored in a document under one key, vs each ORDER being stored
using its own key.
读取是安全的,您可以使用多个副本进行扩展。但是这些副本只是最终一致性的。这意味着如果您问“FCOJ的出价价格现在是多少?” 您可能会从每个副本获得不同的答案。或者,如果您问“FCOJ在10:09:02的出价价格是多少?” 那么每个副本将给您一个单一的答案或说“我还不知道”。
但是,如果粒度已经是每个聚合物一个命令,那在我看来并不常见,并且您确实有很多并发访问,该如何解决?如何尽可能地分散负载并保持无冲突状态?
大致草图-每个聚合物都通过可以从命令消息的内容计算出的密钥进行存储。使用该密钥执行比较和交换操作以实现对聚合物的更新。
Acquire a message
Compute the storage key
Load a versioned representation from storage
Compute a new versioned representation
Store.compare and swap the new representation for the old
为了提供额外的流量吞吐量,您可以添加更多无状态计算。
为了提供存储吞吐量,您可以将密钥分布在更多的存储设备上。
路由层可用于将消息分组 - 路由器使用与之前相同的存储密钥计算,但使用它来选择将消息转发到计算农场中的哪个位置。然后,计算可以检查它接收到的每批消息中是否有重复的密钥,并一起处理这些消息(交换一些额外的计算以减少比较和交换的数量)。
合理的消息协议非常重要;请参阅Marc de Graauw的
Nobody Needs Reliable Messaging。