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

Conectando partes con ZeroMQ

Conectando partes con ZeroMQ

Hacer un repaso de sistemas distribuidos para entrar en tema y comentar brevemente que es BSD socket. Meterse en el universo de ZMQ para conocer su funcionamiento y componentes basicos como asi su API. Comentar como encaja ZMQ en la comunicacion basada en mensajes y tambien comentar que en las arquitecturas distribuidas no solo se "habla" mediante HTTP. Se mostrarán los patrones propuestos por ZMQ para resolver problemas comunes como por ejemplo "trabajo asincrono", "procesamiento en pipeline".

Martin Alderete

November 23, 2018
Tweet

More Decks by Martin Alderete

Other Decks in Programming

Transcript

  1. “Conectando partes con ZeroMQ" Martin Alderete @alderetemartin [email protected] This work

    is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
  2. About me Nacido y criado en la Patagonia Adoptado por

    la ciudad de las diagonales Pythonista hace unos 13 años Miembro de la Asociación Civil de Python Argentina (Háganse socios!) Actualmente trabajando en Satellogic, construyendo pequeñas naves espaciales y generando y arreglando bugs en el espacio Varios sobrenombres tincho, malderete, ninja….
  3. Introducción: Sistemas distribuidos “A distributed system is a software system

    in which components located on networked computers communicate and coordinate their actions by passing messages. The components interact with each other in order to achieve a common goal” (Wikipedia) Heterogeneidad Transparencia Escalabilidad Tolerancia a fallos Consistencia más...
  4. Sockets (POSIX) API de bajo nivel Orientado a “Stream” de

    datos (TCP) o Orientado a “Datagramas” (UDP) Manejo de reconecciones suele ser doloroso No es posible “conectarse” a un servicio que “no está disponible” Generalmente trabajar con sockets es tedioso o doloroso, “edge-cases” por varios lugares
  5. Qué es ZeroMQ (ØMQ)? “We took a normal TCP socket,

    injected it with a mix of radioactive isotopes stolen from a secret Soviet atomic research project, bombarded it with 1950-era cosmic rays, and put it into the hands of a drug-addled comic book author with a badly-disguised fetish for bulging muscles clad in spandex. Yes, ZeroMQ sockets are the world-saving superheroes of the networking world.” (from zeromq site)
  6. Qué es ZeroMQ (ØMQ)? Una lib de sockets con “esteroides”,

    escrita por iMatrix, bajo licencia GPL v3 Desarrollada para aplicaciones financieras (Stock market, trading systems, etc) Una lib de mensajes asincrónica de alta performance Una lib pensada para sistemas distribuidos o aplicaciones concurrentes Una lib para interconectar partes Una lib pensaba con tipos de sockets y patrones Para armar topologias de red. NO TODO ES HTTP!
  7. Características de ØMQ Sockets con “esteroides” Buena documentación (a veces

    compleja de segui) Multiples medios de transportes (tcp, ipc, inproc, epgm, pgm) Orientado a mensajes atómicos / Concepto de mensajes multipart Confiable, eficiente y escalable API similar a POSIX sockets “Poller” incluido similar a poll() Manejo de I/O en background Agnóstico del lenguaje Permite arquitecturas con componentes dinámicos
  8. Conociendo la API de ØMQ Context: Contenedor y fábrica de

    los socket creados por proceso. Contiene las opciones Socket-type: Tipo de socket (REQ, REP, PUSH, PULL, PUB, SUB, …) Socket: Abstracción sobre socket de bajo nivel Transports: Mecanismo de paso de mensajes (“ipc”,”tpc”, “inproc”, “epgm”, “pgm”) API: socket(), bind(), connect(), recv*() y send*(), setsockopt()
  9. Conociendo la API de ØMQ extensión La API de Python

    tiene más métodos del tipo “shortcuts” ♥♥♥ Familia de recv() recv_string(), recv_json(), recv_pyobj(), recv_multipart(), recv_serialized() Familia de send() send_string(), send_json(), send_pyobj(), send_multipart(), send_serialized()
  10. ØMQ Devices Necesitamos alguna “parte estable” ----> “ZeroMQ Devices” al

    rescate Queue Forwarder Streamer zmq.device(type, front_sock, back_sock) Poseen loop propio (while True) que bloquea. Utiliza Poller.poll()
  11. ØMQ Devices Regla general: “La parte estable” hace bind() “La

    parte dinámica” hace connect() ZeroMQ está preparado para tener arquitecturas dinámicas. Qué pasa si las dos partes son dinámicas? En algunos casos no podemos poner una “dirección” para conectarnos...
  12. Forwarder Actúa como “la parte estable” entre publicadores (PUB) y

    subscriptores (SUB) dinámicos zmq.device(zmq.FORWARDER, sub_sock, pub_sock)
  13. Links útiles ZMQ Guia ZMQ API para C! ZMQ +

    RPC Python binding! ZQM + Python + asyncio ZMQ is the answer! Ian barber Building Distributed Systems with Node.js and ØMQ