Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MSR奥尔良-如何创建具有并行读取的读写器粒度_C#_Multithreading_Parallel Processing_Orleans - Fatal编程技术网

C# MSR奥尔良-如何创建具有并行读取的读写器粒度

C# MSR奥尔良-如何创建具有并行读取的读写器粒度,c#,multithreading,parallel-processing,orleans,C#,Multithreading,Parallel Processing,Orleans,我需要一个读写器颗粒(s?)来保存一些值,以便系统的其他部分可以经常并行地引用它们 我所追求的是存储一些系统范围的配置值,这些值经常被访问,并且可能会发生更改,但很少(最多一个月一次)。系统应可重新配置,无需停机。我目前考虑的是将数据存储在某个数据库中。然后,它将在思洛存储器启动时读取,并且在外部更改数据后,将有一个特殊的回调来再次读取数据。我不想每次需要时都从数据库中读取数据,因为: 这将在思洛存储器内部产生不必要的处理开销,因为必须处理和过滤掉一些数据 它会增加数据库的负载,我不能保证它在

我需要一个读写器颗粒(s?)来保存一些值,以便系统的其他部分可以经常并行地引用它们

我所追求的是存储一些系统范围的配置值,这些值经常被访问,并且可能会发生更改,但很少(最多一个月一次)。系统应可重新配置,无需停机。我目前考虑的是将数据存储在某个数据库中。然后,它将在思洛存储器启动时读取,并且在外部更改数据后,将有一个特殊的回调来再次读取数据。我不想每次需要时都从数据库中读取数据,因为:

  • 这将在思洛存储器内部产生不必要的处理开销,因为必须处理和过滤掉一些数据
  • 它会增加数据库的负载,我不能保证它在处理高负载方面会像思洛存储器环境一样好
  • 数据在更新之前由思洛存储器环境验证。直接从数据库中读取意味着在操作员更新和修复新数据时,不会有中间层来保存最后已知的有效数据
我可以很容易地创建一个读写器锁定在内存中的数据存储,但是Orleans的单线程执行策略不允许并行访问保存数据的粒度。我可以想出以下方法来绕过这个问题:

  • 在多个颗粒内具有多个数据副本。这显然不是最优的
  • 使用静态字段来存储数据,并使谷物成为无状态工作进程。这意味着每个思洛存储器都有自己的数据副本(这也有助于减少网络负载),但无法要求每个思洛存储器更新其数据副本(至少我知道)

建议?

你看过类似的东西吗

也许使用粒度也会有所帮助,这将允许方法调用交错


我在github上发现了同样的要求

我们找到了一个解决方案,它不需要在服务器上进行基于计时器的更新。我将在这里详细介绍解决方案:

  • 有一个主粒度,负责从数据库中读取数据。当配置更改时,此粒度还接收外部UpdateConfig调用。数据库是“手动”更新的,所以我不在乎它是否自动获取更新
  • 每个思洛存储器上都有无状态工作缓存颗粒。这些颗粒将数据存储在静态对象中(以帮助占用内存),并使用读写器锁来管理对数据的访问。当第一个在思洛存储器上唤醒时,它会更新数据,其余的只使用该数据。它们还支持一个外部UpdateConfig调用,该调用将向主粒度请求新数据
  • 有一个引导提供程序可以做两件事。首先,它在初始化时唤醒主粒度,这样数据在需要之前就可用了,因此我们可以避免延迟初始化打嗝。其次,提供程序还支持控制命令(有关可控提供程序的示例,请参见)。收到此命令后,它将要求第一个可用的缓存粒度(保证是本地的)更新静态对象。这样,每个思洛存储器中的数据都会更新。主谷物只要在更新其数据时发送此控制命令即可

  • 智能缓存模式听起来很有希望,我必须研究一下。接得好。至于可重入的颗粒,由于颗粒只是返回其作为不可变对象保存的值,因此不需要进行交错,但总有一天会成为瓶颈。智能缓存的问题是系统对数据执行许多“选择*”查询。如果我理解正确的话,这个模式不太适合“选择所有查询”。不确定这是一个可接受的模式,但是对于我们的缓存,我们有一个每x秒更新一次的masterGrain,然后我们有一组无状态工作程序向masterGrain请求数据(每个无状态工作程序)有一个计时器,可以在需要时刷新数据。然后我们有了需要查询无状态工作粒度的值的粒度。在prod中对我们很有效。这样,无状态的工作人员可以根据需求进行扩展。工作人员如何知道何时进行更新?在计时器上?我可以立即发现的一个问题是,在更新后立即查询worker时(只有部分worker有机会更新之后),可能会得到不同的值。我说得对吗?这个问题会影响你的系统吗?我们可以接受有点过时的值。与任何缓存解决方案一样,在数据的性能和准确性之间需要权衡。