HTTP-шлюз Rebus и состояние работоспособности MSMQ

Допустим, у нас есть

  • Клиентский узел с исходящим сервисом HTTP-шлюза
  • Серверный узел с входящим сервисом HTTP-шлюза

Я рассматриваю ситуацию, когда MSMQ сам по какой-то причине останавливается на клиентском узле. В текущей реализации HTTP-шлюз Rebus поймает исключение.

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

Поэтому без дополнительной инфраструктуры сервер знал бы, что у клиента есть проблема, чтобы кто-то мог отреагировать.

ОБНОВИТЬ:

Я предположил, что проблемы, описанные в ответе, будут подняты. Я должен был объяснить свой сценарий глубже:) Извините. Вот:

Я собираюсь изменить шлюз HTTP таким образом, чтобы InboundService мог выполнять и отправку, и получение сообщений. Таким образом, OutboundService будет единственным, кто инициирует соединение (периодически, например, раз в 5 минут), чтобы получать новые сообщения от сервера и отправлять свои сообщения на сервер. Это связано с тем, что клиентский узел рассматривается не как сервер, а как один из многих клиентов, которые находятся за NAT.

Действительно, сам сервер не заинтересован в работоспособности клиента, но я подумал, что вместо создания отдельной службы оповещений на стороне клиента, которая будет использовать код HTTP-шлюза HTTP-шлюза, это может сделать сама шлюза HTTP, так как для шлюза HTTP вполне достаточно иметь оба Стороны бегут.

Что делать, если клиент вообще не может связаться с сервером?

Поскольку MSMQ был бы мертв, я подумал об использовании автономного объекта постоянной очереди в процессе работы, такого как http://ayende.com/blog/4540/building-a-managed-persistent-transactional-queue(просто пример реализации, я не уверен, какая у него лицензия) для агрегации исключений на стороне клиента, пока сервер не будет доступен.

И как часто клиент будет уведомлять сервер, на котором произошла ошибка?

Я не уверен насчет этой части - я думал, что это может быть связано с запланированным временем синхронизации сообщений, например, раз в 5 минут, но что в случае, если не будет запланированного времени, как в текущей реализации (while(true) loop)? Может быть, это может быть просто установлено в конфигурации?

Мне нравится иметь последовательную стратегию обработки ошибок, которая обычно включает в себя простую старую регистрацию NLog

Поскольку клиентские узлы будут находиться в Интернете за NAT, стандартные методы мониторинга работать не будут. Я думал об использовании очереди в качестве транспорта NLog, но, поскольку MSMQ будет мертвым, он не будет работать.

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

ОБНОВЛЕНИЕ2: HTTP как транспорт NLog (под транспортом я имею в виду цель) также потребует очереди на стороне клиента, как я описал в "Что, если клиент вообще не может добраться до сервера?" раздел. Это был бы клон HTTP-шлюза, встроенного в NLog. Безумие:)

Все дело в том, что клиент ненадежен, поэтому я хочу, чтобы вся информация о клиенте была на стороне сервера, и регистрировал ее там.

Update3

Альтернативным решением может быть создание отдельной службы, которая, однако, будет частью шлюза HTTP (например, OutboundAlertService). Тогда будут выполнены три цели:

  • общий код отправки цикла
  • не требуется дополнительная инфраструктура сервера
  • не оказывает негативного влияния на OutboundService (без сложностей добавления в него очереди в процессе)

Он не будет принимать исключения из OutboundService, но вместо этого сам будет проверять MSMQ.


Еще одно альтернативное решение - просто использовать очередь, отличную от MSMQ, в качестве цели NLog, но это ужасно излишне.

1 ответ

Решение

Что касается вашего сценария, я изначально думал, что на сервере никогда не должно быть проблемы с клиентом, поэтому я, вероятно, не отправлю сообщение на сервер, если клиент потерпит неудачу.

На мой взгляд, при таком подходе возникнет множество проблем / препятствий / проблем, потому что, например, что если клиент вообще не сможет получить доступ к серверу? И как часто клиент будет уведомлять сервер, на котором произошла ошибка?

Конечно, я не знаю деталей вашей настройки, поэтому трудно дать конкретный совет, но в целом мне нравится иметь последовательную стратегию обработки ошибок, которая обычно включает в себя простую старую регистрацию NLog и настройку уровней WARN и ERROR, чтобы перейти к Журнал событий Windows.

Это позволяет настраивать различные инструменты (например, Service Center Operations Manager или аналогичные) для мониторинга журналов событий всех ваших машин, чтобы поднять флаги ошибок, когда что-то идет не так.

Я надеюсь, что я сказал что-то, что вы можете использовать:)

ОБНОВИТЬ

Подумав об этом еще немного, я думаю, что начинаю понимать вашу проблему, и я думаю, что я бы предпочел решение, где клиент позволяет HTTP-слушателю на другом конце узнать, что у него есть проблема, а затем HTTP-слушателю. на другом конце может (может быть?) записать это как ошибку.

Другой вариант заключается в том, что прослушиватель HTTP на другом конце может иметь событие, ReceivedClientError или что-то, к чему можно присоединиться, а затем делать все, что правильно в данной ситуации.

В вашем случае вы можете поместить сообщение в очередь ошибок. Я бы просто не стал помещать что-либо в очередь ошибок в качестве общего решения, потому что я думаю, что это сбивает с толку назначение очереди ошибок - "вещь" в очереди ошибок не будет сообщением, и поэтому не будет повторяться и т. Д.,

Другие вопросы по тегам