在 Greenpipes/Masstransit 中使用 Partitioner 和 RateLimit
Using Partitioner along with RateLimit in Greenpipes/Masstransit
我正在尝试了解是否可以在 Greenpipes 中组合 Partitioner 和 RateLimiter 过滤器。我现在拥有的下面的代码无法按预期工作:
cfg.UseDispatch(new RequestConverterFactory(), d =>
{
d.Handle<Request<RenderBasemapRequest>>(h =>
{
h.UsePartitioner(1,
context => context.Request.ServiceProvider.GetService<IIdentityService>().CurrentIdentityId
); // 1 user can request only for 1 screenshot in parallel.
h.UseRateLimit(5, TimeSpan.FromMinutes(1)); // 5 requests per user per minute
h.UseHandler<RenderBasemapRequest, Stream>();
});
});
我想限制用户每分钟最多只能发出 5 个请求。但是 UseRateLimit 会在全局范围内设置它,而不管上面是否有分区过滤器,所以我每分钟一次为所有用户收到 5 个请求。是否可以使用 Greenpipes 过滤器实现我想要的效果?有人可以给我提示吗?
提前致谢。
首先,分区程序不会为每个用户创建唯一的分区。基本上,分区数为 1 时,您创建的并发限制为 1。
它不会为每个键创建一个分区,它使用键计算散列以将负载分散到可用分区。
其次,应该使用一个属性的消息。事实上,您正在访问容器以获取服务提供者并调用一些方法——是的,这有点超出了您在管道的那个阶段应该做的事情。可能会成为瓶颈,请注意。
速率限制有效,但它应该先于分区程序,并且无法识别或限制每个客户端。 Conductor 即将推出,但尚未准备就绪。
我正在尝试了解是否可以在 Greenpipes 中组合 Partitioner 和 RateLimiter 过滤器。我现在拥有的下面的代码无法按预期工作:
cfg.UseDispatch(new RequestConverterFactory(), d =>
{
d.Handle<Request<RenderBasemapRequest>>(h =>
{
h.UsePartitioner(1,
context => context.Request.ServiceProvider.GetService<IIdentityService>().CurrentIdentityId
); // 1 user can request only for 1 screenshot in parallel.
h.UseRateLimit(5, TimeSpan.FromMinutes(1)); // 5 requests per user per minute
h.UseHandler<RenderBasemapRequest, Stream>();
});
});
我想限制用户每分钟最多只能发出 5 个请求。但是 UseRateLimit 会在全局范围内设置它,而不管上面是否有分区过滤器,所以我每分钟一次为所有用户收到 5 个请求。是否可以使用 Greenpipes 过滤器实现我想要的效果?有人可以给我提示吗?
提前致谢。
首先,分区程序不会为每个用户创建唯一的分区。基本上,分区数为 1 时,您创建的并发限制为 1。
它不会为每个键创建一个分区,它使用键计算散列以将负载分散到可用分区。
其次,应该使用一个属性的消息。事实上,您正在访问容器以获取服务提供者并调用一些方法——是的,这有点超出了您在管道的那个阶段应该做的事情。可能会成为瓶颈,请注意。
速率限制有效,但它应该先于分区程序,并且无法识别或限制每个客户端。 Conductor 即将推出,但尚未准备就绪。