2013-07-02 5 views
0

Я использую SQL Server 2008 R2 для подключения к нескольким другим серверам того же типа из триггеров и хранимых процедур. Эти серверы географически распределены по всему миру, и очень важно, чтобы любые ошибки в общении между серверами регистрировались вместе с данными, которые должны были быть отправлены, чтобы сообщение могло быть повторно предпринято позднее. Серверы участвуют в шаблоне Observer с одним из серверов, выступающих в роли наблюдателя, и обработки маршрутизации сообщений между другими серверами.Лучшая практика: обработка ошибок на связанных серверах

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

ответ

0

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

Основная проблема заключается в том, что в случае сбоя связи связанного сервера механизм базы данных вызывает ошибку с серьезностью 20, что достаточно велико, чтобы прервать выполняемую в данный момент партию - минуя любой код обработки ошибок в партии (например, TRY...CATCH).

SQL 2005 и более поздние версии включают процедуру sp_testlinkedserver, которая позволяет проверить наличие связанного сервера перед попыткой выполнить команды, однако это не оборачивается проблемами, возникающими из-за ошибок связи, возникающих во время команды.

Есть несколько более надежных вариантов, которые вы могли бы рассмотреть. Один из них - Service Broker, который предоставляет асинхронную модель очередности сообщений. Это не идеально подходит для шаблона наблюдателя, но функция activation обеспечивает средство для осуществления push-уведомлений из центральной точки. Поскольку вы упоминаете обмен сообщениями, модель беседы, используемая Service Broker, может соответствовать вашим целям.

Другой вариант: transactional replication; это может быть более подходящим, если поток данных осуществляется исключительно от центрального сервера к наблюдателям.

3

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

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

Чтобы избежать этого, мы пытаемся использовать Service Broker, где он реализует логику очередей, в этом случае вы всегда можете вести ведение журнала, а также обеспечивать доставку сообщений независимо от времени простоя сервера (в случае простоя сервера сообщение ожидает, пока оно не будет прочитано).

http://technet.microsoft.com/en-us/library/ms166104%28v=sql.105%29.aspx

Надеется, что это помогает

Смежные вопросы