NServicebus, размещенный в рабочей роли Azure, не работает

Я, вероятно, упускаю что-то очевидное в этой проблеме, но я не могу развернуть конечную точку в качестве рабочей роли Azure для работы в производственной среде; он отлично работает под локальным эмулятором Azure.

Вот шаги, которые я предпринял, чтобы воспроизвести эту проблему, используя один из примеров проектов, поставляемых с образцами nservicebus:

  1. загруженные образцы из сборки 3.2.8.
  2. Использовали пример AzurePubSub и изменили конфигурацию в веб-роли и рабочей роли, чтобы использовать фактическое расположение хранилища, а не локальное хранилище разработки.
  3. Запуск локально с помощью эмулятора локальных вычислений, чтобы убедиться, что веб-роль и рабочая роль работают должным образом.
  4. Развернут в производственной среде. веб-роль работает и помещает сообщения в очередь, как и ожидалось, но рабочая роль не обрабатывает сообщение.

исключений нет, и рабочая роль развертывается и запускается, как и ожидалось; он просто не обрабатывает сообщения.

Я надеюсь, что мне не хватает чего-то простого, и кто-то сталкивался с этой проблемой раньше.

Обновление: я вижу, что приведенная ниже запись журнала находится в журнале событий роли. Является ли проблема просто тем, что профиль ведения журнала по умолчанию пытается получить доступ к 127.0.0.1:10000?

Вот профиль, который настроен для использования в образце:

NServiceBus.Production NServiceBus.OnAzureTableStorage NServiceBus.WithAzureStorageQueues

А вот и полная запись в журнале событий:

An unhandled exception occurred. Type: System.Exception Process ID: 2512
Process Name: WaWorkerHost
Thread ID: 6
AppDomain Unhandled Exception for role OrderService_IN_0
Exception: Exception when starting endpoint, error has been logged. Reason: Unable to connect to the remote server
   at NServiceBus.Hosting.GenericHost.Start()
   at NServiceBus.Hosting.Azure.RoleEntryPoint.Run()
   at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRoleInternal()
   at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.<StartRole>b__1()
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Inner Exception: Unable to connect to the remote server
   at Microsoft.WindowsAzure.Diagnostics.Management.RoleInstanceDiagnosticManager.<.ctor>b__2(Object sender, ErrorEventArgs args)
   at Microsoft.WindowsAzure.Diagnostics.ControlChannel.GetControlContainer()
   at Microsoft.WindowsAzure.Diagnostics.ControlChannel.set_StartupInfo(DiagnosticMonitorStartupInfo value)
   at Microsoft.WindowsAzure.Diagnostics.Management.RoleInstanceDiagnosticManager..ctor(CloudStorageAccount storageAccount, String deploymentId, String roleName, String roleInstanceId)
   at NServiceBus.Integration.Azure.AzureAppender.ConfigureAzureDiagnostics()
   at NServiceBus.SetLoggingLibrary.Log4Net(Configure config, Object appenderSkeleton)
   at NServiceBus.SetLoggingLibrary.Log4Net[TAppender](Configure config, Action`1 initializeAppender)
   at System.Collections.Generic.List`1.ForEach(Action`1 action)
   at NServiceBus.Hosting.Profiles.ProfileManager.ActivateProfileHandlers()
   at System.Collections.Generic.List`1.ForEach(Action`1 action)
   at NServiceBus.Configure.Initialize()
   at NServiceBus.Hosting.GenericHost.Start()

Inner Exception: No connection could be made because the target machine actively refused it 127.0.0.1:10000
   at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)

Обновление – решение. Проблема заключалась в том, что в примере проекта, который я использовал в качестве базового, использовалось старое имя идентификатора строки подключения "Diagnostics.ConnectionString", а приложение NServiceBus Azure Logging Appender искало более новый идентификатор Azure. который обозначает место хранения диагностических данных «Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString». Переименование идентификатора решило проблему.


person chutch    schedule 04.10.2012    source источник


Ответы (1)


Я автор поддержки Azure в nservicebus. Позвольте мне помочь вам разобраться, что-то должно пойти не так, и есть несколько способов выяснить, что именно.

  1. Войдите в рабочий процесс с помощью RDP и проверьте журнал событий компьютера на наличие каких-либо исключений, исходящих от вашего рабочего процесса.
  2. Разверните с помощью средства диагностики Windows Azure и проверьте журналы, записанные в хранилище таблиц.
  3. Разверните с помощью intellitrace и загрузите трассировки стека из рабочего процесса, чтобы выполнить сеанс удаленной отладки.
person Yves Goeleven    schedule 04.10.2012
comment
Добавлена ​​трассировка стека из журнала событий. Похоже, что профиль ведения журнала по умолчанию пытается войти в локальное хранилище. Это верное предположение? - person chutch; 04.10.2012
comment
Да, похоже, что диагностика пытается получить доступ к хранилищу разработки. Можете ли вы добавить параметр в csdef и cscfg для Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString и указать его на свою учетную запись хранения? Это должно исправить это. - person Yves Goeleven; 04.10.2012
comment
Для Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString уже указано место хранения. Я также попытался полностью удалить журнал диагностики. Итак, вы думаете, что вызов NServiceBus.Integration.Azure.AzureAppender.ConfigureAzureDiagnostics() в трассировке стека зачисляется с использованием строки подключения диагностики azure? - person chutch; 04.10.2012
comment
Да, приложение Azure использует строку подключения диагностики Azure, если она доступна, а в противном случае по умолчанию используется devstorage. См. github.com /NServiceBus/NServiceBus/blob/3.2.8/src/azure/. Похоже, он не может найти строку подключения в конфигурации. - person Yves Goeleven; 04.10.2012
comment
PS: использование профиля разработки приведет к регистрации в консоли вместо хранилища разработки, настройка, которая фактически отключит ведение журнала. - person Yves Goeleven; 04.10.2012
comment
интересный. не уверен, что это изменение с 1.7, но включение диагностики создаст запись в csdef с именем Diagnostics.ConnectionString, которая отличается от того, что ищет приложение (и то, что раньше создавалось, когда диагностика была выбрана в конфигурации Azure ) Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString Я изменю его на полное имя конфигурации и посмотрю, решило ли это проблему. - person chutch; 04.10.2012
comment
Это ключ, который использовался еще на заре лазури, я полагаю, что SDK и инструменты версии 1.3 и ранее. - person Yves Goeleven; 04.10.2012
comment
да. Спасибо за помощь! Оглядываясь назад, я думаю, что меня сбило с толку то, что я начал с примера проекта, в котором используется более старый Diagnostics.ConnectionString (строки 22 и 41 файла csdef примера). Удаление этих строк и добавление новых соглашений решило проблему. - person chutch; 05.10.2012
comment
Я проверю и удостоверюсь, что они удалены из выборки, они больше недействительны. - person Yves Goeleven; 05.10.2012