代码之家  ›  专栏  ›  技术社区  ›  Tom Miller

未在rebus中处理的随机消息

  •  2
  • Tom Miller  · 技术社区  · 6 年前

    我对rebus的实现有一个奇怪的问题,在过去的几年里,它一直在工作,没有任何问题,我正在试图找出问题的范围,以及在哪里集中我的故障排除工作。一点背景:

    • 我们运行的是0.99.66版本
    • 上周移到3.1.5版,然后看到问题出现
    • 回滚到0.99.66,问题继续
    • 使用msmq进行传输
    • 运行Windows Server 2016
    • 在其他服务器实例上运行的相同代码没有问题

    因此,我们遇到了一些看似随机的实例,其中消息出现故障,最后出现在错误队列中,并返回一个rebs错误,该错误表示消息无法发送到任何处理程序。这可能会发生一次,但当下次出现相同的消息类型时,它会得到正确的处理。

    下面是一段有问题的代码:

    public class ProcessManagerService
    {
        public ProcessManagerService()
        {
            ...
    
            BusAdapter = new BuiltinHandlerActivator();
            BusAdapter.Handle<FileEventMessage>(async msg => await StartProcess(msg));
            BusAdapter.Handle<ProcessRequest>(async msg => await StartProcess(msg));
    
            Bus = Configure.With(BusAdapter)
                    .Logging(l => l.ColoredConsole(LogLevel.Error))
                    .Transport(t => t.UseMsmq(ConfigurationManager.AppSettings["Queue"]))                   
                    .Start();            
        }
    
        ...
    
        public async Task StartProcess(FileEventMessage msg)
        {
            var svc = new StepManager() { FileEvent = msg.FileEvent };
            await svc.Run();
        }
    
        public async Task StartProcess(ProcessRequest msg)
        {
            var svc = new StepManager();
            await svc.Run(msg);
        }
    }
    

    下面是抛出异常的一个例子:

    5个未处理的异常:2018年12月18日上午7:53:00-06:00: rebs.exceptions.rebusApplicationException:ID为的消息 C72A8B6D-E31C-4A88-937E-612BF1DB8B11和类型 clearstone.messages.monitoring.file.fileeventmessage, 无法将clearstone.messages调度到处的任何处理程序 rebus.pipeline.receive.DispatchIngMessageStep.d_uuu 1.moveNext()。 ---从先前引发异常的位置开始的堆栈跟踪结束---at system.runtime.compilerServices.taskWaitier.throwForOnSuccess(任务 任务) system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务 任务)在rebus.sagas.loadsagadatastep.d_uu7.moveNext()时 ---从先前引发异常的位置开始的堆栈跟踪结束---at system.runtime.compilerServices.taskWaitier.throwForOnSuccess(任务 任务) system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务 任务) rebs.pipeline.receive.activateHandlersStep.d_uuu 3.moveNext()。 ---从先前引发异常的位置开始的堆栈跟踪结束---at system.runtime.compilerServices.taskWaitier.throwForOnSuccess(任务 任务) system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务 任务) rebs.pipeline.receive.deserializinecomingmessagestep.d_uuu 2.moveNext()) ---从先前引发异常的位置开始的堆栈跟踪结束---at system.runtime.compilerServices.taskWaitier.throwForOnSuccess(任务 任务) system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务 任务) rebus.pipeline.receive.handleDeferredMessagesStep.d_uuu 12.moveNext()) ---从先前引发异常的位置开始的堆栈跟踪结束---at system.runtime.compilerServices.taskWaitier.throwForOnSuccess(任务 任务) system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务 任务) rebs.retry.simple.simpleretrystrategystep.d_uuu 8.moveNext()。


    更新:这里有一个更详细的在rebs源中连接后的堆栈跟踪:


    5个未处理的异常:2018年12月20日上午9:39:05-06:00:rebs.exceptions.rebusApplicationException:ID为84c3605a-41de-4300-9596-97e7288d2bcb的消息,并键入clearstone.messages.monitoring.file.fileeventmessage,clearstone。消息无法发送到任何处理程序 在rebus.pipeline.receive.DispatchIngMessageStep.d_uuu 1.moveNext()中,C:\temp\rebus_0_99_archive\rebus\pipeline\receive\DispatchIngMessageStep.cs:line 61 ---从先前引发异常的位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskWaiter.ThrowForOnSuccess(任务任务) 在system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.GetResult()时 在c:\temp\rebs_0_99_66_archive\rebs\sagas\loadsagadatastep.d_uu7.movenext()中的rebs.sagas.loadsagadatastep.cs:line 77 ---从先前引发异常的位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskWaiter.ThrowForOnSuccess(任务任务) 在system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.GetResult()时 在rebus.pipeline.receive.activatehandlersstep.d_uuu 3.movenext()中,C:\temp\rebus_0_99_存档\rebus\pipeline\receive\activatehandlersstep.cs:line 48 ---从先前引发异常的位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskWaiter.ThrowForOnSuccess(任务任务) 在system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.GetResult()时 在rebus.pipeline.receive.deserializinecomingmessagestep.d_uu2.movenext()中,C:\temp\rebus_0_99_archive\rebus\pipeline\receive\deserializinecomingmessagestep.cs:line 36 ---从先前引发异常的位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskWaiter.ThrowForOnSuccess(任务任务) 在system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.GetResult()时 在rebus.pipeline.receive.handleDeferredMessagesStep.d_uu12.moveNext()中,C:\temp\rebus_0_99_66存档\rebus\pipeline\receive\handleDeferredMessagesStep.cs:line 114 ---从先前引发异常的位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskWaiter.ThrowForOnSuccess(任务任务) 在system.runtime.compilerservices.taskwaiter.handlenonsuccessanddebuggernotification(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.GetResult()时 位于c:\temp\rebus_0_99_66_archive\rebus\retry\simple\simpleretrystrategystep.d_uu8.movenext()中的at rebus.retry.simple.simpleretrystrategystep.cs:line 105

    假设在这个特定的服务器实例/环境中存在明显的问题,那么我将尝试弄清楚rebus为什么会这样做,以及在我的环境中是什么导致了这种情况。无论从何处开始寻找,我们都将不胜感激!

    1 回复  |  直到 6 年前
        1
  •  2
  •   mookid8000    6 年前

    听起来很奇怪:)当人们遇到这个问题时,几乎总是因为他们以某种方式设置了多个rebus实例来从同一队列中消费消息。

    在一些罕见的情况下,这是因为 .Start() 在公共汽车上叫的 之前 处理程序被添加到容器/内置的处理程序激活器中,但在您的情况下,这似乎不是问题所在。

    你能告诉我更多关于你的设置吗?如果它和上面显示的一样简单,也许您可以在单独的应用程序中复制它?

    推荐文章