Copiatore di transazioni/segnali altamente affidabile (discussione di ideologia e sviluppo) - pagina 7

 

OK. Allora propongo di prendere la connessione socket come modello di lavoro.

Схема работы синхронизатора:

- Il server creerà connessioni socket permanenti con i client (la questione di assegnare ad ogni client il proprio thread è ancora in fase di studio).
- il master-cliente invia lo stato attuale dei suoi ordini durante un evento commerciale
- il server salva questo file e lo invia a tutti gli altri client immediatamente (una connessione socket è già stabilita)
- il client riceve il file e cambia lo stato dell'ordine in base ai dati ricevuti
- L'ultimo file salvato della procedura guidata viene anche inviato al client quando un nuovo client si connette. (per la sincronizzazione iniziale)

Il vantaggio principale di questo sistema è il risparmio di traffico:
- Non richiede richieste costanti da parte del cliente. Li riceverà dal server sulla loro disponibilità
- Allo stesso modo, il master-client invierà dati solo quando vengono rilevati cambiamenti

Protezione in caso di perdita di connessione
- il client invia un pacchetto "Heartbeat" (ad esempio 2 byte) ogni 5 secondi per controllare la comunicazione con il server
- Il client reinizializza la connessione se il pacchetto viene inviato senza successo (nessuna risposta).
- il server fa lo stesso. Se nessuna risposta viene ricevuta dal client entro 10 secondi, la connessione socket viene chiusa.


C'è uno svantaggio di questa connessione?
- ad esempio, qual è il numero massimo possibile di connessioni socket disponibili?
 
sergeev:

Protezione in caso di perdita di connessione
- Il client invia un pacchetto "Heartbeat" (ad esempio 2 byte) ogni 5 secondi per controllare la comunicazione con il server

Questo non viene mai fatto quando si comunica tramite il protocollo di trasporto TCP/IP, perché la comunicazione viene mantenuta automaticamente al livello socket, cioè dal sistema operativo. In caso di connessioni interrotte, viene lanciata un'eccezione sul client e il suo gestore deve specificare cosa esattamente deve essere fatto in questo caso. Per quanto riguarda il server, non gliene frega niente, perché se il client è disconnesso, è un problema del client.

sergeev:


- ad esempio, qual è il numero massimo possibile di connessioni socket disponibili?
Per un host su un indirizzo IP, è possibile utilizzare un massimo di 65536 porte, alcune delle quali saranno già occupate da altre connessioni Internet. E una porta sarà sempre occupata dal socket del server per l'ascolto.
 
Reshetov:

Se le connessioni sono interrotte e viene sollevata un'eccezione sul client, deve essere sollevata un'eccezione nel suo gestore

Di quale eccezione parla?
Sto parlando della WS2_32.dll. Solite prese Berkeley (anche se nella variante asincrona). Non ho visto alcuna eccezione. Si può rilevare un crash solo provando a inviare/ricevere.

Un massimo di 65537 porte può essere utilizzato per un IP su un host, alcune delle quali saranno già occupate da altre connessioni internet.
Sì, hai bisogno di una sola porta.
quante connessioni socket possono essere fatte su questa porta?
 
sergeev:

Di quale eccezione parla?
Sto parlando della WS2_32.dll. Normali sockets Berkeley (anche se in versione asincrona). Non ho visto alcuna eccezione. Si può rilevare un crash solo provando a inviare/ricevere.

Beh, avete bisogno di una sola porta.
Mi interessa sapere quante connessioni socket possono essere collegate a questa porta ?

C'è solo una connessione per porta. Affinché il client possa connettersi, deve sapere quale IP e numero di porta sono allocati sul server. In alternativa, potete specificare un nome di dominio invece di IP e il socket lo risolverà in un indirizzo IP tramite DNS.

Il socket del server ascolta proprio questo numero di porta per connettersi dai clienti. Quando il client si connette, il socket alloca un'altra porta dal pool di porte libere per mantenere la connessione. La porta persistente viene poi rilasciata di nuovo e resta in ascolto per le connessioni di altri clienti.

Questo è il modo in cui sono fatte le connessioni del protocollo di trasporto TCP/IP. Tutto questo viene fatto a livello di socket, cioè non c'è bisogno di programmare il protocollo - è standard ed è già cablato nella libreria condivisa nel sistema operativo.

 
qualcosa potrebbe tornare utile per lo sviluppo
File:
kopir.zip  397 kb
 
Reshetov:
Quando un client si connette, il socket alloca un'altra porta dal pool di porte libere al client per tenerlo permanentemente connesso.

Yuri, grazie per le basi, ma è fuori luogo. Stai dando la conoscenza sbagliata.

E quella assegnata non ha affatto senso, scusate. Forse state applicando i concetti di porto in due ipostasi diverse, ma allora è meglio che lavoriate in concetti accettati.

 
SEVER11:
qualcosa potrebbe tornare utile per lo sviluppo

improbabile. poco professionale.
 
sergeev:


E quella evidenziata è una sciocchezza, mi dispiace. Forse stai applicando i concetti di porto in due forme diverse, ma allora è meglio che lavori in concetti accettati.

Come si dice, è un vostro problema come applicate il concetto di porto. Ho solo spiegato come vengono usate le porte nel protocollo TCP/IP. Ancora una volta, il protocollo è standard, cioè non l'ho inventato io.

Non sono io che l'ho inventato.

Buona fortuna!

 
sergeev

Qual è l'ordine di grandezza della rete, quanti clienti dovrebbero essere 1000-mila, 100-mila, 10-mila, 1-mila?

Perché il tuo server andrà davvero in bancarotta con migliaia di clienti.

 
Urain:

Qual è l'ordine di grandezza della rete, quanti clienti dovrebbero essere 1000-mila, 100-mila, 10-mila, 1-mila?

Perché il tuo server andrà davvero in bancarotta con migliaia di clienti.


Questo è il punto, sto cercando di pensare in modo globale. Naturalmente, bisogna mettere molta scalabilità all'inizio. Cioè, l'obiettivo è quello di fare tanto quanto per 1.000h. E non importa se solo poche persone lo useranno in seguito.

Ecco perché ora sto cercando di scegliere e decidere: o velocità e micro-traffico con le prese. O http e un sacco di traffico su un costante inseguimento di clienti per una nuova porzione di informazioni.