Gestione di grandi quantità di socket

2

Sto lavorando a un progetto in cui abbiamo un'applicazione desktop che dovrebbe essere in grado di ricevere comandi da un'applicazione web. Per risolvere questo problema, l'uso delle prese sembra un buon approccio (invece del lungo polling e varie altre tecniche).

L'applicazione desktop utilizza anche un'API Web e questo è protetto con l'autenticazione reciproca in SSL. Anche i socket dovrebbero essere protetti con SSL.

La domanda è: qual è il modo migliore per gestire grandi quantità di socket?

Ho pensato ad una soluzione che implica l'utilizzo di una "presa relè". Fondamentalmente l'applicazione desktop crea un socket per [The Relay Station]. Ogni volta che deve essere inviata un'azione dall'applicazione Web, l'app Web crea anche un socket per la stazione di inoltro.

L'app web invia un comando che dice "relay [this] to [socket]".

Questo approccio richiede che:

  • Tutti i socket da desktop a relay devono essere persistenti
  • L'applicazione desktop deve identificarsi, in modo che la webapp possa fare riferimento a lui nei suoi comandi
  • La stazione di inoltro deve tenere traccia di tutti i socket dell'applicazione desktop e mapparli a un identificativo univoco.

Questo mi dà una buona struttura, ma pone anche alcune domande:

  • Quale dovrebbe essere l'identificatore?
  • C'è un modo migliore di inviare comandi da [WebApp] all'applicazione desktop corretta, senza utilizzare tale approccio?
posta DavidS 09.12.2013 - 00:28
fonte

1 risposta

1

La domanda è se preferisci che l'applicazione di collegamento venga eseguita sul tuo server web (come server relay) o sul desktop (l'app accetta molte connessioni). Questa è una decisione progettuale, penso, piuttosto che una programmazione.

Da qualche parte hai bisogno di un'applicazione che accetti un numero elevato di connessioni. Uno per istanza dell'app Web, presumibilmente. Un milione è abbastanza semplice e non ha da fare in C (esempio usa erlang e duplica il codice usando C).

Quanti comandi stai guardando, totale, e quante istanze dell'app web (decine? migliaia? milioni?) Se sono milioni, non importa se tu li canalizzi usando un relay, tu? dedicherò molto tempo alla replica e a più istanze dei vostri endpoint. Un milione di istanze che inviano un comando al minuto è un comando di 16k al secondo.

Penso che la domanda dell'identificatore sia abbastanza ovvia: usa l'identificativo nativo fornito con la connessione (l'handle del socket o il riferimento alla classe), quindi qualsiasi sistema di mappatura fornito dalla tua lingua per collegarlo all'ID dell'app o al comando web. Se è necessario creare un proprio ID e non preoccuparsi dell'identità della sorgente del comando, è sufficiente utilizzare direttamente i dettagli IP, altrimenti utilizzare l'ID utente o il comando che si possiede. È molto più facile eseguire il debug per vedere

user 123456 issued command Fubar(everything) from 192.168.0.255:54012

di avere un ID artificiale lì (o devi cercarlo).

Suggerisco che l'ID sia l'indirizzo e la porta di origine, oltre alla porta di input (il tuo IP sarà corretto, a meno che tu non abbia più IP, nel qual caso memorizza anche quello). Con IPv4 è 32 bit per IP più 16 per porta, per un massimo di 96. Con IPv6 è 160 bit. Ad ogni modo, questo non sarà il tuo più grande succhiamento di memoria. Una volta inserito in una lista di qualche tipo, avrai un puntatore o un int nativo, che diventerà il tuo "vero ID". Idealmente sarai in grado di utilizzare un collegamento diretto nel livello di rete del tuo software per questo, per salvare un livello di riferimento indiretto.

    
risposta data 09.12.2013 - 01:35
fonte

Leggi altre domande sui tag