de grandes repositorios distribuidos de recursos a través de una interfaz gráfica. Provee una solución de Infraestructura como Servicio. Recursos de computabilidad Recursos de almacenamiento Recursos de red
en la demanda. Aplicaciones que pueden escalar dinámicamente on-the-fly Testing de software. Pueden probarse diferentes plataformas de una forma económica y flexible Super-computing. Se pueden crear múltiples servidores de una sola vez y resolver un problema complejo usando paralelismo
OpenStack. Fue pensado para ser utilizado para comunicar aplicaciones en la nube, provee una interfaz REST (REpresentational State Transfer), almacenamiento persistente y soporta diferentes patrones de mensajería Producer/Consumer. Mensajería punto a punto Publisher/Subscriber. Broadcasting de eventos
mayoría de los casos de uso. Pero cuando el almacenamiento y recuperación de mensajes se incrementa a tasas superiores a 10.000 mensajes por segundo, este tipo de transporte es muy ineficiente.
comunicación full-duplex sobre un único socket TCP. Eficiente. Con una conexión basta para enviar y recibir datos. Simple. Sólo pueden transmitirse strings y bytes. El formato del mensaje no tiene limitaciones. Firewall friendly. Como abre la conexión como si fuera HTTP, no es necesario abrir puertos especiales ;) Estándar. IETF ya agrego el protocolo a sus estándares, W3C está en proceso de estandarizar la API
n " : " " , " h e a d e r s " : { } , " b o d y " : { } } Action. e.g. "queue_create" Headers. e.g. X-Project-ID, Client-ID, X-Auth-Token, Date, Accept, User-Agent Body. e.g. {"queue_name": uns}
estos aspectos, pero Websocket sí. Delegamos esto a la especificación de Websocket. Protocolo de conexión. Websocket se conecta al puerto 80 o 443. De haber un webserver, los pedidos de Websocket se interpretan como un GET. Seguridad. Websocket tiene su versión segura (wss) y también hacemos uso de Keystone (tokens de autenticación).
Actualmente, la librería más robusta y confiable para implementar un server de Websocket es . Autobahn Manejo de asynchronous IO, event loops y coroutinas. Implementación con Twisted o Asyncio. Soporte para varios lenguajes. Python, Javascript, C++. Soporte para múltiples plataformas. Desktop y dispositivos móviles. ¡Libre! El código está bajo licencia MIT.
o i n t s G E T / v 1 . 1 G E T / v 1 . 1 / h e a l t h G E T / v 1 . 1 / p i n g # Q u e u e s G E T / v 1 . 1 / q u e u e s { ? m a r k e r , l i m i t , d e t a i l e d } P U T / v 1 . 1 / q u e u e s / { n a m e } D E L E T E / v 1 . 1 / q u e u e s / { n a m e } # Q u e u e s t a t s G E T / v 1 . 1 / q u e u e s / { q u e u e _ n a m e } / s t a t s # M e s s a g e s G E T / v 1 . 1 / q u e u e s / { q u e u e _ n a m e } / m e s s a g e s { ? m a r k e r , l i m i t , e c h o , i n c l u d e _ c l a i m e d } P O S T / v 1 . 1 / q u e u e s / { q u e u e _ n a m e } / m e s s a g e s D E L E T E / v 1 . 1 / q u e u e s / { q u e u e _ n a m e } / m e s s a g e s / { m e s s a g e _ i d } { ? c l a i m _ i d } Siguiendo los lineamientos del desarrollo en proyectos de OpenStack, esta prueba de concepto implementó los endpoints más importantes.
e r ( o b j e c t ) : d e f _ _ i n i t _ _ ( s e l f , c o n f , a p i , c a c h e ) : s e l f . _ c o n f = c o n f s e l f . _ a p i = a p i s e l f . _ c a c h e = c a c h e s e l f . _ c o n f . r e g i s t e r _ o p t s ( _ W S _ O P T I O N S , g r o u p = _ W S _ G R O U P ) s e l f . _ w s _ c o n f = s e l f . _ c o n f [ _ W S _ G R O U P ] @ d e c o r a t o r s . l a z y _ p r o p e r t y ( w r i t e = F a l s e ) d e f f a c t o r y ( s e l f ) : u r i = ' w s : / / ' + s e l f . _ w s _ c o n f . b i n d + ' : ' + s t r ( s e l f . _ w s _ c o n f . p o r t ) r e t u r n f a c t o r y . P r o t o c o l F a c t o r y ( u r i , d e b u g = s e l f . _ w s _ c o n f . d e b u g , h a n d l e r = s e l f . _ a p i ) d e f l i s t e n ( s e l f ) : Esto es solo un extracto ;) El código completo puede verse en . https://github.com/openstack/zaqar
a g i n g P r o t o c o l ( w e b s o c k e t . W e b S o c k e t S e r v e r P r o t o c o l ) : d e f _ _ i n i t _ _ ( s e l f , h a n d l e r ) : w e b s o c k e t . W e b S o c k e t S e r v e r P r o t o c o l . _ _ i n i t _ _ ( s e l f ) s e l f . _ h a n d l e r = h a n d l e r d e f o n C o n n e c t ( s e l f , r e q u e s t ) : p r i n t ( " C l i e n t c o n n e c t i n g : { 0 } " . f o r m a t ( r e q u e s t . p e e r ) ) d e f o n O p e n ( s e l f ) : p r i n t ( " W e b S o c k e t c o n n e c t i o n o p e n . " ) d e f o n M e s s a g e ( s e l f , p a y l o a d , i s B i n a r y ) : i f i s B i n a r y : # T O D O ( v k m c ) : B i n a r y s u p p o r t w i l l b e a d d e d i n t h e n e x t c y c l e # F o r n o w , w e a r e r e t u r n i n g a n i n v a l i d r e q u e s t r e s p o n s e p r i n t ( " B i n a r y m e s s a g e r e c e i v e d : { 0 } b y t e s " . f o r m a t ( l e n ( p a y l o a d ) Esto es solo un extracto ;) El código completo puede verse en . https://github.com/openstack/zaqar
l a s s Q u e u e L i f e c y c l e B a s e T e s t ( b a s e . V 1 _ 1 B a s e ) : c o n f i g _ f i l e = " w e b s o c k e t _ m o n g o d b . c o n f " d e f s e t U p ( s e l f ) : s u p e r ( Q u e u e L i f e c y c l e B a s e T e s t , s e l f ) . s e t U p ( ) s e l f . p r o t o c o l = s e l f . t r a n s p o r t . f a c t o r y ( ) d e f t e s t _ e m p t y _ p r o j e c t _ i d ( s e l f ) : a c t i o n = " q u e u e _ c r e a t e " b o d y = { " q u e u e _ n a m e " : " k i t k a t " , " m e t a d a t a " : { " k e y " : { " k e y 2 " : " v a l u e " , " k e y 3 " : [ 1 , 2 , 3 , 4 , 5 ] } } Esto es solo un extracto ;) El código completo puede verse en . https://github.com/openstack/zaqar
benchmarks para un escenario de productor/consumidor usando como almacenamiento MongoDB. Benchmarks realizados con el servicio de OpenStack Rally. El código está disponile en Se hizo uso de una computadora con un procesador Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz, 4GB RAM y 500GB HD https://github.com/openstack/rally
necesario seguir iterando para mejorar aún más el desempeño. En el próximo ciclo de desarrollo se trabajará en esto y en agregar los endpoints faltantes. Otros servicios de OpenStack se dispusieron a agregar soporte de Websocket ;) Durante el desarrollo de esta tesis fueron utilizados muchos conocimientos adquiridos a lo largo de la carrera.