在Greenpipes / Masstransit中使用Partitioner和RateLimit

时间:2019-12-05 08:29:38

标签: c# 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 个答案:

答案 0 :(得分:1)

首先,分区程序不会为每个用户创建唯一的分区。基本上,分区数为一,您创建的并发限制为一。

它不会为每个键都创建一个分区,而是使用键来计算散列,以将负载分散到可用分区上。

第二,它应该使用消息的属性。您正在访问容器以获取服务提供商并调用某种方法的事实-是的,这超出了您在管道的那个阶段应该做的事情。请注意,这可能成为瓶颈。

速率限制有效,但是它应该在分区程序之前,并且不能识别或限制每个客户端。那是导体,但还没有准备好。