Восстановить ресурсы после ошибок - PullRequest
1 голос
/ 15 февраля 2012

Я сейчас нахожусь в процессе создания приложения, которое получает тысячи маленьких сообщений через базовый веб-сервис, сообщения публикуются в очереди сообщений (RabbitMQ).Приложение использует Dependancy Injection, используя StructureMap в качестве своего контейнера.

У меня есть отдельное рабочее приложение, которое использует очередь сообщений и сохраняет сообщения в базе данных (SQL Server).

У меня естьреализовал соединения SQL Connection и RabbitMQ как синглтоны (Thread Local).

В идеальном мире все это работает нормально, но если соединение с SQL Server или RabbitMQ разорвано, мне нужно открыть его заново или потенциально удалить и восстановить /переподключите ресурсы.

Я написал базовый класс, который будет действовать как фабрика, которая перед возвратом ресурса проверяет, подключен ли он / открыт / работает, а если нет, утилизирует и воссоздает его - я не уверенесли это «лучшая практика» или я пытаюсь решить проблему, которая уже была решена.

Может кто-нибудь предложить предложения о том, как я могу реализовать долгосрочные задачи, которые выполняют много небольших задач (вв моем случае один оператор INSERT), который не требует создания объекта для каждой задачи, но можетбыстро восстанавливаться после ошибок, таких как потерянные соединения?

Соединения RabbitMQ кажутся дорогими, и во время высоких рабочих нагрузок у меня могут быстро не хватать дескрипторы, поэтому я хотел бы повторно использовать то же соединение (для потока).

Ответы [ 2 ]

0 голосов
/ 15 февраля 2012

Вы можете создать фабрику соединений для RabbitMQ, которая имеет пул соединений. Он будет отвечать за раздачу подключений к задачам. Вы должны проверить, что соединения в порядке. Если нет, запустите новый поток, который закрывает / очищает соединение, а затем возвращает его в пул потоков. Тем временем верните работающее соединение пользователю.

Звучит сложно, но это шаблон для трудной инициализации ресурсов.

0 голосов
/ 15 февраля 2012

Пакет интеграции Enterprise Library 5.0 для Windows Azure содержит блок для временной обработки ошибок.Он позволяет вам определять поведение повторных попыток в случае ошибок.

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

...