Using POSIX message queues instead of TCP sockets - how to establish “connection”?

扶醉桌前 提交于 2019-12-03 02:08:40
Philluminati
  1. Can you think of a better way to do it?

    Perhaps have a look at fifos (aka named pipes). They are like network sockets but for the local machine. They are uni-directional so you might need to create two, one for each direction. Your question does lack any reason of why you are making this change specifically. There is nothing wrong with using sockets for process to process communication. They are bi-directional, efficient, widely supported and do give you the freedom to separate the processes between machines later.

  2. Do you see any potential problems with my method?

    System V message queues and fifo named pipes are both absolutely fine. Fifo pipes are like regular pipes so you can read() and write() with minimal code changes. System V message queues require putting the data into a structure and invoking msgsnd(). Either approach would be fine however.

  3. Do you have any other thoughts, including about the likelihood that using message queues instead of TCP on the same machine will actually improve performance (latency)?

    My other thoughts are that as you said, you need to develop a technique so each client has a unique identifier. One approach would be to add the pid to the structure you pass across or to negotiate a unique id with the parent / master at the beginning. The other thing to note is that the benefit of System V message queues are that you listen for "selective" messages so you could ideally use one queue from the server to all the clients, with each client waiting for a different message.

    I have no idea about which technique gives you the most optimal throughput in your software. It really might not be worth using System V message queues but only you can make that decision.

Philluminati

I ended up implementing it basically as I described, with a few enhancements:

  • In step 2, I used GUIDs for the queue names instead of incorporating the client's PID.
  • In step 4, I added the sending of an "accept" message from server to client.
  • When either side wishes to end communication, it sends a "disconnect" message.

The handshaking is simpler than TCP, but seems sufficient.

As for latency: it's much better. Roughly 75% less latency using POSIX message queues instead of TCP on the same machine. My messages are on the order of 100 bytes each.

lxyfirst

I compared the performance of posix MQ and a pair of TCP/IP sockets.

The demo program has two threads one for writing and the other for reading.

The result is that posix MQ is faster,

  • MQ 460000 tps
  • socketpair 400000 tps

I've met similar issue, I develop real-time application and need IPC technique with similar to sockets functionality and minimal latency.

Have you compared your POSIX-MQ based solution with UNIX local sockets or TCP sockets only?

Thanks

How did you do this when select() doesn't work on message queues? Whats it Sys V or POSIX? Why take the extra effort in creating GUID to PID lookup table when PID is guaranteed to be unique, and is smaller storage (integer)?

/blee/

You can also use Message Queues for IPC in programs that reside on different machines, in such cases you can use ZeroMQ(http://www.zeromq.org) or other message queue APIs, i also suggest you to consider them, and test them too.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!