ServiceStack RedisMqServer 并不总是处理从单独的应用程序发布的消息

ServiceStack RedisMqServer not always handling messages published from separate application

上下文

我配置了一个 RedisMqServer 来处理我的 ServiceStack Web 服务上的单个消息。该 MQ 上的消息来自另一个应用程序,并以所有正确的属性显示在 .inq 中。一切都在 4.0.38.

我在MyAppHost.cs中的配置:

public override void Configure(Container container)
{
    var redisFactory = new PooledRedisClientManager(0, "etc:etc");
    redisFactory.ConnectTimeout = 5;
    redisFactory.IdleTimeOutSecs = 30;
    redisFactory.PoolTimeout = 3;
    container.Register<IRedisClientsManager>(redisFactory);

    //Plugins, Filters, other Registrations omitted

    var mqHost = new RedisMqServer(redisFactory, retryCount: 2);
    mqHost.DisablePublishingResponses = true;
    mqHost.RegisterHandler<CreateVisitor>(ServiceController.ExecuteMessage);
    mqHost.Start();
}

然后在Global.asax.cs:

void Application_Start(object sender, EventArgs e)
{
    new MyAppHost().Init();
}

问题

当我将其部署到别处时,消息处理不一致。他们在 .inq 中等待,直到任何时候。什么都没有丢失,只是延迟了不确定的持续时间。

此时此刻,我唯一想到的是:

  1. 我在本地使用 IIS Express,而服务器正在使用 IIS。
  2. Application_Start 需要发生才能处理消息。

我已经尝试通过 HTTP 进行其他 API 调用来初始化服务,在排队消息之前和之后,失败多于成功。有时服务开始处理它们,但我无法识别并因此影响何时发生这种情况。

备注

我确实有几个其他控制台应用程序和 windows 服务,它们侦听其他 MQ 并处理其他应用程序放置的消息,并且它们始终运行完美。然而,这是我第一次在现有 Web 服务中尝试此操作。

很难从这个描述中知道问题是什么(消息是丢失还是只是延迟?)但这听起来像是由于 ASP.NET AppDomain 回收,在这种情况下你 can disable AppDomain recycling 或设置一个连续的 ping 路由来访问您的 ASP.NET Web 应用程序以保持 AppDomain 活动。

如果 ASP.NET 服务在 Internet 上可用,您可以使用 https://uptimerobot.com or https://www.pingdom.com 之类的服务将其配置为以不同的时间间隔(例如 5-10 分钟)ping 您的服务,否则如果这是您可以使用计划任务的内部服务。