Проблема производительности веб-службы - PullRequest
1 голос
/ 30 декабря 2008

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

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

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

  Asynchronously call method to insert transaction

  return true;  
}

Ответы [ 5 ]

0 голосов
/ 30 декабря 2008

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

0 голосов
/ 30 декабря 2008

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

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

0 голосов
/ 30 декабря 2008

РЕДАКТИРОВАТЬ: Я был неправ насчет 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. Однако при Thread a метод Log будет возвращен сразу после вызова.

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

0 голосов
/ 30 декабря 2008

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

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

0 голосов
/ 30 декабря 2008

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

...