C# MSR奥尔良-如何创建具有并行读取的读写器粒度
我需要一个读写器颗粒(s?)来保存一些值,以便系统的其他部分可以经常并行地引用它们 我所追求的是存储一些系统范围的配置值,这些值经常被访问,并且可能会发生更改,但很少(最多一个月一次)。系统应可重新配置,无需停机。我目前考虑的是将数据存储在某个数据库中。然后,它将在思洛存储器启动时读取,并且在外部更改数据后,将有一个特殊的回调来再次读取数据。我不想每次需要时都从数据库中读取数据,因为:C# MSR奥尔良-如何创建具有并行读取的读写器粒度,c#,multithreading,parallel-processing,orleans,C#,Multithreading,Parallel Processing,Orleans,我需要一个读写器颗粒(s?)来保存一些值,以便系统的其他部分可以经常并行地引用它们 我所追求的是存储一些系统范围的配置值,这些值经常被访问,并且可能会发生更改,但很少(最多一个月一次)。系统应可重新配置,无需停机。我目前考虑的是将数据存储在某个数据库中。然后,它将在思洛存储器启动时读取,并且在外部更改数据后,将有一个特殊的回调来再次读取数据。我不想每次需要时都从数据库中读取数据,因为: 这将在思洛存储器内部产生不必要的处理开销,因为必须处理和过滤掉一些数据 它会增加数据库的负载,我不能保证它在
- 这将在思洛存储器内部产生不必要的处理开销,因为必须处理和过滤掉一些数据
- 它会增加数据库的负载,我不能保证它在处理高负载方面会像思洛存储器环境一样好
- 数据在更新之前由思洛存储器环境验证。直接从数据库中读取意味着在操作员更新和修复新数据时,不会有中间层来保存最后已知的有效数据
- 在多个颗粒内具有多个数据副本。这显然不是最优的
- 使用静态字段来存储数据,并使谷物成为无状态工作进程。这意味着每个思洛存储器都有自己的数据副本(这也有助于减少网络负载),但无法要求每个思洛存储器更新其数据副本(至少我知道)
建议?你看过类似的东西吗 也许使用粒度也会有所帮助,这将允许方法调用交错
我在github上发现了同样的要求 我们找到了一个解决方案,它不需要在服务器上进行基于计时器的更新。我将在这里详细介绍解决方案:
智能缓存模式听起来很有希望,我必须研究一下。接得好。至于可重入的颗粒,由于颗粒只是返回其作为不可变对象保存的值,因此不需要进行交错,但总有一天会成为瓶颈。智能缓存的问题是系统对数据执行许多“选择*”查询。如果我理解正确的话,这个模式不太适合“选择所有查询”。不确定这是一个可接受的模式,但是对于我们的缓存,我们有一个每x秒更新一次的masterGrain,然后我们有一组无状态工作程序向masterGrain请求数据(每个无状态工作程序)有一个计时器,可以在需要时刷新数据。然后我们有了需要查询无状态工作粒度的值的粒度。在prod中对我们很有效。这样,无状态的工作人员可以根据需求进行扩展。工作人员如何知道何时进行更新?在计时器上?我可以立即发现的一个问题是,在更新后立即查询worker时(只有部分worker有机会更新之后),可能会得到不同的值。我说得对吗?这个问题会影响你的系统吗?我们可以接受有点过时的值。与任何缓存解决方案一样,在数据的性能和准确性之间需要权衡。