Я выбираю один из двух вариантов клиент-серверного приложения —
Первый — перейдите на подход TCP / IP (на основе чистых сокетов) с многопоточным сервером и управляйте синхронизацией отправки и получения самостоятельно.
Второе — использование и подход WebSphere MQ (MQI). В основном одна входная очередь и одна выходная очередь для сервера. Клиенты записывают во входную очередь сервера, а сервер помещает ответ в выходную очередь с некоторым идентификатором корреляции и т. Д. Таким образом, требуется только 2 очереди. Программа сервера многопоточная (пулы потоков), и несколько потоков будут читать входную очередь и записывать в нее очередь вывода.
Вопрос — я склоняюсь ко второму подходу, но у меня мало сомнений —
MQI-вызовы безопасны для потока? Должен ли я использовать какое-то взаимное исключение для MQGET
а также MQPUT
для очередей.
Будет ли производительность подхода на основе MQ ниже, чем на основе сокетов. Под производительностью я подразумеваю две вещи.
а. Работает ли очередь IBM MQ медленнее, чем прямые соединения с сокетами в целом?
б. Будет ли взаимное исключение блокируется на MQGET
а также MQPUT
замедлить обработку сообщений?
с. Я планирую загружать около 10000 сообщений в секунду (каждое около 100 байт). Ответы будут около 5 КБ (сообщения XML). Это практическая нагрузка для подхода, основанного на IBM MQ?
Примечание. Язык C ++, а операционной системой для сервера является Solaris.
Вариант использования, который вы описываете, невероятно узок. Это не просто случай «сокетов или очередей», но другие факторы должны учитывать бизнес-ситуацию:
Бизнес-кейс должен учитывать гораздо больше, чем просто скорость. Это особенно верно, когда обе альтернативы способны удовлетворить требование пропускной способности, как и должно быть здесь. Как только функциональные требования соблюдены, все эти другие аспекты (и еще больше я не задумывался над этим) должны быть рассмотрены в бизнес-случае.
Что касается конкретных вопросов …
Доступ к очередям управляется так, как вы надеетесь. Несколько потоков конкурируют за одни и те же сообщения, но сообщение, доставленное одному, не доставляется другому потоку. Исключения составляют случаи, когда сообщение откатывается и снова становится доступным, или приложение использует pub / sub и намеренно получает более одной копии сообщения.
На стороне приложения вызовы являются потокобезопасными в течение сеанса. Так что все потоки используют один и тот же сеанс COMMIT
все вместе. Обычно пара потоков, использующих запрос / ответ, работает совместно. В противном случае один сеанс на поток дает вам то, что вам нужно.
Что касается производительности, это сравнение яблок с апельсинами. Вопрос состоит в том, выполняет ли программа сокетов C ++, которая предоставляет все службы, диагностику, отказоустойчивость и другие функции асинхронного транспорта обмена сообщениями, наравне с этим транспортом. Ответа обычно нет. WMQ был оптимизирован в течение 20 лет, чтобы делать что-то одно и делать это очень хорошо. Новая пользовательская программа сокетов C ++ будет перемещать данные быстрее, но не будет обеспечивать ту же функциональность. Таким образом, все сводится к тому, нужно ли приложению настолько мало функциональности WMQ, что в конечном итоге дешевле будет настраивать код для нескольких необходимых функций, а затем поддерживать их на протяжении всего срока службы приложения. Опять же, ответ обычно нет.
Подробнее о пропускной способности сообщений см. SupportPacs найдите и найдите те, чьи имена начинаются с MP__, для нужной платформы и версии. Достижение 10k MPS для небольших сообщений возможно даже на скромном оборудовании.
Других решений пока нет …