#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 году. Я был выключен . Сетевой стек уже несколько лет.