Как справиться с проблемами, когда невозможно установить соединения (ни с БД, ни с внешними системами), когда доступно несколько соединений

У меня есть вопрос относительно обработки нескольких соединений. Эти соединения могут быть либо соединением с БД, соединением SOA, соединением EMS и т. д......

Допустим, у меня есть 1 соединение с базой данных, где я извлекаю данные, и у меня есть 2 соединения EMS, оба имеют разные данные и независимы. Данные отправляются в EMS и обновляют статус независимо от того, успешно отправлены данные или нет.

1) Если соединение с базой данных не работает или возникли какие-либо другие проблемы, когда мы не можем получить доступ к базе данных. 2) Любое 1 соединение EMS не работает, приложение должно продолжить обработку другого соединения EMS. 3) Что произойдет, если мы сможем отправить данные в EMS, но не сможем обновить статус БД из-за проблем с базой данных, что мы должны делать со всеми сообщениями, которые находятся в памяти и которые нам нужно отправить в EMS. 4) Не удается установить соединение с 1 EMS, но другие смогли установить, поэтому приложение должно обрабатывать эти сообщения EMS.

Вот некоторые из тестовых случаев -ve, которые мне приходится обрабатывать. Пожалуйста, не стесняйтесь, дайте мне знать, если мне нужно решить какие-либо другие проблемы.


person Naveen Chakravarthy    schedule 12.04.2011    source источник


Ответы (1)


Несколько подключений к разным источникам звучит как хорошее решение для System.Transactions (если EMS поддерживает это).

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

        try
        {
            using (TransactionScope tran = new TransactionScope())
            {
                Method1Save(); //DB
                Method2Save(); //EMS1
                Method3Save(); //EMS2
                tran.Complete();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Problem " + ex.ToString());
        }

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

person Jon Raynor    schedule 12.04.2011
comment
Я уже использую TransactionScope. Позвольте мне привести вам пример. Читаем данные из БД. Допустим, у нас есть 500 записей, мы запускаем 5 потоков для обработки данных и отправки в EMS. Что нам делать, если EMS не может принять сообщение, либо очередь заполнена, либо какие-то проблемы с подключением, нужно ли нам перезапустить приложение или подождать или некоторое время и повторить попытку. Если повторить попытку, сколько раз, а также как насчет других потоков, если мы уже знаем, что это не удалось, позволим ли мы другим потокам попытаться отправить сообщение или пусть все потоки подождут некоторое время и попытаются снова. - person Naveen Chakravarthy; 12.04.2011
comment
другой случай. Если мы хотим обновить статус в БД, это сообщение будет отправлено успешно или не удалось. Что произойдет, если мы отправили сообщение в EMS, но не можем обновить BCO проблемы БД. Разрешаем ли мы отправку других сообщений в EMS или ждем, пока соединение с БД будет разрешено, потому что, если статус не обновлен, он попытается снова отправить то же сообщение, которое мы уже отправили. - person Naveen Chakravarthy; 12.04.2011
comment
@Bunny - Для сбоя потока, возможно, установите порог количества сбоев потока, прежде чем отменять все остальные потоки. Вы не хотите останавливаться, если есть небольшой всплеск (можно просто повторно поставить в очередь сбой), но если база данных не работает, нет необходимости приставать к ней. Кроме того, вы можете более внимательно изучить ошибку базы данных и посмотреть, разделяют ли ошибки соединения по сравнению с ошибками отсутствия соединения. - person Jon Raynor; 12.04.2011
comment
@Bunny - Если вы отправили сообщение в BMS, а БД не работает, вам нужно сохранить сообщение во временном хранилище, пока БД не будет восстановлена. Возможно, это находится в памяти или сохраняется в файловой системе в виде XML или другого формата. Затем, после резервного копирования базы данных, вы сначала обработаете отправленные сообщения во временном хранилище, прежде чем обрабатывать любые новые сообщения. В основном вам потребуется дополнительная система хранения для обработки этого случая, чтобы временно удерживать сообщение, пока оно не будет сохранено в БД. - person Jon Raynor; 12.04.2011
comment
Мне нужно отправить сообщения в 2 очереди EMS. Допустим, первая очередь не работает, а вторая очередь работает. Если количество потоков равно 3. Все 3 потока отправляют сообщение в первую очередь, которая не работает. Я использую вторичное хранилище, но это только для неудачных сообщений, а неудачные сообщения повторяются в другом потоке, который является однопоточным для поддержания порядка. Таким образом, каждый раз, когда выполняется какое-либо EMS, обрабатываются все остальные сообщения EMS. Когда все сообщения обработаны, мы получаем свежие сообщения, за исключением сообщений с ошибками, потому что сначала необходимо обработать сообщения с ошибками. - person Naveen Chakravarthy; 12.04.2011