2

我目前正在试用 ServiceStack 的持久性迷你分析器功能,目前在为我的 Redis 消息队列处理程序注册配置文件信息时遇到问题。

更多背景知识:我有一些常规的 REST api 处理程序,它们接收请求,推迟帐户信息的一些更新并将 OK 回复给调用者。这些消息使用ServiceStack Redis MQ 模式发布到 Redis 服务器。因此,Redis 消息处理注册为:

var redisFactory = new PooledRedisClientManager(redisClients);
var mqHost = new RedisMqServer(redisFactory, retryCount: 2);

var defaultThreadCount = 4;
mqHost.RegisterHandler<SomeDto>(m => this.ServiceController.ExecuteMessage(m), noOfThreads:defaultThreadCount);
mqHost.RegisterHandler<SomeOtherDto>(m => this.ServiceController.ExecuteMessage(m), noOfThreads:defaultThreadCount);
mqHost.Start();    

我的消息也得到了妥善处理。

自定义 ServiceRunner中,我启用了对所有请求的分析,BeforeEachRequest并添加了一个自定义 Profiler 步骤,如下所示:

public override void BeforeEachRequest(IRequest requestContext, T request)
{
    Profiler.Start();

    using (Profiler.StepStatic("Executing handler"))
    {
        base.BeforeEachRequest(requestContext, request);        
    }
 }

我的所有 HTTP REST 请求都发送到 SQL 表,但没有注册任何 MQ 处理程序调用。而且我 100% 确信处理程序确实正在执行,因为该执行的结果存储在 MongoDB 集合中。

有什么我想念的吗?

- 编辑 -

我忘了提到这个项目确实是通过 ASP.NET 应用程序托管的。AppHost 在 Global.asax 中初始化App_Start- 我只是发现“请求前”处理自定义服务运行程序而不是 ASP.NETBegin_Request处理程序更方便。

4

2 回答 2

4

我对自托管服务器也有类似的问题。问题是分析器用于HttpContext.Current存储分析结果。如果没有有效的上下文,它不知道要将结果添加到哪个分析“会话”。

可以通过设置来实现您自己的 ProfilingProvider Profile.Settings.ProfilingProvider,但是,除非我遗漏了什么,否则在具有当前 IProfilerProvider 接口的异步环境中正确实现它会很棘手(如果不是不可能的话)。

于 2014-01-19T17:02:08.667 回答
3

我编写了一个非常简单且幼稚的提供程序,您可以将其用于分析。这不会选择 ServiceStack 默认添加的任何步骤,但它可能对您自己的调试仍然有用。

示例使用:

Profiler.Settings.ProfilerProvider = RequestProfilerProvider.Instance;
PreRequestFilters.Add((req, res) => RequestProfiler.Start(req));
GlobalRequestFilters.Add((req, res, dto) => {
  var profiler = RequestProfiler.GetProfiler(req);
  using (profiler.Step("Very slow step")) {
    Thread.Sleep(1000);
  }
});
GlobalResponseFilters.Add((req, res, dto) => RequestProfiler.Stop(req));
于 2014-01-19T19:24:57.907 回答