【问题标题】:nservicebus db insert duplicatenservicebus db插入重复
【发布时间】:2017-08-12 00:16:02
【问题描述】:

我们有一个数据加载器服务,它使用 NServiceBus 将数据(如果尚未存在)插入 SQL DB。队列配置为 Concurrencylevel > 1,因为要加载的数据可能会变得很大。由于 Concurrencylevel > 1,它会导致重复插入。有没有办法在 NServiceBus 中处理这个问题。

注意:我们已经考虑并排除了创建线程安全锁

【问题讨论】:

    标签: nservicebus nservicebus-sagas


    【解决方案1】:

    一般来说,无需运行并发级别为 1 的端点。当涉及到 NServiceBus 时,您也不需要管理线程和处理并发/锁。系统需要如何设计才能使其正常工作还有其他因素:

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

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

    【讨论】:

    • 想澄清一下我的问题 - 队列消息没有重复,但说要加载的文件有重复的记录 - 尽管队列具有更新插入的逻辑,因为它以多个并发运行,所有并行线程都假定它是一条新记录并插入,而不是插入第一条消息并更新具有相同记录数据的后续消息
    • 您的 db 列是否有某种独特的约束?如果您为文件的每个条目发送 1 条消息(而不是在一条消息中处理整个文件),则在并发处理的情况下会发生两个线程选择两条具有重复业务数据的消息,第一个插入,第二个因失败而失败违反唯一约束并重试。在下一次重试时,由于它发现记录已被插入,它可以忽略该消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多