nservicebus数据库插入重复

nservicebus数据库插入重复,nservicebus,nservicebus-sagas,Nservicebus,Nservicebus Sagas,我们有一个数据加载器服务,它使用NServiceBus将数据(如果尚未存在)插入SQL DB。队列配置为ConcurrentyLevel>1,因为要加载的数据可能会变得巨大。由于并发级别>1,因此会导致重复插入。是否有办法在NServiceBus内处理此问题 注意:我们已经考虑并排除了创建线程安全锁的可能性。一般来说,不需要运行并发级别为1的端点。对于NServiceBus,您也不需要管理线程和处理并发/锁。关于如何设计系统以使其工作,还有其他因素: 不同的传输具有不同级别的事务支持。选择一个

我们有一个数据加载器服务,它使用NServiceBus将数据(如果尚未存在)插入SQL DB。队列配置为ConcurrentyLevel>1,因为要加载的数据可能会变得巨大。由于并发级别>1,因此会导致重复插入。是否有办法在NServiceBus内处理此问题


注意:我们已经考虑并排除了创建线程安全锁的可能性。一般来说,不需要运行并发级别为1的端点。对于NServiceBus,您也不需要管理线程和处理并发/锁。关于如何设计系统以使其工作,还有其他因素:

  • 不同的传输具有不同级别的事务支持。选择一个支持事务的。这意味着如果重试消息,您将不会获得重复的消息/数据

  • 尝试使用幂等性来处理系统。这意味着,由于缺少事务(传输不支持或代码禁用),如果您处理一条消息两次,就不会有多个数据/副作用。“如何”部分需要更好地了解您正在处理的数据和您的域


一般来说,不需要运行并发级别为1的端点。对于NServiceBus,您也不需要管理线程和处理并发/锁。关于如何设计系统以使其工作,还有其他因素:

  • 不同的传输具有不同级别的事务支持。选择一个支持事务的。这意味着如果重试消息,您将不会获得重复的消息/数据

  • 尝试使用幂等性来处理系统。这意味着,由于缺少事务(传输不支持或代码禁用),如果您处理一条消息两次,就不会有多个数据/副作用。“如何”部分需要更好地了解您正在处理的数据和您的域


我想澄清一下我的问题-队列消息没有被复制,但是说要加载的文件有重复的记录-尽管队列有向上插入的逻辑,因为它在多个并发状态下运行,所有并行线程都假定它是一个新的记录并插入,而不是插入的第一条消息,以及具有相同记录数据的后续消息得到更新。您对db列有某种唯一的约束吗?如果您对文件的每个条目发送一条消息(而不是在一条消息中处理整个文件),那么在并发处理的情况下,会发生两个线程拾取两条具有重复业务数据的消息,第一条消息插入,第二条消息因违反唯一约束而失败,然后重试。在下一次重试时,由于发现记录已插入,它可以忽略该消息。要澄清我的问题-队列消息没有重复,但要加载的文件有重复的记录-尽管队列具有向上插入的逻辑,因为它在多个并发情况下运行,所有并行线程都假定它是一个新的记录并插入,而不是插入的第一条消息,以及具有相同记录数据的后续消息得到更新。您对db列有某种唯一的约束吗?如果您对文件的每个条目发送一条消息(而不是在一条消息中处理整个文件),那么在并发处理的情况下,会发生两个线程拾取两条具有重复业务数据的消息,第一条消息插入,第二条消息因违反唯一约束而失败,然后重试。在下次重试时,由于它发现记录已插入,因此可以忽略该消息。