Creazione chat in java per grande mole di utenti

di il
19 risposte

19 Risposte - Pagina 2

  • Re: Creazione chat in java per grande mole di utenti

    migliorabile ha scritto:


    Il tuo approccio e' ovviamente, concettualmente sbagliato, con questi ordini di grandezza, non in senso assoluto
    Quella che descrivi e' un'implementazione canonica.
    Considera le seguenti cose:

    - ogni thread richiede uno stack, quindi ci sono dei limiti basati sulla memoria disponibile
    - lo scheduler del SO deve assegnare uno slot di tempo al thread, quindi ci sono limiti sul numero di thread che puoi aprire (serve a poco avere un thread schedulato 30 minuti dopo)
    - al piu' si possono aprire 65536 connessioni tcp/ip per IP

    A fronte di questo, capirai che il tuo approccio non puo' funzionare.
    Ne esiste un'altro, piu' sofisticato, e ovviamente piu' complicato, ma che ti permette di getire 60000 utenti per nodo.

    E' l'I/O asincrono.

    Studia la libreria Java NIO realizzata proprio su questi concetti.

    Naturalmente questa e' solo una parte del problema.
    Un'altra cosa che puoi fare e' studiarti come funziona Jabber (jabber.org) un protocollo pensato proprio per le chat.
    Altra dritta, JMS (Java Msssaging Sistem).
    Poi puoi cercare su Google 'instant messaging protocols'.

    Non sara' divertente come realizzare una chat da zero, ma ti da un'idea dei problemi da affrontare e come potrebbero essere risolti.

    La chat non sono nate ieri, per cui esiste moltissima documentazione su come si realizzano
    Erano proprio quei tipi di problemi di cui parlavo.
    Grazie delle indicazioni, mi informerò.
  • Re: Creazione chat in java per grande mole di utenti

    John23 ha scritto:


    Forse non riesco a spiegarmi come vorrei, ora ho una chat cosi composta:
    Allora, lo so che "farà male", ma alta concorrenza e java non vanno d'accordo, nel senso che "nel mondo normale" difficilmente si usa java per questa tipologia di problemi (non perchè java in sè abbia qualcosa di male, è solo che è pesantissimo rispetto a soluzioni senza JVM)
    Edit: intendo "altissima concorrenza", quindi è un giudizio tecnico, non di tipo "religioso", e dò per scontato che sia chiaro il perchè.
    Lato client (2 thread):
    -Thread1--> apertura socket verso server, while(true){invio messaggi al server }
    -Thread2-->while(true){ lettura messaggi ricevuti dal server e stampa a video}
    Scritto così è busy waiting: cioè il processo client continua a testare all'infinito l'arrivo di un messaggio dal server
    Lato server:
    Viene creata una nuova Thread per ogni connessione e esegue :
    Come giustamente segnalato un thread (java poi) è assolutamente troppo pesante per una gestione ragionevolmente scalabile
    Il problema è che il Server con ad esempio 100.000 utenti connessi dovrebbe aprire e mantenere sul server 100.000 Thread, quindi vorrei trovare una implementazione alternativa per diminuire il carico di lavoro sul server.
    Semplice, ti basta un singolo thread server (o magari diciamo 4-8 se riesci [cosa che non credo proprio, ma non sono così esperto di java] un'affinità per eventuali CPU fisiche) perchè vuoi farne tanti?
    L'unica implementazione che mi viene in mente è quella in cui ho 2 Server e ogni utente viene connesso a uno di questi due server con un load balancer.
    Lascerei perdere, decisamente, una suddivisione siffatta.
    Se pensi al meccanismo di base di nginx e apache vedi come il primo è enormemente più "leggero" del secondo proprio quando ci sono fork massivi.
    Quindi di fatto non è l'implementazione più adatta, quale adottare?
    La risposta "giusta" è... skype.
    Cioè un client monolitico eseguibile (niente java) che colloquia con uno (o più server) specifici, a loro volta monolitici (niente java)

    Mi rendo conto di non aver chiesto a priori se stai facendo una chat web oppure no.

    Riguardo il discorso 1-client<=>1 porta TCP server, ovviamente, puoi sempre fare tutti-i-client<=>1 singola porta TCP, esattamente come funziona HTTP sulla porta 80 per tanti client diversi.
    Non ti so dare informazioni precise sulla funzionalità per java di un approccio del genere, ti serve qualcuno più esperto di me.

    Dal punto di vista IP hai problemi (o meglio ce l'ha il client) se deve gestire con un singolo IP più di 65K connessioni (può avvenire qualcosa del genere forse per le reti fastweb)

    Altrimenti ogni connessione è qualificata da una quadrupla: IP server:portaserver, IP client:portaclient
    I primi due sono fissi (anche se in realtà nulla vieta di dare più IP ad un sigolo server), ma gli ultimi due sono tipicamente diversi, il terzo è uguale nel caso di uso di NAT (ad esempio un router casereccio).

    Spero di essere stato sufficientemente esaustivo.
  • Re: Creazione chat in java per grande mole di utenti

    Non esiste sistema classico (diciamo cosi') in cui l'altissima concorrenza e' basata su migliaia i milioni di thread PER MACCHINA.
    Per avere altissima concorrenza ti servono TANTISSIMI core!
    Ma i sistemi ad alto parallelismo (come le scede grafiche, 5000 thread) non sono semplici da programmare. E comunque, per usarli al meglio, bisogna fare in modo che TUTTI i thread facciano qualcosa nello stesso momento!

    Quello che si fa, invece, e' usare un nuovo paradigma di programmazione: il task-oriented programming.
    In questo caso puoi avere anche milioni di task da processare, ma il parallelismo e' limitato dal numero di thread fisici disponibili.
  • Re: Creazione chat in java per grande mole di utenti

    Perfetto, grazie ad entrambi, ora ho le idee più chiare.
    Java non è il migliore modo di programmare una chat di questo genere?
    Avete per caso consiglio o guide da leggere per potermi schiarire meglio le idee, magari su una tipica struttura chat simile a Whatsapp ecc?

    Grazie ancora.
  • Re: Creazione chat in java per grande mole di utenti

    Fai delle ricerche con un motore.
    Qui puoi vedere qualcosina del genere
    https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/

    Sono sempre però curioso di capire il motivo dell'interesse
Devi accedere o registrarti per scrivere nel forum
19 risposte