me di cuenta de que una toma PUB zeromq se amortigua todos los datos de salida si se trata de conectar, por ejemplotoma PUB ZeroMQ amortigua todo mi yendo de datos cuando se está conectando
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.connect("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.bind("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print sub.recv()
El sub une después de esos mensajes, debería descartarse, porque PUB debería eliminar los mensajes si no hay nadie conectado a él. Pero en lugar de eliminar mensajes, almacena todos los mensajes.
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
hi
Como se puede ver, los que "un mensaje no se debe dejar caer" son amortiguados por el zócalo, una vez que se conecta, se les vaciar a la toma SUB. Si me enlace en el socket PUB y me conecto en el socket SUB, entonces funciona correctamente.
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.bind("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.connect("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print repr(sub.recv())
Y sólo se puede ver la salida
'hi'
Este tipo de comportamiento extraño causar un problema, buffers todos los datos de un conector de conexión, tengo dos servidores, el servidor A publica datos al servidor B
Server A -- publish --> Server B
Funciona bien si el servidor B se conecta. Pero, ¿qué sucede si inicio el Servidor A y no comienzo el Servidor B?
Como resultado, el conector PUB de conexión en el servidor A mantiene todos esos datos, el uso de la memoria se vuelve más y más alto.
Aquí está el problema, ¿este tipo de comportamiento es un error o una característica? Si es una función, ¿dónde puedo encontrar un documento que mencione este comportamiento? ¿Y cómo puedo detener la conexión de los buffers de PUB a todos los datos?
Gracias.
Sé que puedo configurar el HWM para limitar el número de mensaje en el búfer. Pero no resuelve el problema, la forma en que PUB maneja el estado de HWM es soltar nuevos mensajes. Significa que si configura HWM, solo los mensajes principales se guardan en el búfer. Lo que estoy escribiendo es un sistema de transmisión de audio. Este tipo de comportamiento lo hace muy molesto de usar. Digamos que usted envía mensajes [1, 2, 3, 4] y luego HWM se configuró en 2, luego el zócalo almacenará en búfer [1, 2] para usted, todos los mensajes nuevos se descartan. Pero para la transmisión de audio, la parte más importante son los nuevos datos que se aproximan. ¿Hay alguna forma de ajustar cómo HWM elimina el mensaje? –
Ah, entonces quieres decir que el comportamiento que te gustaría es que si HWM está configurado en 2 y envías [1, 2, 3, 4], entonces debería caer [1, 2] y mantener [3, 4], pero luego si enviaste 5, ¿debería dejar 3 y terminar con [4, 5]? No creo que ese comportamiento exista en ZMQ. – aculich
Esto es muy interesante. Ciertamente, para algunas aplicaciones sería necesario tener la habilidad de soltar los mensajes "antiguos" (la telefonía IP viene a la mente como un ejemplo común). –