#wcf #queue #msmq
#wcf #очередь #msmq
Вопрос:
Мне нужно предложение по дизайну очереди для моей службы WCF. Итак, у меня есть служба wcf и множество клиентов. Клиенты генерируют сообщения и помещают их в очередь для обработки моей службой. Служба обрабатывает их асинхронно, и клиентам не требуется обратный вызов или ответ при помещении сообщения в очередь.
Моей службе необходимо удалить сообщение из очереди для обработки несколькими потоками. Но если моя служба остановится или произойдет сбой, или сервер завершит работу немедленно — эта служба должна повторно обработать сообщение, которое не завершило обработку.
Итак, я рассматриваю реализацию очереди msmq. Msmq позволяет мне создать хорошую очередь, но как реализовать это требование: повторно обработать сообщение, которое не было обработано до конца?
Может быть, кто-нибудь даст мне другое выгодное предложение. Спасибо за любую помощь.
Комментарии:
1. Если служба останавливается, сообщения должны оставаться в очереди и обрабатываться при ее повторном запуске, разве этого не происходит? Если да, то как вы размещаете процесс WCF, который считывает MSMQ?
2. Но возможно ли, чтобы служба принимала сообщение из очереди и начинала обработку. В то же время другой обрабатывающий поток берет другое сообщение из очереди для обработки и запускает процесс. Затем мы завершаем процесс обслуживания, и после перезапуска он может обнаружить, что 2 элемента в очереди не обработаны?
3. Каждый поток должен быть вовлечен в транзакцию, поэтому оба сообщения должны быть там. Альтернативой является создание нескольких процессов, которые указывают на одну и ту же очередь, вместо того, чтобы иметь много потоков. Это шаблон «Конкурирующего потребителя», который возможен с использованием MSMQ 4.
Ответ №1:
Ключевым моментом здесь является то, какая серверная ОС запущена на компьютере, на котором размещена ваша служба. Если вы используете Server 2008 (или Vista технически), то вы можете воспользоваться преимуществами автоматической обработки сообщений об ошибках MSMQ 4. Это автоматически удаляет сообщение из очереди в специальную очередь заражения, чтобы служба могла продолжить обработку сообщений. В MSMQ 3 вы должны были сделать это в своем коде. Эта статья о MSDN должна стать хорошим началом, и в этой статье показан код обработки нежелательных сообщений.
Я не вижу, что вам нужно беспокоиться о многопоточности вашего кода службы. Если вам нужна высокая пропускная способность, тогда используйте кластеризованные серверы MSMQ и службы WCF с балансировкой нагрузки, это намного надежнее, чем пытаться выполнить свой собственный многопоточный код на основе MSMQ.
Ответ №2:
Итак, наконец, я выбираю транзакции в MSMQ и передаю объект транзакции потоку для потокобезопасной работы с MSMQ. Это довольно быстро.