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

#c# #error-handlin& #connection #inte&ration-testin& #ems

#c# #обработка ошибок #подключение #интеграция-тестирование #ems

Вопрос:

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

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

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

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

Ответ №1:

Множественные подключения к разным источникам, звучит как хорошее решение для системы.Транзакции (если EMS поддерживает это).

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

         try
        {
            usin& (TransactionScope tran = new TransactionScope())
            {
                Method1Save(); //DB
                Method2Save(); //EMS1
                Method3Save(); //EMS2
                tran.Complete();
            }
        }
        catch (Exception ex)
        {
            Messa&eBox.Show("Problem "   ex.ToStrin&());
        }
  

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

Комментарии:

1. Я уже использую TransactionScope. Позвольте мне привести вам пример. Мы считываем данные из БД. Допустим, у нас есть 500 записей, мы запускаем 5 потоков для обработки данных и отправки в EMS. Что нам делать, если EMS не удалось принять сообщение, либо очередь заполнена, либо какие-то проблемы с подключением, перезапустить приложение или подождать некоторое время и повторить попытку? Если повторить попытку, сколько раз, а также как насчет других потоков, если мы уже знаем о ее сбое, позволим ли мы другим потокам попробовать отправить сообщение или позволим всем потокам подождать некоторое время и повторить попытку?

2. другой случай. Если мы хотим обновить статус до БД, это сообщение отправляется успешно или с ошибкой. Что произойдет, если мы отправили сообщение в EMS, но не можем обновить BCO базы данных, вызывающие проблему. Разрешаем ли мы отправлять другие сообщения в EMS или ждем, пока соединение с БД не будет разрешено, bcos, если статус не обновлен, тогда он попытается снова отправить то же сообщение, которое мы уже отправляли.

3. @Bunny — При сбое потока, возможно, установите пороговое значение для количества сбойных потоков, прежде чем отменять все остальные потоки. Вы не хотите останавливаться при небольшом сбое (можете просто повторно поставить сбой в очередь), но если база данных не работает, нет необходимости беспокоить ее. Кроме того, вы могли бы более внимательно изучить ошибку базы данных и посмотреть, разделяют ли ошибки подключения по сравнению с ошибками отсутствия подключения.

4. @Bunny — Если вы отправили сообщение в BMS, а БД не работает, то вам необходимо сохранить сообщение во временном хранилище до тех пор, пока БД не будет восстановлена. Возможно, это находится в памяти или сохранено в файловой системе в виде XML или другого формата. Затем, как только база данных будет восстановлена, вам следует сначала обработать отправленные сообщения во временном хранилище, прежде чем обрабатывать какие-либо новые сообщения. В принципе, вам понадобится вторичная система хранения для обработки этого случая, чтобы временно удерживать сообщение до тех пор, пока его не удастся сохранить в БД.

5. Я должен отправлять сообщения в 2 очереди EMS. Допустим, первая очередь отключена, а вторая очередь работает. Если количество потоков равно 3. Все 3 потока отправляют сообщение в первую очередь, которая не работает. Я использую вторичное хранилище, но это только для сообщений с ошибкой, а сообщения с ошибкой повторяются в другом потоке, который является однопоточным для поддержания порядка. Таким образом, каждый раз, когда выполняется какое-либо EMS, обрабатываются все остальные EMS-сообщения. Когда все сообщения завершены, мы получаем новые сообщения, кроме сообщений с ошибкой, поскольку ит-отдел должен сначала обработать сообщения с ошибкой.