代码之家  ›  专栏  ›  技术社区  ›  azronda

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

  •  3
  • azronda  · 技术社区  · 6 年前

    我们有一个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(auto-generated), UserTopicId(1) , Comment]

    当用户订阅主题时,我们应该在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呢?

    2 回复  |  直到 5 年前
        1
  •  0
  •   ccellar Mark Brackett    6 年前

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

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

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

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

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

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

    您将找到2的更多信息。和3。在 Use an alternate key to create a record

        2
  •  0
  •   Amen Ayach    6 年前

    另一种解决方案是创建具有以下字段的简单SQL(或任何其他)映射表:

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

    因此,当RabbitMQ创建了CRM记录并将新记录插入到新的SQL表中时,只要您需要来自CRM的数据(缓存过期后),就可以使用发送的Id来获取CrmId。