Sto scrivendo un'applicazione su x86_64 CentOS 7 che funziona come un server, gestendo potenzialmente migliaia di dispositivi. Perché la mia applicazione non funziona bene quando si esegue il processo di connessione (vari handshaking a livello di applicazione, operazioni DB, ecc.) Ed è concepibile che migliaia di dispositivi potrebbero venire online contemporaneamente, voglio prova la connessione che limita la frequenza accetta (come possibile approccio "cura alla fonte" ai miei problemi di scala).
In breve, le connessioni in entrata verrebbero "rifiutate" in qualche modo mentre il processo di handshaking delle applicazioni per i dispositivi n è già in corso (si tratti di un n per T limite di tempo, o un limite di handshake simultaneo n .
Purtroppo:
- semplicemente cadere le connessioni su
accept()
non invocherà il meccanismo di backoff di riconnessione sui dispositivi, quindi i tentativi di nuovo sarebbero rumorosi - non possiamo "temporaneamente escludere l'elenco" su un socket (in più non sono pazzo di clienti che hanno a che fare con timeout, piuttosto che ottenere semplicemente "connessione rifiutata" )
- non è inoltre possibile modificare la dimensione del backlog
listen
in fase di runtime - e non voglio lasciare le connessioni in entrata nel backlog, in attesa di un% co_de ritardato artificialmente, perché il mio epoll è attivato a livello e causerebbe un po 'di incubo architettonico a risolvere il "ciclo stretto" risultante "
Ho sentito che il sovraccarico di accept()
/ connect()
non è elevato (in particolare se confrontato con l'effettivo I / O), quindi sono propenso a spegnere semplicemente il mio socket di ascolto quando sto già gestendo (diciamo) 100 riconnessioni, quindi riaprilo / re accept()
quando la costa è libera.
Ma questo in qualche modo sembra la strada sbagliata per le cose.
Come affronteresti questo problema, dati i vincoli di cui sopra?