NServiceBus - Ошибки управляющего сообщения распространителя

Мы купили много лицензий, провели много тестов с многообещающими результатами и находимся на пороге нашего первого релиза :).

Но теперь мы столкнулись с большой неровностью на дороге, а это значит, что нам, возможно, придется покинуть автобус, если мы не сможем объяснить и исправить это: /.

У нашего дистрибьютора внезапно появляются сообщения об ошибках управления, подобные приведенному ниже:

<?xml version="1.0"?>
<ArrayOfHeaderInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <HeaderInfo>
        <Key>NServiceBus.ControlMessage</Key>
        <Value>True</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.Distributor.WorkerCapacityAvailable</Key>
        <Value>20</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.Distributor.WorkerStarting</Key>
        <Value>True</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>CorrId</Key>
        <Value>58dd98f5-9ac0-44fb-8604-3a0f06787a35\295075</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.ExceptionInfo.Reason</Key>
        <Value>ProcessingFailed</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.ExceptionInfo.ExceptionType</Key>
        <Value>System.InvalidOperationException</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.ExceptionInfo.HelpLink</Key>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.ExceptionInfo.Message</Key>
        <Value>Property ResponseQueue was not retrieved when receiving the message. Ensure that the PropertyFilter is set correctly.</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.ExceptionInfo.Source</Key>
        <Value>NServiceBus.Core</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.ExceptionInfo.StackTrace</Key>
        <Value>   at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.ProcessMessage(TransportMessage m) in c:\BuildAgent\work\nsb.master_6\src\impl\unicast\transport\NServiceBus.Unicast.Transport.Transactional\TransactionalTransport.cs:line 312
   at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.ReceiveMessage() in c:\BuildAgent\work\nsb.master_6\src\impl\unicast\transport\NServiceBus.Unicast.Transport.Transactional\TransactionalTransport.cs:line 275
   at NServiceBus.Utils.TransactionWrapper.RunInTransaction(Action callback, IsolationLevel isolationLevel, TimeSpan transactionTimeout) in c:\BuildAgent\work\nsb.master_6\src\utils\TransactionWrapper.cs:line 32
   at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.Process() in c:\BuildAgent\work\nsb.master_6\src\impl\unicast\transport\NServiceBus.Unicast.Transport.Transactional\TransactionalTransport.cs:line 220</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.OriginalId</Key>
        <Value>58dd98f5-9ac0-44fb-8604-3a0f06787a35\295075</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.FailedQ</Key>
        <Value>someservice.processId.distributor.control@testservices01</Value>
    </HeaderInfo>
    <HeaderInfo>
        <Key>NServiceBus.TimeOfFailure</Key>
        <Value>2013-04-30 10:07:40:750707 Z</Value>
    </HeaderInfo>
</ArrayOfHeaderInfo>

Google сообщает нам, что это может быть связано с некоторыми проблемами потоковой передачи и, возможно, даже с тем, как NSB реализован с использованием функции peek / receive.

Вышеупомянутое исключение относится к этому файлу на GitHub: https://github.com/NServiceBus/NServiceBus/blob/master/src/impl/unicast/transport/NServiceBus.Unicast.Transport.Transactional/TransactionalTransport.cs

Подробная информация о нашей реализации:

Мы используем пользовательский IManageUnitsOfWork из-за некоторой устаревшей проблемы, которая означает, что DTC для БД еще нет. Не думаю, что это могло быть причиной, но думаю, что об этом стоит упомянуть. Это реализация:

public class ManagedUnitOfWorkWithDtcSuppression : IManageUnitsOfWork
{
    private readonly IContainer _container;
    private IUnitOfWork _unitOfWork;
    private readonly TransactionScope _scope;

    public ManagedUnitOfWorkWithDtcSuppression()
    {
        _scope = new TransactionScope(TransactionScopeOption.Suppress);
        _container = ObjectFactory.GetInstance<IContainer>();
    }

    public void Begin()
    {
        _unitOfWork = _container.GetInstance<IUnitOfWork>();
    }

    public void End(Exception exception = null)
    {
        if (exception == null)
        {
            _unitOfWork.Commit();
        }

        _unitOfWork.Dispose();
        _scope.Complete();
        _scope.Dispose();
    }
}

Также у нас есть специальная установка, в которой мы запускаем 4 идентичных домена приложений внутри 1 запущенной службы, что означает, что когда мы запускаем службу в качестве дистрибьютора, на самом деле работает 4 дистрибьютора. Но это пр. определения полностью изолированы друг от друга. IBus уникален для каждого домена приложения, это было протестировано.

Конфигурация нашего дистрибьютора выглядит так:

        return NServiceBus.Configure.With()
            .DefineEndpointName(queuePrefix)
            .Log4Net(ObjectFactory.GetInstance<IServiceBusLog>().Build())
            .StructureMapBuilder()
            .JsonSerializer()
            .AsMasterNode()
            .RunDistributorWithNoWorkerOnItsEndpoint()
            .MsmqTransport()
            .IsTransactional(true)
            .DisableTimeoutManager()
            .DisableSecondLevelRetries()
            .UnicastBus()
            .CreateBus()
            .Start(() => NServiceBus.Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());

Вопрос:

Что здесь происходит?

Мы плохо разбираемся в NSB, потому что мы используем подавление DTC, есть ли ошибка MSMQ или ошибка NSB?


person Christian Mikkelsen    schedule 30.04.2013    source источник
comment
На какой это версии NServiceBus?   -  person Udi Dahan    schedule 30.04.2013
comment
Версия 3.3.5 автобуса.   -  person Christian Mikkelsen    schedule 30.04.2013
comment
Единицы работы не учитываются для управляющих сообщений, отправляемых дистрибьютору. Кажется, что-то не так с контрольной очередью или контрольным сообщением, приходящим от рабочего. Можете ли вы запустить один из рабочих процессов и использовать Queue Explorer, чтобы выгрузить управляющее сообщение в файл, чтобы мы могли его просмотреть?   -  person Andreas Öhlund    schedule 01.05.2013
comment
Конечно :). У меня все еще есть сообщения о том, что это произошло в последний раз, и я отправлю их, поскольку я еще не знаю, как воссоздать инцидент. Где вы хотите их получить, в официальном электронном письме службы поддержки NSB, в Dropbox или?   -  person Christian Mikkelsen    schedule 01.05.2013
comment
Одна вещь, которая кажется странной, - это тот факт, что все 3 сообщения об ошибках управления, которые у меня есть, имеют идентичные первые части CorrId (58dd98f5-9ac0-44fb-8604-3a0f06787a35 / XXXXXX), хотя они работают в отдельных доменах приложений в одной и той же службе. . Мы создаем / запускаем шину с помощью StructureMap, и каждая шина имеет уникальный хэш-код в своем домене приложения. Может ли это быть источником проблемы? Есть ли за кулисами отдельный процесс распространения синглтонов, который может вызвать проблемы с нашей настройкой (безумное предположение)?   -  person Christian Mikkelsen    schedule 01.05.2013
comment
Вот ссылка на Dropbox: dropbox.com/sh/m1yu0goswensnhn/IadEuRzQL9   -  person Christian Mikkelsen    schedule 01.05.2013
comment
Был ли когда-нибудь на это ответ?   -  person Andreas    schedule 06.01.2014
comment
Ну вроде как. Мы больше не используем дистрибьютора из-за этой проблемы, среди прочего, и с тех пор не видели этой ошибки. Также у нас есть некоторые основные рабочие нагрузки, которые потребовали от нас установить верхний порог количества сообщений в очередях, который предотвращает дальнейшую обработку до тех пор, пока очередь снова не станет ниже порогового значения. Это означает, что любые ошибки, вызванные стрессом, сведены к минимуму, и тем самым мы могли бы решить проблему, описанную выше. К сожалению, я не могу ответить, как решить эту проблему.   -  person Christian Mikkelsen    schedule 07.01.2014


Ответы (1)


Позвольте мне ответить на год позже! :) Я почти уверен, что вы видите https://github.com/Particular/NServiceBus/pull/2250. В основном Microsoft внесла изменения в реализацию MessageQueue между .NET 3.5 и .NET 4, сделав код NSB небезопасным для потоков. Это было исправлено в https://github.com/Particular/NServiceBus/releases/tag/3.3.10

person janovesk    schedule 20.11.2014