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
или что-то, к чему можно присоединиться, а затем делать все, что правильно в данной ситуации.
В вашем случае вы можете поместить сообщение в очередь ошибок. Я бы просто не стал помещать что-либо в очередь ошибок в качестве общего решения, потому что я думаю, что это сбивает с толку назначение очереди ошибок - "вещь" в очереди ошибок не будет сообщением, и поэтому не будет повторяться и т. Д.,