在 CQRS 模式中使用整数 ID

Using integer ids with CQRS Pattern

有人要求我将 CQRS 模式应用于现有项目。如果可能的话,这不应该对使用整数 ID 的数据库进行任何模式更改。

但是,我见过的每个 CQRS 示例都使用了 Guid,我的问题是这是使用 CQRS 的固有要求还是我有办法对其进行调整。

(我们将此作为练习进行,因此这样做的有用性/实用性不成问题)。

CQRS 没有理由需要 GUID。如果您想要多个写入服务,您通常需要 GUIDS,但 CQRS 只是将读取和写入服务(以及两者使用的模型)分开。

CQRS 需要 guid,因为命令源必须独立于 ID 的任何中央分配。它们很容易生成。在标准库不为您提供 guid 的情况下,加密库实际上更好。这是我用于 Go 的内容:

func pseudo_uuid() (uuid string) {

    b := make([]byte, 16)
    _, err := rand.Read(b)
    if err != nil {
        fmt.Println("Error: ", err)
        return
    }

    uuid = fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])

    return
}

虽然将 CQRS 视为一种将系统分成 2 个系统的方法 - 一个负责状态转换,一个负责其他一切 - 重要的是要观察 CQRS 的动机是可扩展性和抽象如果您依靠集中分配 ID 来构建,那么在您扩大规模时将需要付出重构努力。

因为使用 CQRS 的一个方面是您可以使用它来创建(大型)分布式应用程序,没有 UUID,但整数 ID 可能会损害系统以分布式方式工作的能力。

这里的问题是你依赖于一个中央计数器,它需要锁定、事务和所有这些你不想在分布式系统中拥有的东西。

所以,是的,您当然可以 使用整数 ID,但就可伸缩性而言,这是个坏主意。如果这对您不重要,它(可能)仍然有效。