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

C# 当通过队列消息进行负载均衡时,如何处理自动生成的ID?,c#,asp.net-web-api,rabbitmq,dynamics-crm,service-broker,C#,Asp.net Web Api,Rabbitmq,Dynamics Crm,Service Broker,我们有一个以MS Dynamics CRM为数据库的asp.net核心Web Api,我们希望实现队列消息传递以获得更好的性能,我们的选择是RabbitMQ 在很多情况下,我们在CRM中写入,但新CRM实体记录的ID是自动生成的GUID。此新GUID将用于其他请求,如:在其他实体中查找,更新此记录 假设我们有3个实体: Topics [ID(auto-generated), Name] UserTopic [ID(auto-generated), UserI

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

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

假设我们有3个实体:

Topics            [ID(auto-generated), Name]
UserTopic         [ID(auto-generated), UserId, TopicId]
UserComment[ID(自动生成),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呢?

基本上,您有三个不同的选项

  • 就像命令中建议的那样,您可以检索在创建记录期间分配的id。这需要在消息传递中使用RPC模式,这与异步消息传递的性质相矛盾

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

    公共实体(字符串逻辑名称,Guid id){…}

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

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


  • 您将找到2的更多信息。三,。在

    中,另一种解决方案是使用以下字段创建一个简单的SQL(或任何可选)映射表:

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

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

    “将对象UserTopic添加到具有空GUID的缓存中”-为什么?可能只是不这样做,然后当这个用户主题被请求时——它将使用正确的uuid从数据库中获取(此时可以添加到缓存中)。还有,你是在用“火和忘记”的方式发送信息吗?如果插入topic或usertopic失败怎么办?当最终用户单击register并发送消息时,我们成功回复,因为最终用户不应被限制,然后用户添加注释,因此,如果没有缓存UserTopic对象并尝试检查CRM用户是否已订阅获取订阅id,我们不能保证消息处理程序已经处理了订阅请求,因为我们正在处理数千个并发用户。当您在CRM中创建记录时,会返回新创建记录的guid。为什么不能在您的服务中简单地使用该guid?