Utilizzo delle code dei messaggi POSIX anziché dei socket TCP: come stabilire la connessione & # 8220; & # 8221 ;?

StackOverflow https://stackoverflow.com/questions/410039

Domanda

Ho programmi client e server che ora comunicano via TCP. Sto invece usando le code dei messaggi POSIX (ovviamente nei casi in cui client e server si trovano sulla stessa macchina). La mia speranza è che migliorerà le prestazioni (in particolare tramite una latenza ridotta).

Ne ho risolto la maggior parte, ma non sono sicuro di una cosa: come stabilire la connessione "quot." Il server accetta connessioni da più client contemporaneamente, quindi sono tentato di emulare il processo di connessione TCP in questo modo:

  1. Il server apre una coda con un nome ben noto e ne legge continuamente (può usare select (2) come con TCP).
  2. Il client apre tre code: due con nomi arbitrari (inclusa una unicità come PID per evitare collisioni) e una con il nome noto utilizzato dal server.
  3. Il cliente pubblica un " connect " messaggio alla coda del server, inclusi i nomi della coda del client (uno è designato per il traffico client-server e l'altro per il contrario).
  4. Il server apre le code indicate nel messaggio di connessione del client e inizia a leggere (selezionare) da quello client-server.
  5. Il client chiude la coda del server con il nome noto. La comunicazione bidirezionale procede utilizzando le due code nominate dal client (una per ogni direzione).

Probabilmente puoi vedere come questo schema è simile al metodo TCP comune e non è un caso. Tuttavia, vorrei sapere:

  1. Riesci a pensare a un modo migliore per farlo?
  2. Vedi potenziali problemi con il mio metodo?
  3. Hai altri pensieri, incluso quello sulla probabilità che l'uso di code di messaggi anziché TCP sullo stesso computer migliorerà effettivamente le prestazioni (latenza)?

Tieni presente che non ho mai usato le code dei messaggi POSIX prima (ho usato IBM WebSphere MQ qualche tempo fa, ma è piuttosto diverso). La piattaforma è Linux.

È stato utile?

Soluzione 2

Ho finito per implementarlo sostanzialmente come ho descritto, con alcuni miglioramenti:

  • Nel passaggio 2, ho usato i GUID per i nomi delle code invece di incorporare il PID del client.
  • Al passaggio 4, ho aggiunto l'invio di un " accetta " messaggio dal server al client.
  • Quando una delle parti desidera terminare la comunicazione, invia una "disconnessione". messaggio.

L'handshaking è più semplice di TCP, ma sembra sufficiente.

Per quanto riguarda la latenza: è molto meglio. Circa il 75% in meno di latenza utilizzando le code dei messaggi POSIX anziché TCP sulla stessa macchina. I miei messaggi sono dell'ordine di 100 byte ciascuno.

Altri suggerimenti

  1.   

    Riesci a pensare a un modo migliore per farlo?

    Forse dai un'occhiata a fifos (aka named pipe). Sono come prese di rete ma per il computer locale. Sono unidirezionali, quindi potrebbe essere necessario crearne due, una per ogni direzione. Alla tua domanda non manca alcun motivo per perché stai apportando questa modifica in modo specifico. Non c'è nulla di sbagliato nell'uso dei socket per elaborare la comunicazione. Sono bidirezionali, efficienti, ampiamente supportati e ti danno la libertà di separare i processi tra le macchine in seguito.

  2.   

    Vedi potenziali problemi con il mio metodo?

    Le code dei messaggi di System V e le pipe con nome Fifo sono entrambe assolutamente perfette. Fifo pipe sono come normali pipe, quindi puoi leggere () e scrivere () con minime modifiche al codice. Le code dei messaggi di System V richiedono l'inserimento dei dati in una struttura e il richiamo di msgsnd (). Tuttavia, entrambi gli approcci andrebbero bene.

  3.   

    Hai altri pensieri, anche riguardo alla probabilità che l'uso di code di messaggi anziché TCP sullo stesso computer migliorerà effettivamente le prestazioni (latenza)?

    Altri miei pensieri sono che, come hai detto, devi sviluppare una tecnica in modo che ogni cliente abbia un identificatore univoco. Un approccio sarebbe quello di aggiungere il pid alla struttura che attraversi o di negoziare un ID univoco con il genitore / master all'inizio. L'altra cosa da notare è che il vantaggio delle code di messaggi di System V è che ascolti "selettivo" messaggi in modo da poter idealmente utilizzare una coda dal server a tutti i client, con ciascun client in attesa di un messaggio diverso.

    Non ho idea di quale tecnica ti offra il throughput più ottimale nel tuo software. Potrebbe non valere la pena usare le code dei messaggi del Sistema V, ma solo tu puoi prendere quella decisione.

Philluminati

Ho confrontato le prestazioni di posix MQ e una coppia di socket TCP / IP.

Il programma demo ha due thread uno per la scrittura e l'altro per la lettura.

Il risultato è che posix MQ è più veloce,

  • MQ 460000 tps
  • socketpair 400000 tps

Ho riscontrato un problema simile, sviluppo un'applicazione in tempo reale e ho bisogno della tecnica IPC con funzionalità simili a socket e latenza minima.

Hai confrontato la tua soluzione basata su POSIX-MQ con solo socket locali UNIX o TCP?

Grazie

Come hai fatto quando select () non funziona sulle code dei messaggi? Cos'è Sys V o POSIX? Perché impegnarsi ulteriormente nella creazione di una tabella di ricerca da GUID a PID quando PID è garantito come unico ed è uno spazio di archiviazione più piccolo (intero)?

/ Blee /

Puoi anche usare Code di messaggi per IPC in programmi che risiedono su macchine diverse, in questi casi puoi usare ZeroMQ ( http: //www.zeromq.org ) o altre API della coda messaggi, ti suggerisco anche di prenderle in considerazione e testarle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top