如何动态调整Observable管道的吞吐量?

时间:2016-02-22 05:00:19

标签: c# system.reactive

请观察以下C#代码段:

dir.EnumerateFiles("*." + ext, searchOption)
    .ToObservable()
    .Select(file => GetBatchSource(file, ...))
    .Merge(maxConcurrentFiles)
    .Select(batch => WriteBatch(batch, ...))
    .Merge(maxConcurrentBatches)
    .DefaultIfEmpty()
    .GetAwaiter()
    .GetResult();

...

private static IObservable<Batch> GetBatchSource(FileInfo file, ...)
{ ... }

private static IObservable<Unit> WriteBatch(Batch batch, ...)
{ ... }

其中:

  • GetBatchSource解析给定文件的行并生成批次
  • WriteBatch - 将给定批次写入数据库

此代码将日志文件解析并转储到数据库中,同时只读取maxConcurrentFiles个日志文件,并且不会向数据库写入maxConcurrentBatches批次。

我的问题是maxConcurrentFilesmaxConcurrentBatches是固定值。当然,它们是工具的参数,但一旦给定它们就不会改变。

理想情况下,我希望在生成批次的速度(由maxConcurrentFiles控制)与持久化(由maxConcurrentBatches控制)之间取得完美平衡。但这个速度并不是一成不变的。

我已经运行了maxConcurrentFilesmaxConcurrentBatches等于1的代码,并注意到等待写入的生成批次的数量永远不会是常量。一开始它似乎爬到大约6批次并在5到6之间振荡。然后,由于某种原因,它爬到10(好像数据库正在减速)然后逐渐下降到0(现在文件读取逻辑正在减慢)向下,数据库空闲),在0和2之间振荡,然后再次爬升,依此类推。队列中等待的批次数量可能会攀升至47个!

无论如何,我需要一个解决方案,其中写入数据库的并发批量随着队列中批次数的增加而增加。同样,当数据库空闲等待批处理时,需要增加并发文件的数量。

你会如何实现这样的事情?

0 个答案:

没有答案