C# 微软奥尔良的谷物节流

C# 微软奥尔良的谷物节流,c#,actor,orleans,C#,Actor,Orleans,我正试图与微软奥尔良一起决定正确的体系结构。我需要从大约1000个系统中检索100万到300万个文件,并将它们存储在几个中央服务器上。系统还将检索和存储每个文件的一些元数据,并将它们存储在数据库中 我目前正在考虑为每个文件使用一个粒度,这样我可能会有数百万个粒度,但我想知道在这种情况下,将每个粒度同时保存到数据库是否会导致数据库过载 我想我是否应该考虑下面的一个场景,以最小化数据库上的并发负载: 让grain将结果返回给另一个grain,后者将管理数据库交互并成批存储元数据 编写客户机代码的方式

我正试图与微软奥尔良一起决定正确的体系结构。我需要从大约1000个系统中检索100万到300万个文件,并将它们存储在几个中央服务器上。系统还将检索和存储每个文件的一些元数据,并将它们存储在数据库中

我目前正在考虑为每个文件使用一个粒度,这样我可能会有数百万个粒度,但我想知道在这种情况下,将每个粒度同时保存到数据库是否会导致数据库过载

<>我想我是否应该考虑下面的一个场景,以最小化数据库上的并发负载:

  • 让grain将结果返回给另一个grain,后者将管理数据库交互并成批存储元数据
  • 编写客户机代码的方式,以限制颗粒的创建。。。可以批量创建/激活1000粒谷物,只有在运行时停用并卸载之前创建或激活的谷物时,才能创建或激活更多谷物

  • 我是否需要处理这些问题,或者我可以简单地依赖奥尔良运行时(可能通过设置)不要一次激活太多的颗粒,这将试图同时将数据保存到数据库中?

    我会放弃第二个建议,因为由于难以写出结果,您将限制整个系统的吞吐量。这与奥尔良最大的优势之一格格不入,奥尔良的最大优势是可以根据需求进行无限制的扩展

    您可以尝试修改第一个解决方案。我不会将结果返回给另一个grain,而是让每个grain调用一个无状态服务,并带有其文件读取的结果,然后将持久性委托给该服务。这可能是您的想法,但无状态服务不同于颗粒,所以我想说清楚

    如果系统在该服务有一个试图写入的行列表时发生故障,这将打开数据丢失的大门。如果这是一个问题,我将让grains写入一个服务,该服务立即写入持久消息队列(即RabbitMQ),然后另一个服务从该队列读取数据并写入数据库。我不会让grains直接写入消息队列,因为集中队列写入可以让您向该服务添加重试逻辑、断路器等。试图将一个共用断路器添加到1毫米的晶粒上将是一场噩梦


    虽然你没问,我还是要提出另一个想法。我忍不住质疑将所有这些数据放入数据库的决定。DB非常擅长跟踪数据的更改,但我怀疑您正在收集的元数据稍后会被分析,但不会被修改。这使得它成为Azure事件网格等事件流的一个很好的候选对象。事件流针对写操作进行了优化,可以轻松处理您正在谈论的激增类型

    如何接受文件和元数据并将其保存到光盘中,然后在队列中对其进行处理。写入光盘至少比插入数据库快100倍。@Charles,谢谢你的建议,除了Brad Irby在下面的回答之外,我正在认真考虑这样做。我将使用此选项,但会写入文件系统,而不是消息队列。这是一个内部部署实现,我不确定是否能够将RabbitMQ之类的新技术引入堆栈。是的,你是对的,元数据一经写入就不会被修改。我可能也会将元数据作为json写入文件系统,并让一个进程从文件系统中读取数据。只要在本地写入json的机器停止运行时,您能够在数据丢失的情况下生存下来,这种方法就行了。