C# 当通过队列消息进行负载均衡时,如何处理自动生成的ID?
我们有一个以MS Dynamics CRM为数据库的asp.net核心Web Api,我们希望实现队列消息传递以获得更好的性能,我们的选择是RabbitMQ 在很多情况下,我们在CRM中写入,但新CRM实体记录的ID是自动生成的GUID。此新GUID将用于其他请求,如:在其他实体中查找,更新此记录 假设我们有3个实体: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
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呢?基本上,您有三个不同的选项
公共实体(字符串逻辑名称,Guid id){…}
您必须确保传递的id尚未用于此实体您将找到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?