У меня есть клиентские и серверные программы, которые теперь обмениваются данными через TCP. Вместо этого я пытаюсь использовать очереди сообщений POSIX (в случае, если клиент и сервер находятся на одной машине, конечно). Я надеюсь, что это улучшит производительность (в частности, за счет уменьшения латентности).
Я разработал большую часть этого, но не уверен в одном: как установить "соединение". Сервер принимает соединения от нескольких клиентов одновременно, поэтому у меня возникает соблазн эмулировать процесс установления соединения TCP следующим образом:
- Сервер открывает очередь с известным именем и непрерывно читает ее (он может использовать
select(2)
как с TCP). - Клиент открывает три очереди: два с произвольными именами (включая некоторую уникальность, такую как PID, чтобы избежать коллизий), и один с известным именем, используемым сервером.
- Клиент отправляет сообщение "подключиться" к очереди сервера, включая имена очереди клиентов (один предназначен для трафика между клиентами, а другой для обратного).
- Сервер открывает очереди, указанные в сообщении о подключении клиента, и начинает читать (выбирать) с клиентского сервера.
- Клиент закрывает очередь сервера с известным именем. Двухсторонняя связь продолжается с использованием двух очередей, названных клиентом (по одному для каждого направления).
Вероятно, вы можете увидеть, как эта схема похожа на общий метод TCP, и это не случайно. Однако я хотел бы знать:
- Можете ли вы придумать лучший способ сделать это?
- Вы видите какие-либо потенциальные проблемы с моим методом?
- Есть ли у вас какие-либо другие мысли, в том числе о вероятности того, что использование очередей сообщений вместо TCP на одном компьютере фактически улучшит производительность (латентность)?
Имейте в виду, что я раньше не использовал очереди сообщений POSIX (я использовал IBM WebSphere MQ некоторое время назад, но это было совсем другое). Платформа - это Linux.