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

时间:2018-04-08 13:38:04

标签: c# asp.net-web-api rabbitmq dynamics-crm service-broker

我们有一个带有MS Dynamic 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(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 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

  4. 您可以在Use an alternate key to create a record

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

答案 1 :(得分:0)

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

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

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