[Python] Rimpiazzare Orbited

Daniele Varrazzo piro a develer.com
Mar 1 Apr 2014 18:44:20 CEST


On 2014-04-01 16:38, Roberto De Ioris wrote:
>> Ciao,
>>
>> un mio collega ha avuto la brillante idea di togliere Orbited da un
>> sistema web push che abbiamo, perchè voleva passare ai websocket. 
>> Così
>> dall'avere N web server python che pushavano messaggi ad un singolo
>> orbited (che non ha mai fatto pio) e i client web che li ricevevano 
>> sui
>> loro canali siamo passati ad avere ogni client collegato con una
>> connessione websocket persistente al server. Coincidentalmente da 
>> quel
>> giorno abbiamo cominciato a incontrare mille problemi e il programma 
>> non
>> scala più bene, chissà come mai...
>>
>> Sto provando a insistere a reintrodurre il message broker perché 
>> sono
>> convinto che ci ha parato le chiap^W spalle per anni ma lui non 
>> vuole
>> recedere dai websocket. Secondo me un broker ci vuole, anche per 
>> come
>> immagino il futuro di quel sistema.
>>
>> Fatico a trovare un rimpiazzo drop-in di orbited su websocket: 
>> qualcosa
>> a cui i client web si connettono su un canale e altri processi 
>> possono
>> mandare messaggi sui canali che decidono. Sapete se esiste qualcosa 
>> del
>> genere o se è necessario passare ad un server AMQP (RabbitMQ etc.)?
>> Conosceta Autobahn, sapete se è promettente? Vedo che usa l'ennesimo
>> nuovo protocollo di message passing, WAMP invece di Stomp... oddio 
>> ma
>> quanti ne servono? Altre alternative?
>>
>> Scrivo qui perchè il mio collega ha letto del supporto uWSGI ai
>> websocket ma io credo che si riferisca ad avere connessioni al 
>> server,
>> non un message broker a sé stante. Giusto Roberto?
>>
>
> gia', pero' combinarlo con redis e una coda pub/sub e' relativamente
> semplice (e soprattutto rapido). Fammi pure contattare dal tuo 
> collega,
> magari ne uscite senza un bagno di sangue...
>
> La logica e' che l'app WSGI instaura la sessione websocket e resta in
> ascolto anche su redis, ogni volta che c'e' un messaggio sul canale
> websocket questo viene girato a redis, ogni volta che c'e' un 
> messaggio su
> redis viene passato al websocket. E' molto efficiente, noi lo usiamo 
> per i
> videogiochi dove la velocita' e' essenziale.

Capisco, grazie.

Il problema di scalabilità che stiamo avendo è che i nostri nodi 
frontend fanno *tante cose* diverse, con diversi pattern di concorrenza 
(alcune richieste web che nascono e muoiono, alcuni greenlet a lunga 
durata, uno molto assetato di cpu...) Secondo me stiamo mettendo in 
crisi lo scheduler di greenlet con troppi lavori troppo eterogenei. 
Nell'ottica di suddividere i processi in oggetti più indipendenti un 
message broker come era orbited mi ci stava troppo bene (per esempio per 
mettere in un processo esterno quel greenlet assetato: potrebbe mandare 
i messaggi che genera direttamente alle pagine web passando per il 
broker e saltando il web server).

Per la cronaca, ho fatto una prova con RabbitMQ e l'adapter stomper e 
funziona estremamente bene: i client ci si connettono via websocket, 
python attraverso stomp.py. Credo che mi orienterò per questa soluzione, 
che non è uno stravolgimento strutturale per la nostra applicazione 
(almeno è quella che proverò a spingere nelle prossime discussioni).

Grazie a tutti,

-- Daniele



Maggiori informazioni sulla lista Python