Domanda

Di recente, ho letto il protocollo IRC (RFC 1459, 2810-2813) e stavo pensando di implementare il mio server.

Non sto necessariamente cercando di aderire religiosamente al protocollo IRC (lo sto facendo per divertimento, dopo tutto), ma una delle cose che mi piace è che una rete può essere composta da più server in modo trasparente.

Ci sono una serie di cose che non mi piacciono per il protocollo o le specifiche IRC. Il primo è che i soprannomi non sono di proprietà. Sebbene esistano servizi come NickServ, non fanno parte del protocollo ufficiale. D'altra parte, l'implementazione di qualcosa come NickServ propriamente sconfigge lo scopo della distribuzione (cioè ci sarebbe un posto dove NickServ è in esecuzione e un archivio di dati per esso ).

Speravo che ci sarebbe stato un modo per gestire i nickname in base al server. Il problema è che se hai due server che hanno dei nickname registrati e poi si collegano, puoi avere delle collisioni.

C'è un modo per evitarlo, senza usare un archivio dati centrale? Cioè: è possibile mantenere i server vagamente connessi (in modo tale che esistano ciascuno come entità indipendente, ma possano anche connettersi tra loro) e mantenere l'unicità tra i soprannomi?

Mi rendo conto che questa domanda è vaga, ma non riesco a pensare a un modo migliore per formularla. Sto cercando più suggerimenti di quanto non lo sia per risposte sì / no effettive. Quindi, se qualcuno ha qualche idea su come realizzare l'unicità del soprannome in una rete pur mantenendo l'indipendenza del server, sarei interessato a sentirlo. Si noti che aderire rigorosamente al protocollo IRC non è affatto necessario; Non ho problemi a cambiare le cose per adattarle ai miei scopi. :)

È stato utile?

Soluzione

Esiste una soluzione semplice se non ti interessa rigorosamente implementare un server IRC, ma piuttosto implementare un sistema di messaggi distribuito che come IRC, ma non esattamente IRC.

La semplice soluzione è quella di utilizzare i soprannomi nella forma "nick @ host", proprio come la posta elettronica. Quindi invece di essere semplicemente "mipadi", il mio soprannome potrebbe essere "mipadi@free-memorys-server.net" ;. Quindi mi registro solo con il tuo server, ma quando il tuo server si collega con gli altri per formare un'altra rete di chat di grandi dimensioni, puoi facilmente unire tutti i nomi utente insieme. Potrebbe esserci un " mipadi " su otherserver.net, ma i nostri soprannomi diventano " mipadi@free-memorys-server.net" e " mipadi@otherserver.net" ;, e tutto è bello.

Naturalmente, questo si discosta molto dall'IRC. :)

Altri suggerimenti

Devono conoscersi a vicenda. In caso contrario, non è possibile impedire la condivisione di nickname. In tal caso, è sufficiente trasferire gli aggiornamenti sul back-end. Per impedire registrazioni simultanee, è necessario un sistema di transazione che blocchi, richieda l'autorizzazione da tutti gli altri server e risponda.

Per evitare registrazioni simultanee durante le interruzioni, non hai altra scelta che timestamp della registrazione e rimuovere tutto tranne l'ultima (o una casuale per una copia realmente simultanea) del nick.

Non è molto carino considerando che questi server non sono inizialmente uniti in primo luogo.

Potresti comunque implementare la proprietà nick senza un'istanza centrale, se le tue istanze del server si fidano l'una dell'altra.

  • Quando un utente registra un nick, questo viene registrato con il server corrente a cui è connesso
  • Quando un server riceve una registrazione di cui non era a conoscenza, inoltra tali informazioni a tutti gli altri server che non lo conoscono ancora (potrebbe essere necessario un algoritmo intelligente per evitare lo spamming della rete)
  • Quando un server si riconnette a un altro server, tenta di sincronizzare l'elenco di nick registrati e quale server gestisce quale nick
  • Se si verifica una collisione durante tale sincronizzazione, viene utilizzata la registrazione precedente e quella più recente contrassegnata come non valida

Se non puoi fidarti dei tuoi server, diventerà molto più difficile, poiché un server potrebbe facilmente rivendicare ogni nome utente e persino richiedere la registrazione più vecchia per ognuno.

Dal momento che stai cercando di trovare qualcosa di nuovo, l'idea che mi viene in mente è semplicemente includere qualcosa di unico sul server come parte del nickname quando comunichi al di fuori del server. Quindi, se vuoi inviare un messaggio a un utente su un server diverso, potresti avere qualcosa come user @ server

Se non hai bisogno che siano completamente separati, potresti prendere in considerazione l'idea di creare un qualche tipo di database replicato a più master. Laddove ciascun server memorizza una copia completa del database degli account e ciascun server può creare nuovi account che verranno replicati su altri server il più possibile. Probabilmente dovrai comunque affrontare le collisioni in alcune occasioni.

  

Sebbene esistano servizi come NickServ, non fanno parte del protocollo ufficiale.

I servizi non fanno parte del protocollo ufficiale perché non hanno nulla a che fare con il protocollo. Sono robot con autorizzazioni. Non vi è alcun motivo per cui non si possa avere uno in esecuzione su ciascun server, ma li rende più difficili da mantenere.

Se dovessi seguire questa strada, probabilmente suggerirei il "master multiplo" comunemente usato tecnica di replica del database. Se uno riceve una scrittura (nel tuo caso, viene creato o aggiornato un nuovo utente, ecc.) Invia i dati a tutti gli altri nodi. Dovrai stare attento però. Se un nodo è offline quando gli altri ricevono un aggiornamento, dovrà sapere di risincronizzarsi al momento della riconnessione.

Un'altra tecnica sarebbe come sopra ma al contrario. I dati vengono scambiati tra i nodi solo quando è necessario. Ad esempio, se un utente tenta di accedere a un nodo in cui non vi sono dati per esso, interrogherà gli altri ed emetterà un ordine di spostamento per ottenere tutti i dati su quel nodo. Questo è potenzialmente meno doloroso della versione di replica ma potrebbero esserci gravi problemi nelle netsplits se qualcuno si iscrive su un nodo disconnesso dal pacchetto per un nick duplicato.

Una tecnica per annullare i problemi delle netsplit sarebbe quella di rendere i nodi di chat e i loro bot compatibili con le netsplit. Quando sono divisi, probabilmente non dovrebbero consentire alcuna azione di scrittura ... Ma questo potrebbe avere un impatto sulla tua rete se stai dividendo un sacco.

Devi anche chiedere quanto sia sicuro o meno. I nodi di rete IRC sono distribuiti per le prestazioni ma non sono "sicuri". Per questo motivo, i robot di servizio vengono generalmente eseguiti centralmente per mantenere il massimo controllo sulla loro esecuzione. Se i bot distribuiti e il nodo remoto fossero stati hackerati, avrebbero potenzialmente accesso all'intero database degli utenti (a seconda del modello).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top