[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