通过队列消息进行负载均衡时如何处理自动生成的 ID?

How handle auto generated IDs when load leveling via queue message?

我们有一个 asp.net 核心 Web Api,以 MS Dynamics CRM 作为数据库,我们希望实施队列消息传递以获得更好的性能,我们的选择是 RabbitMQ。

我们在 CRM 中写入的情况很多,但新的 CRM 实体记录的 ID 是自动生成的 GUID。这个新的 GUID 将用于其他请求,例如:在其他实体中查找,更新此记录..

假设我们有 3 个实体:

Topics            [ID(auto-generated), Name]
UserTopic         [ID(auto-generated), UserId, TopicId]

UserComment [ID(自动生成),<strong>UserTopicId(1)</strong>,评论]

当用户订阅主题时,我们应该在 Web API 级别执行以下操作:

 1- Send a message to the queue of register in topic
 2- Add an object UserTopic to the cache (with an empty or auto-generated GUID)

因此消息处理程序将在 UserTopic 实体中插入一条新记录,CRM 将在其中 生成 Web API 不知道的新 GUID(2).

如果用户需要为此主题添加评论,我们需要 GUID(2) 来插入实体 UserComment (1).

那么如何在消息处理程序中处理 CRM 创建的这种自动生成的 GUID?

基本上你有三种不同的选择

  1. 如评论中所建议的那样,您可以检索在创建记录期间分配的 ID。这将需要在您的消息传递中使用 RPC 模式,这与异步消息传递的性质相矛盾

  2. 您可以在创建请求中定义 id。您在实体的构造函数中分配的 ID 或 ID 属性 然后用于在 CRM 中创建记录。

    public Entity (string logicalName, Guid id) {…}

    您必须确保传递的 ID 尚未用于此实体

  3. 您可以使用备用键而不是依赖 CRM 的主键。因此,您可以使用 Web api 应用程序的标识符来识别 CRM 中的相应记录。

您将在 Use an alternate key to create a record

找到有关 2. 和 3. 的更多信息

另一种解决方案是使用以下字段创建一个简单的 SQL(或任何替代方案)地图 table:

Id    uniqueidentifier /* Sent from API within the request */
CrmId uniqueidentifier /* Autogenerated by CRM */

因此,当 RabbitMQ 创建 CRM 记录并将新记录插入新 SQL table 时,每当您需要来自 CRM 的数据(缓存过期后),这样您就可以使用发送的 ID获取 CrmId。