Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Implementación de una Solución de Transporte Pe...

vkmc
April 24, 2015

Implementación de una Solución de Transporte Persistente para el proyecto de Mensajería y Notificaciones de OpenStack

vkmc

April 24, 2015
Tweet

More Decks by vkmc

Other Decks in Technology

Transcript

  1. IMPLEMENTACIÓN DE UNA SOLUCIÓN DE TRANSPORTE PERSISTENTE PARA EL PROYECTO

    DE MENSAJERÍA Y NOTIFICACIONES DE OPENSTACK / Victoria Martínez de la Cruz @vkmc
  2. ESTRUCTURA DE LA PRESENTACIÓN Introducción a los conceptos de cloud

    computing Introducción a OpenStack Introducción a OpenStack Zaqar Motivaciones del desarrollo Diseño, implementación y benchmarks Conclusiones
  3. CLOUD COMPUTING ES... La entrega de recursos informáticos a través

    de Internet con una modalidad de cobro por consumo.
  4. OPENSTACK Es un conjunto de herramientas que permite la administración

    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
  5. OPENSTACK ¿Y que podemos hacer con esto? Resistencia a cambios

    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
  6. OPENSTACK Actualmente está siendo usado en la academia, en la

    industria y también en grandes organizaciones.
  7. OPENSTACK ZAQAR Es el servicio de notificaciones y mensajería de

    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
  8. OPENSTACK ZAQAR Zaqar implementa una arquitectura en capas, haciendo que

    el código sea altamente modular. De esta forma, es posible agregar soporte para diferentes tecnologías de transporte y de almacenamiento.
  9. OPENSTACK ZAQAR La versión estable de Zaqar tiene soporte para

    WSGI (Web Server Gateway Interface) como transporte, y MongoDB y Redis como almacenamiento.
  10. OPENSTACK ZAQAR WSGI como transporte es suficiente para cubrir la

    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.
  11. TRANSPORTE PERSISTENTE Conexiones de larga duración con overhead mínimo. Raw

    TCP HTTP Long Polling Websocket WAMP (Web Application Messaging Protocol)
  12. WEBSOCKET Esta nueva tecnología de transporte proporciona un canal de

    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
  13. DISEÑO Varias cuestiones a definir Formato del mensaje Serialización de

    los mensajes Protocolo de conexión y seguridad Librerías de Websocket a utilizar
  14. FORMATO DEL MENSAJE { " a c t i o

    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}
  15. SERIALIZACIÓN DE LOS MENSAJES ¿Cómo logramos que el envío de

    los mensajes sea práctico y eficiente? Diferentes opciones JSON Protocol Buffers MsgPack Cap n' Proto
  16. PROTOCOLO DE CONEXIÓN Y SEGURIDAD Algunos wire protocols no definen

    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).
  17. LIBRERÍAS DE WEBSOCKET A UTILIZAR Hubieron varias opciones para elegir.

    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.
  18. IMPLEMENTACIÓN # B a s e e n d p

    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.
  19. IMPLEMENTACIÓN c l a s s D r i v

    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
  20. IMPLEMENTACIÓN c l a s s M e s s

    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
  21. IMPLEMENTACIÓN @ d d t . d d t c

    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
  22. BENCHMARKS Y finalmente... ¡la hora de la verdad! Analizamos los

    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
  23. (Benchmarks) CONCLUSIONES Si bien los resultados iniciales fueron satisfactorios, es

    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.
  24. ¿PREGUNTAS? - - - - - Slides OpenStack Zaqar OpenStack

    Rally Protocolo Websocket - RFC 6455 Autobahn