запросы на постановку в очередь с помощью службы WCF

#wcf #message-queue

#wcf #очередь сообщений

Вопрос:

У меня есть WCF service , который может получать несколько запросов в минуту (или секунды), которые необходимы для записи информации в базу данных. Вместо того, чтобы записывать это синхронно, я хотел бы поместить эти запросы в какую-то очередь на сервере, чтобы другой процесс мог прийти и обработать их. Клиенту просто нужно подтверждение того, что запрос был получен. Я много читал о MSMQ и WCF etc, но кажется, что с MSMQ вы пишете в очередь с клиента, а не в веб-службу, а это не то, что я хочу.

Есть ли способ выполнить следующее внутри метода WCF, который не использует базу данных. Возможно, я не правильно понял концепцию MSMQ .

  public bool ProcessMessage(string message)
    {
      if(IsValid(message))
       return AddToQueue(message);

      return false;
    }
  

РЕДАКТИРОВАТЬ: мне нужно проверить сообщение перед записью в очередь.

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

1. Есть ли причина, по которой вы не хотите выполнять запись в очередь с клиента?

2. извините, забыл упомянуть, что мне нужно проверить сообщение перед записью в очередь.

Ответ №1:

В настоящее время я делаю это в созданном мной приложении. Служба WCF размещается как HTTP-служба в IIS. Он принимает вызовы и пакеты данных, я беру эти данные, проверяю их (сообщаю вызывающему, что это неправильно или нет), затем отправляю данные в другую службу WCF, которая использует привязку netMSMQ, затем эта служба выполняет окончательную запись в базу данных. Хорошая вещь в этом заключается в том, что он будет стоять в очереди на один MSMQ, а служба WCF, которая привязана к этому MSMQ, выдает по одному сообщению за раз и обрабатывает его. Затем служба HTTP WCF может обрабатывать столько запросов, сколько захочет, и ей не нужно беспокоиться о объединенных сообщениях, поскольку это работа службы, связанной с WCF / MSMQ. Общее название этого шаблона — каркас моста.

ETA: вторая служба (служба WCF, связанная с MSMQ) запускается как служба Windows, которая всегда включена. Он также занимается разделением проблем. Служба HTTP проверяет и не заботится о базе данных, другая служба обрабатывает запись в базу данных.

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

1. нет способа сделать это с помощью одной службы WCF?

Ответ №2:

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

Ваша служба вообще не должна поддерживать очередь, если вы настроили это правильно.

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

1. ну, я не хочу обязательно использовать MSMQ, подойдет какой-нибудь другой механизм постановки в очередь, который работает для того, что я хочу. Я не хочу ставить какую-либо зависимость от клиента для MSMQ. Клиент должен знать только о службе WCF, поскольку это может быть любая платформа. Кроме того, проверка сообщения перед записью в очередь становится сложной задачей.

2. Мне действительно нравится ответ Марка W. Я думаю, может быть, это то, что вы действительно ищете … отделите проверку от очереди. Принцип единой ответственности и все такое. 🙂

3. Поддерживается ли MSMQ по-прежнему? Я чувствую, что это более старая технология, которая больше не используется. Этот шаблон действительно помог бы моей команде в усилиях, которые мы пытаемся выполнить. Мы хотим, чтобы наш веб-сервис принимал запросы, и мы хотим, чтобы наш брокер получал доступ к базе данных и обновлял ее для этих запросов, нам трудно найти потокобезопасный способ сделать это.

4. Честно говоря, я не уверен. Я ответил на это еще в 2011 году. Я был выключен . Сетевой стек уже несколько лет.