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.

    View Slide

  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….

    View Slide

  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...

    View Slide

  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

    View Slide

  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)

    View Slide

  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!

    View Slide

  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

    View Slide

  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()

    View Slide

  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()

    View Slide

  10. Algunos patrones incluidos en ØMQ

    View Slide

  11. REQ/REP (Request-Response sincrónico)

    View Slide

  12. PUB/SUB (datos unidireccionales)
    Es mandatorio que el SUB
    Se subscriba.
    “topic”/”wildcard”

    View Slide

  13. PUSH/PULL (Pipeline)
    PUSH hace distribución
    Round-Robin

    View Slide

  14. Ø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()

    View Slide

  15. Ø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...

    View Slide

  16. Forwarder
    Actúa como “la parte estable” entre publicadores (PUB) y subscriptores (SUB)
    dinámicos
    zmq.device(zmq.FORWARDER, sub_sock, pub_sock)

    View Slide

  17. Muchas gracias!
    ¿Preguntas?
    while not manos.dormidas:
    publico.aplaudir()
    orador.decir(‘Gracias’)
    Martin Alderete
    @alderetemartin

    View Slide

  18. 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

    View Slide