Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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# RX设计-外部系统上的节流冲击_C#_System.reactive - Fatal编程技术网

C# RX设计-外部系统上的节流冲击

C# RX设计-外部系统上的节流冲击,c#,system.reactive,C#,System.reactive,我正在编写一个消息代理,它利用文件系统上的IBMMQS和文件夹。在拾取消息之后,它将它们具体化为强类型类,并将它们插入RX主题 我已经建立了对消息的了解,这些消息允许我识别需要点击哪些外部系统来处理它们,因此我可以查询RX观测值并选择不以外部系统为目标的消息,等等 我接下来要做的是,通过外部系统来限制消息,例如: 如果我使用某种类型的消息访问CRM系统,我会决定最多使用4个并发调用访问该系统,我一次只能处理4条消息,如果我有第5条消息,我将不得不等待前4条消息中的一条完成,然后转到第5条。对于其

我正在编写一个消息代理,它利用文件系统上的IBMMQS和文件夹。在拾取消息之后,它将它们具体化为强类型类,并将它们插入RX主题

我已经建立了对消息的了解,这些消息允许我识别需要点击哪些外部系统来处理它们,因此我可以查询RX观测值并选择不以外部系统为目标的消息,等等

我接下来要做的是,通过外部系统来限制消息,例如:

如果我使用某种类型的消息访问CRM系统,我会决定最多使用4个并发调用访问该系统,我一次只能处理4条消息,如果我有第5条消息,我将不得不等待前4条消息中的一条完成,然后转到第5条。对于其他类型的资源(如外部数据库、其他外部web服务等)也是如此

我已经开始研究这个问题,到目前为止,最好的设计方法是编写自己的调度器。缺点是,我必须编写自己的内部结构,在获取消息后在调度程序中对消息进行排队,这就是我不喜欢这种方法的地方


有谁有更好的方法来实现这一点吗?

您可能需要研究ReactiveUI,它包括服务请求的速率调节机制。请参见

您可能希望查看包含服务请求速率调节机制的ReactiveUI。请参见

您所描述的似乎是最大并发性。
Merge
操作符支持这样的东西

您需要使用类似于
GroupBy
的方法来根据流的去向分割流,然后使用
Merge
在每个分割的部分上具有最大并发性,最后将结果合并到一起。大概是这样的:

IObservable<T> requests = ...;
requests.GroupBy(request => PickExternalSystem(request))
    .Select(group => group // group.Key is the TExternalSystem
        .Select(request => Observable.Defer(() => group.Key.ExecuteAsync(request)))
        .Merge(maxConcurrency: group.Key.MaxConcurrency))
    .Merge() // merge the results of each group back together again
    .Subscribe(result => ...);
IObservable请求=。。。;
GroupBy(请求=>PickExternalSystem(请求))
.Select(group=>group//group.Key是文本ernalsystem
.Select(请求=>Observable.Defer(()=>group.Key.ExecuteAsync(请求)))
.Merge(maxConcurrency:group.Key.maxConcurrency))
.Merge()//重新合并每个组的结果
。订阅(结果=>…);

您所描述的似乎是最大并发性。
Merge
操作符支持这样的东西

您需要使用类似于
GroupBy
的方法来根据流的去向分割流,然后使用
Merge
在每个分割的部分上具有最大并发性,最后将结果合并到一起。大概是这样的:

IObservable<T> requests = ...;
requests.GroupBy(request => PickExternalSystem(request))
    .Select(group => group // group.Key is the TExternalSystem
        .Select(request => Observable.Defer(() => group.Key.ExecuteAsync(request)))
        .Merge(maxConcurrency: group.Key.MaxConcurrency))
    .Merge() // merge the results of each group back together again
    .Subscribe(result => ...);
IObservable请求=。。。;
GroupBy(请求=>PickExternalSystem(请求))
.Select(group=>group//group.Key是文本ernalsystem
.Select(请求=>Observable.Defer(()=>group.Key.ExecuteAsync(请求)))
.Merge(maxConcurrency:group.Key.maxConcurrency))
.Merge()//重新合并每个组的结果
。订阅(结果=>…);
我也发布了这篇文章,并通过不同的合并运算符实现获得了更深入的答案,这样在最大并发值更改时就不会发生数据丢失。

我也发布了这篇文章,并通过不同的合并运算符实现获得了更深入的答案,这样在最大并发值更改时就不会发生数据丢失并发值已更改