gpt4 book ai didi

c# - 如何使用 Reactive Extensions 来限制客户端请求

转载 作者:行者123 更新时间:2023-11-30 16:57:52 27 4
gpt4 key购买 nike

我有一个服务器从许多客户端接收许多对象,并且每次接收对象时都会触发 ObjectReceived 事件,包括在发送对象的参数中。

Problem: There is a client annoying my server with requests but my server always responds.

我想根据发出请求的人限制请求。例如,如果我在 1 秒内收到来自 100 个不同客户端的 100 个请求,并且每个客户端都发出了不同的请求,我会响应每个发出请求的客户端;但是如果我在 1 秒内收到来自 2 个客户端的 100 个请求,并且每个客户端都完成了相同的请求 50 次,我只响应两次,一次给客户端 A,一次给客户端 B。

在 Rx 中可以吗?

最佳答案

是的,一种方法是按客户端 ID 对请求进行分组并有选择地应用限制。

假设你有这样的事件:

public class MyEvent
{
public int ClientId { get; set; }

public override string ToString()
{
return ClientId.ToString();
}
}

让我们设置慢速和快速客户端:

var slow = Observable.Interval(TimeSpan.FromSeconds(2))
.Select(_ => new MyEvent { ClientId = 1 });

var fast = Observable.Interval(TimeSpan.FromSeconds(0.5))
.Select(_ => new MyEvent { ClientId = 2 });

var all = slow.Merge(fast);

现在像这样有选择地节流:

var throttled = all.GroupBy(x => x.ClientId).Select(
// apply the throttle here, this could even test the key
// property to apply different throttles to different clients
x => x.Throttle(TimeSpan.FromSeconds(1)))
.SelectMany(x => x);

并测试它:

throttled.Subscribe(x => Console.WriteLine(x.ToString())); 

有了这个限制,快速客户端将永远不会得到响应 - Throttle 将无限期地抑制他的请求,因为它们相隔不到一秒。您可以使用其他运算符以不同的方式进行抑制 - 例如Sample 可以在给定的时间间隔内挑选出单个请求。

在你的问题编辑之后

您可以应用与 ClientId 不同的规则并使用 Throttle - 例如,您可以在客户端流上使用 DistinctUntilChanged() 来清除重复请求。

关于c# - 如何使用 Reactive Extensions 来限制客户端请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25977346/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com