Creazione di un'applicazione ridondante / distribuita

1

Questa è più una domanda "indirizzami nella giusta direzione".

Il mio team di tre e io abbiamo creato un'app web ospitata che accoda e indirizza le richieste di chat dei clienti agli agenti di servizio clienti disponibili (fa anche altre cose, ma questo è sufficiente per illustrare il problema).

L'architettura di sviluppo di base oggi è:

  • un'interfaccia utente Web ajax a una sola pagina (ASP.NET MVC) con finestre di chat mobili (si pensi a Gmail)
  • un servizio di back-end di Windows per accodare e instradare le richieste di chat
    • questo servizio registra anche le chat, calcola i livelli di servizio, ecc.
  • un prodotto server Comet che indirizza i dati tra il front-end Web e il back-end Servizio di Windows
    • questo ci aiuta anche a rilevare quali agenti sono ancora connessi (online)

E la nostra architettura hardware oggi è:

  • 2 server per ospitare la parte dell'interfaccia utente Web dell'applicazione
  • un servizio di bilanciamento del carico per indirizzare le richieste verso i 2 diversi server di app Web
  • un terzo server per ospitare il DB di SQL Server e il servizio di back-end di Windows responsabile dell'accodamento / recapito di chat

Così com'è oggi, uno dei server di app web potrebbe andare giù e noi staremmo bene. Tuttavia, se accadesse qualcosa al server SQL Server / Windows, verremmo disossati.

La mia domanda: come posso rendere questo backend la logica di servizio di Windows in grado di essere distribuita su più macchine (distribuite)? Il servizio Windows è stato scritto per accettare richieste dal server Comet, controllare gli agenti disponibili e instradare la chat a tali agenti. Come posso renderlo più distribuito? Come posso fare in modo che possa distribuire il lavoro del back-end. Il servizio Windows può essere distribuito su più macchine per ridondanza e tempi di attività? Dovrò riscriverlo pensando al calcolo distribuito?

Dovrei anche notare che sto ospitando tutto questo su istanze di Rackspace Cloud - quindi forse è qualcosa di cui dovrei essere meno preoccupato?

Grazie in anticipo per qualsiasi aiuto!

    
posta MattW 21.09.2012 - 14:56
fonte

1 risposta

3
  1. Assicurarsi che il servizio Windows sia collegato in modo lasco all'istanza del server DB. Ciò ti consentirà di passare a un rapporto N: 1 del servizio Windows: server DB. C'è tutta una serie di tecniche che possono essere utilizzate per rendere il tuo server DB più robusto, ma non è proprio quello che stai ottenendo nel tuo Q.

  2. Isolare le seguenti informazioni:

    • Quali dati sono necessari per il servizio di Windows per funzionare
    • Come funzionerebbe il servizio di Windows se non disponeva di un feed immediato di tali informazioni
    • In che modo il Servizio Windows può condividere tali informazioni con altre istanze di se stesso
  3. Identifica cosa dipende dal servizio di Windows e perché. Come reagirebbero questi elementi se fosse stato inserito un bilanciamento del carico tra loro e il servizio Windows? Che cosa deve cambiare per far sì che questi elementi giochino bene con un load balancer?

  4. Inizia ad analizzare cosa potrebbe accadere alle chat esistenti e alle richieste di chat in entrata nel caso in cui il servizio di Windows dovesse cadere. Idealmente, tutto ciò che si perderebbe su una chat esistente sono le informazioni di registrazione. Le chat in entrata verrebbero indirizzate a un'istanza di Servizio Windows diversa.

In definitiva, la risposta alla tua domanda sta identificando le ipotesi e i requisiti che vincolano insieme i tuoi livelli. Allentare tali requisiti / rendere i livelli più indipendenti e sarai sulla buona strada per ridimensionare e distribuire la tua applicazione.

Sto assumendo per il tuo percorso principale che solo il servizio di Windows interagisce direttamente con il server DB. Se ciò non è vero, devi considerare se vuoi continuare con quel modello o modificarlo.

    
risposta data 21.09.2012 - 16:43
fonte

Leggi altre domande sui tag