Проблема с производительностью веб-сервиса

StackOverflow https://stackoverflow.com/questions/400413

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть простой веб-сервис asmx, которому просто нужно записать некоторую информацию в транзакционную базу данных.Однако для клиента истекает время.Вызов для обновления базы данных вызывает всего лишь одну хранимую процедуру, и я не верю, что ее можно оптимизировать для повышения производительности.Мне пришлось просто регистрировать запуск с помощью log4net, а затем читать журнал с помощью отдельного процесса, который обновляет базу данных.

Мне было интересно, есть ли лучший способ сделать это.Мне было интересно, есть ли способ заставить мой код делать что-то вроде:

public bool method(...)
{
  LogRun(...)

  Asynchronously call method to insert transaction

  return true;  
}
Это было полезно?

Решение

РЕДАКТИРОВАТЬ: Я ошибался насчет BackgroundWorker.Поэтому я поменял его на версию Thread, протестировал.

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

public class Service1 : System.Web.Services.WebService
{

    [WebMethod]
    public void Log(int foo, int bar)
    {
        Thread a = new Thread(new ThreadStart(delegate()
        {
            // Do some processing here
            // For example, let it sleep for 10 secs
            Thread.Sleep(10000);
        }));
        a.Start();
    }
}

Для завершения обработки метода Log потребуется 10 секунд, если строка Thread.Sleep(10000) находится в самом методе Log.Однако с Нить А, Метод Log вернет результат сразу после вызова.

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

Другие советы

Одна вещь, которую вы можете попробовать, это Отслеживание.

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

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

Хотя вы можете рассмотреть выполнение асинхронных операций внутри вашего веб-метода, вы работаете с потоками и/или пулом потоков внутри asp.net, где уже используются многопоточные операции.Хотя это технически осуществимо, вы также можете непреднамеренно лишить систему ресурсов, поскольку httpruntime управляет ресурсами при обслуживании запросов к вашей службе.

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

Если для клиента это просто вызов «запустил и забыл», ваш веб-сервис может просто добавить детали в очередь и вернуть клиенту.Я использовал MSMQ для реализации чего-то похожего на то, что вы описываете.Это не исправляет тайм-аут базы данных, но убирает сообщение об ошибке от ваших клиентов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top