gpt4 book ai didi

c# - 可靠、持久堆栈的技术

转载 作者:行者123 更新时间:2023-11-30 17:21:17 28 4
gpt4 key购买 nike

在这里尝试心理重置:我尝试使用 MSMQ 创建一个可靠、持久的堆栈,但没有成功

所以更一般地说:

我有生产者(一个 web 服务,虽然“只有一个”,但也是多线程的)/消费者(多个进程,根据需要设置)。关键问题是- 数据需要以 LIFO 顺序使用/处理(~> 堆栈)- 数据需要以可靠的方式存储/处理(即由磁盘、消息队列等支持)。交易支持的奖励积分。- 涉及进程间通信

鉴于以上几点,我很难找到一个巧妙的解决方案。我看到了什么:

  1. 自己做并不是真的打算这样做,但最初的概念证明只是证实了这(对我来说)很难,并帮助我更好地掌握了所涉及的许多障碍。

  2. MSMQ会很好也很容易,因为它很容易“可靠”,易于设置并且已经成为目标基础设施的一部分。不幸的是,“LIFO”/“Stack”在这里是一个 killer 。这似乎是不可能的 -> Bzzzt。

  3. 数据库 (SQL Server)我试图查看基于数据库的方法,但涉及到很多丑陋的东西:

    • 我需要将我的数据存储为一个 blob(因为它不适合基于列的存储)
    • 为工作轮询数据库似乎是错误的(是吗?)
    • 锁定多个消费者似乎很棘手..

对我应该评估的技术有什么建议吗?到目前为止,基于数据库的方法似乎是最“有前途”的,但我仍然没有找到类似用例的好例子/成功案例。


更新

  • 仅限 Windows
  • 现在,我什至不需要进行机器间通信(即生产者/消费者现在可能在一台机器上)
  • 问题的关键部分,对我来说困难的任务是:即使所有进程都停止,我也不能丢失工作/消息。数据库会给我“免费”的消息队列,可以将其设置为可靠的。 Map/reduce 虽然有趣,但并未解决核心问题:如何确保消息/作业不会丢失?

最佳答案

为此我会选择 SQL Server。

  1. 显然,您必须将数据序列化为 blob,但任何解决方案都必须这样做(至少在幕后)。然后你就会有一个像 CREATE TABLE Stack (Id int identity, Data varbinary(MAX))

  2. 这样的表
  3. 不需要轮询数据库。 SQL Server 有一个查询通知服务,你只要给它一个查询,它就会在结果不同时通知你。您的通知查询将只是 SELECT * FROM Stack

  4. 锁定是数据库的问题,而不是您的问题。您只需让每个消费者运行一个查询(或存储过程),该查询(或存储过程)使用事务返回最近的条目(具有最高 ID 的行)并同时将其删除。如果查询返回结果,则对其进行处理并再次运行。如果查询未返回任何结果,请参阅 #2。

这是一个示例查询:

BEGIN TRANSACTION
SELECT Data FROM Stack WHERE Id = (SELECT MAX(Id) FROM Stack)
DELETE FROM Stack WHERE Id = (SELECT MAX(Id) FROM Stack)
COMMIT

这是一个更优雅的版本,甚至不需要显式事务:

DELETE Stack
OUTPUT DELETED.Data
WHERE Id = (SELECT MAX(Id) FROM Stack)

如果你想一次批处理 10 个项目,你可以像这样使用 SQL:

DELETE Stack
OUTPUT DELETED.*
WHERE Id IN (SELECT TOP 10 Id FROM Stack ORDER BY Id DESC)

关于c# - 可靠、持久堆栈的技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3596645/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com