我工作的公司正在研究从我们当前的单体 API 迁移到微服务。我们当前的 API 严重依赖于 Spring,我们使用 SQL Server 来实现大部分持久性。我们的微服务调查倾向于 spring-cloud、spring-cloud-stream、kafka 和 polyglot 持久性(每个微服务的隔离数据库)。
我有一个关于通过 kafka 进行消息传递通常如何在微服务架构中完成的问题。我们计划在一组微服务和我们的客户端应用程序之间建立一个协调层,该层将协调不同微服务之间的活动,并将客户端与微服务 API 的更改隔离开来。我们读过的关于使用 spring-cloud-stream 和 kafka 的大部分内容都表明我们应该在协调层(源)使用流来进行资源更改操作(插入、更新、删除),而微服务是消息。
我遇到问题的地方是插入。我们大量使用数据库分配的标识符(身份列/自动增量列/序列/代理键),它们通常作为发布请求的一部分分配并返回给调用者。协调层可能会使用不同的微服务保存多个内容,并且通常需要从一个插入中分配的标识符才能继续进行下一个操作。使用协调层和微服务之间的消息进行插入使得协调层无法从插入操作中获得响应,因此无法获得所需的分配标识符。此外,流上的其他消费者(即,将数据发布到数据仓库的消费者)确实需要消息包含分配的标识符。
人们如何处理这个问题?数据库分配的标识符是微服务中的反模式吗?我们是否应该公开返回数据库分配标识符的单独微服务端点,以便协调层可以在调用异步插入之前进行同步调用以获取标识符?我们可以使用 UUID,但我们的 DBA 讨厌将它们用作主键,并且它们不能用作订单号或其他面向用户的生成 id。