python linux zeromq

python - ¿Cómo controlar la dirección IP de origen de un paquete ZeroMQ en una máquina con múltiples IP?



linux (2)

Bueno, ZeroMQ es un poco difícil de leer como un socket - "contraparte" (no lo es)

¿Por qué?

El socket clásico es un recurso gratuito para aprovechar.

ZeroMQ es una jerarquía bastante compleja de ideas y principios de comportamientos (comportamientos mejor distribuidos), que ayudan a diseñar sistemas informáticos distribuidos inteligentes, sin tocar los detalles de bajo nivel (ZeroMQ bien abstraído), que controlan el flujo real de eventos en las tormentas En condiciones difíciles, todos los sistemas informáticos distribuidos están abiertos (y deben manejarse a un nivel bajo en consecuencia, si se cumplen las abstracciones de alto nivel "prometidas" por ZeroMQ) y facilitar que las mentes de los diseñadores se concentren más bien en su su parte principal de la aplicación, no rediseñando ruedas (con todas las pruebas y errores) en tirar de cadenas de recursos O / S y servicios de sistemas de agitación para recolectar solo unos pocos tipos de frutas de bajo consumo

Por estas razones, mejor directamente, olvide que ZeroMQ es " algo parecido a un socket "

Jerarquía ZeroMQ en menos de cinco segundos

1:
ZeroMQ promete una fácil reutilización de algunos arquetipos triviales de patrones de comunicación formal escalables que ofrecen un comportamiento distribuido particular { PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP } { PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP } { PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP } .

2:
Excepto en el caso de utilizar exclusivamente un inproc:// clase de transporte sin dispositivo , en todos los demás casos, ZeroMQ necesita una o más instancias de un " motor " sintonizable: un Context( nIOthreads = N ) , N >= 1 .

3:
Teniendo esto, cualquier punto de acceso (futuro socket ) podría instanciarse, teniendo un arquetipo de comportamiento desde el momento mismo del nacimiento:

aSubscribeCHANNEL = aLocalCONTEXT.socket( zmq.SUB ) # this is NOT a <SOCKET> # ^^^^^^__________________ even it was typed in

4:
Teniendo una instancia de " Punto de acceso " lista "dentro" del " motor " local, uno puede bloquear su materialización en la realidad externa, utilizando uno o más (sí, más ... ¡GUAU! Lo que significa más cadenas entrantes en / silbatos de un solo punto de acceso "nodo de comportamiento") a cualquiera de estos métodos:
.bind( <transport-class>://<a-class-specific-address> )
o
.connect( <transport-class>://<a-class-specific-address> )

5:
Si y solo si un punto de acceso A listo para .bind() listo para RTO " es visitado " por un primer punto de acceso en vivo .connect() listo para RTO, que tiene un emparejamiento de comportamiento coincidente, el arquetipo de mensajería / señalización ZeroMQ obtiene live (nombrarlo también como un socket probablemente se usó por razones históricas, para facilitar una explicación en ocasiones)

( PUB/PUB nunca encajará, por razones obvias, mientras que PUB/SUB y muchos otros pares de arquetipos de comportamiento harán una buena combinación y formarán comportamientos mutuamente "compatibles" que finalmente se activarán y se mantendrán así)

Asi que,
¿Cómo hago lo mismo con un socket Python ZeroMQ,
dado una máquina que tiene múltiples direcciones?

Simplemente use la especificación totalmente calificada en una llamada a
.bind( "{ tcp | pgm | epgm }://<ip>:<port#>" ) y ya está.

Así de fácil.

Genial, ¿no es así?

Muchas más sorpresas agradables bajo el capó del ajuste de rendimiento, el afeitado de latencia y los ajustes de seguridad.

El método de socket .create_connection() la biblioteca estándar de Python tiene una opción de dirección de origen, para controlar qué IP de origen utiliza una conexión.

¿Cómo hago lo mismo con un socket Python ZeroMQ, dada una máquina que tiene múltiples direcciones?

En este caso, he estado usando ip addr add Linux para crear las direcciones y los arquetipos de socket PUB/SUB ZeroMQ.


Al intentar .connect() un control remoto, encontré la respuesta en la documentación del protocolo , coloqué la fuente ip antes de un punto y coma en la cadena de conexión:

rc = zmq_connect( socket, "tcp://192.168.1.17:5555;192.168.1.1:5555" )

En Python, esto se ve así:

socket = zmq.Context().socket( zmq.SUB ) socket.connect( ''tcp://192.168.1.17:5555;192.168.1.1:5555'' )