Ho questa situazione .... Comunicazione SOAP 1.1 avviata dal client tra un server e diciamo, decine di migliaia di client. I client sono esterni, entrano attraverso il nostro firewall, autenticati dal certificato, https, ecc. Possono essere ovunque, e di solito hanno i loro firewall, router NAT, ecc ... Sono veramente esterni, non solo uffici aziendali remoti. Potrebbero essere in una rete aziendale/campus, DSL/via cavo, anche in dialup.Quale protocollo di rete utilizzare per la notifica leggera di app remote?
Client utilizza Delphi (2005 + SOAP correzioni rispetto al 2007), e il server è C#, ma da un/design punto di vista dell'architettura, che dovrebbe non importa.
Attualmente, i clienti spingere i nuovi dati al server e tirare i nuovi dati dal server in 15 minuti di ciclo di controllo. Il server attualmente non spinge i dati - il client colpisce il metodo "messagecount", per vedere se ci sono nuovi dati da estrarre. Se 0, dorme per altri 15 minuti e controlla di nuovo.
Stiamo cercando di ottenere che fino a 7 secondi.
Se questo fosse un app interno, con una o solo poche decine di clienti, ci piacerebbe scrivere un cilent servizio di sapone "ascoltatore", e spingerebbe i dati ad esso. Ma dal momento che sono esterni, siedono dietro i loro firewall e, a volte, reti private dietro router NAT, questo non è pratico.
Quindi siamo rimasti con il polling su un ciclo molto più veloce. I client 10K, ognuno dei quali controlla il proprio messagecount ogni 10 secondi, saranno messaggi di 1000/sec che per lo più sprecheranno solo risorse di larghezza di banda, server, firewall e autenticatore.
Così sto cercando di progettare qualcosa di meglio di quello che sarebbe pari a un attacco DoS auto-inflitta.
non credo che sia pratico di avere i messaggi SOAP server di inviare al client (push) in quanto ciò richiederebbe troppo configurazione sul lato client. Ma penso che ci siano alternative che non conosco. Ad esempio:
1) Esiste un modo per il client di effettuare una richiesta per GetMessageCount() tramite Soap 1.1, e ottenere la risposta, e quindi forse "rimanere in linea" per forse 5-10 minuti a ottenere risposte aggiuntive nel caso in cui arrivino nuovi dati? cioè il server dice "0", quindi un minuto dopo in risposta a qualche trigger SQL (il server è C# su Sql Server, btw), sa che questo client è ancora "sulla linea" e invia il conteggio messaggi aggiornato di "5 "?
2) C'è qualche altro protocollo che potremmo usare per "ping" il cliente, utilizzando le informazioni raccolte dalla loro ultima richiesta GetMessageCount()?
3) Non lo so nemmeno. Immagino che sto cercando un protocollo magico in cui il client può inviare una richiesta GetMessageCount(), che includerebbe informazioni per "oh a proposito, nel caso in cui la risposta cambi nell'ora successiva, ping a questo indirizzo ... ".
Inoltre, suppongo che uno di questi schemi "mantieni la linea aperta" avrebbe un serio impatto sul dimensionamento del server, in quanto sarebbe necessario mantenere aperte molte migliaia di connessioni contemporaneamente. Ciò potrebbe avere un impatto anche sui firewall, credo.
C'è qualcosa là fuori in questo modo? O sono abbastanza bloccato con il polling?
TIA,
Chris
UPDATE 4/30/2010:
hanno dimostrato che avere 7-seconda notifica non è né facile né economico, soprattutto senza andare al di fuori dello standard aziendale di HTTPS/SOAP/Firewall , probabilmente stiamo per lanciare una soluzione a due fasi. Phase1 invierà che i client eseguano il polling "su richiesta" con il GetMessageCount eseguito tramite SOAP, niente di eccezionale qui. Ci sarà un pulsante "Aggiorna" per estrarre nuovi dati (che è ragionevole qui, dato che l'utente di solito ha motivo di sospettare che i nuovi dati siano pronti, cioè hanno appena cambiato il colore del tessuto nel sistema online, in modo che sappiano fare clic AGGIORNA prima di visualizzare il manifest di spedizione sul desktop, e ora vedono il colore nella descrizione.) (Questa NON è davvero un'app per abbigliamento/moda, ma hai un'idea). La nozione di avere i due aps sempre sincronizzati, con aggiornamenti in tempo reale inviati dall'host, è ancora sul tavolo, utilizzando le tecnologie discusse qui. Ma mi aspetto che verrà spinto per un'altra versione, in quanto possiamo fornire l'85% delle funzionalità senza doverlo fare. Tuttavia, spero che potremo fare una dimostrazione del concetto e possiamo dimostrare che funzionerà. Tornerò e pubblicherò aggiornamenti futuri. Grazie per l'aiuto di tutti su questo.
Ciao Ragazzi, ho aggiunto una taglia, ma questo non significa che non mi piacciono le risposte finora! Volevo essere sicuro che questo fosse guardato il più possibile, e inoltre, ho sempre desiderato fare un premio ... Ci sono un sacco di ottime risposte qui, e lo apprezzo davvero. –
Vorrei poter dividere il premio ... ci sono molte grandi risposte qui, e forse il più utile a questo punto del progetto è il consenso travolgente che concorda con la mia posizione secondo cui non possiamo gestire connessioni 10K facendo polling veloce, né possiamo trasmettere loro dati come ascoltatori SOAP regolari. –