2016-12-15 19 views
0

У меня есть приложение .NET, использующее EasyNetQ для прослушивания событий, опубликованных из другого приложения. Приложение использует SignalR для публикации полученных событий на приборной панели.Несколько подписчиков easymq

Я использую развертывание octopus для развертывания приложения, и проблема в том, что каждый раз, когда развертывается новая версия приложения, я прекращаю принимать все сообщения, отправленные на шине (кажется, что я получаю некоторые из них, но не все) , Я читал о наличии нескольких подписчиков с одинаковым идентификатором, и я предполагаю, что это проблема.

Как я должен справиться с этим, чтобы избежать «потери» сообщений?

И как я могу запускать разные экземпляры одного и того же приложения (например, несколько разработчиков, работающих с одним и тем же экземпляром mq-кролика), и все клиенты, получающие все сообщения?

ответ

1

Если у вас несколько интерфейсных экземпляров, и вы хотите использовать EasyNetQ в качестве «объединительной платы» для SignalR, убедитесь, что идентификаторы подписчика (= имена очередей) уникальны для каждого экземпляра.

Для серверов IIS с балансировкой нагрузки вы можете, например, указать имя машины, или если вы действительно хотите пропустить наименьшее количество сообщений, вы можете включить идентификатор процесса. (с IIS может быть несколько процессов, активных для одного и того же AppPool, например, при переработке).

Я всегда устанавливал TTL для очереди на что-то вроде 5 минут, поэтому вы не попадаете в очереди с сиротами.

Вы можете установить TTL для очереди, указав WithExpires по подписке, так что-то вроде этого:

var subscriptionId = $"{Environment.MachineName}[{Process.GetCurrentProcess().Id}]-mymessage"; 
    Bus.Subscribe<MyMessage> 
    (
     subscriptionId, 
     message => Console.WriteLine(message.ToString()), 
     subscriptionConfig => subscriptionConfig 
      .WithExpires((int)5.Minutes().TotalMilliseconds) 
    ); 

Там Похожая перегрузки, когда вы используете AutoSubscriber

+0

Интересно. Возможно, я поеду с каким-то конкретным идентификатором машины. Что касается TTL, как бы вы установили его с помощью EasyNetQ? И каков будет результат? Будет ли удалена очередь после некоторого времени простоя или она будет автоматически удалена через 5 минут? И как бы я справился с этим в своем приложении? – martenolofsson

+0

Добавлен образец, надеюсь, что это поможет –

+0

Замечательно, спасибо! – martenolofsson