如何扩展聚合?
系统中的每条信息都有一个逻辑权限。单个数据的多个权限使您争用。您可以通过创建更小不重叠的边界来扩展写入——每个权限都有更小的职责范围
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。