事件 Sourcing/CQRS 聚簇索引和分区

Event Sourcing/CQRS Clustered Index and Partitioning

我在税务处理公司工作,使用 SQL Server 2016。我们处理数百万条税务信息 returns,并设置并发、多线程、并行处理系统。

  1. 对于并行处理写入事件存储,聚簇索引应该放在什么位置?在 UniqueIdentifier Guid 上,或(Identity(1,1) 上的聚集索引与 Uniqueidentifier guid 上的 Ncx)?,或没有聚集索引(利用堆)?

  2. 你一般推荐分区写事件存储吗table?

  3. 当我们更新我们的读取模型进行查询时,我们是否仍然应该使用并行处理来更新读取模型?还是我们应该进行单流更新?

  4. 此外,读取事件模型、UniqueIdentifierGuid 或(Identity(1,1) 上的聚集索引和 Uniqueidentifier guid 上的 Ncx)上的聚集索引又应该是什么?

  5. 我们应该分割读取模型table还是任何其他方法?

uniqueidentifierguids 上的索引是错误的聚簇索引,导致大量页面碎片、慢 io 写入和大磁盘 space。 https://blogs.msdn.microsoft.com/sqlserverfaq/2010/05/27/guid-vs-int-debate/

但是,identity(1,1) 整数列上的索引会导致闩锁争用,最后一页在并行处理中插入“热点”。 http://www.sqlpassion.at/archive/2014/04/15/an-ever-increasing-clustered-key-value-doesnt-scale/

您的个人需求将取决于您独特系统的架构。通常,您需要能够测试、测量和分析以确定您的瓶颈是什么(或将是)。

例如,您在任何时候并行写入的节点数将与您在任何时刻需要的吞吐量有关。

这里有两个帮助您入门的提示:

  • 您可能需要一个 GUID id(索引)和第二列用于聚集索引。我使用标识(序号)列作为我的 Clusered 索引,因为它是在数据库中生成的。通常,您不会在物理上并行写入磁盘(即使您尝试并行执行),所以只需使其快速简单(并分析它!)。

  • 对于您生成的每个 "Read Model",您通常需要串行处理事件。您可以有多个 "Read Models",如果数据是独立的,您可以并行构建它们。

我不确定你对 EventSourcing 的熟悉程度,但我不能推荐这两个资源。

http://docs.geteventstore.com/introduction/4.0.2/event-sourcing-basics/ https://leanpub.com/esversioning