Como hacer socket de cliente pub ZMQ buffer de mensajes mientras socket del servidor secundario se ha reducido

vach:

Dadas 2 aplicaciones en las que la aplicación A se utiliza un cliente editor de datos contenciosamente corriente a la aplicación B que tiene un socket de servidor secundario a aceptar que los datos, ¿cómo podemos configurar socket de cliente pub de aplicación A tal que cuando B es no esté disponible (al igual que su bienestar redistribuidos, renovadas tampones) a todos los mensajes pendientes y cuando B se convierte en mensajes almacenados temporalmente disponibles Tras pasar por socket y pone al día con la corriente en tiempo real?

En pocas palabras, ¿cómo podemos hacer PUB mensajes tampón socket de cliente con algún límite de tiempo SERVIDOR SUB no está disponible?

El comportamiento por defecto para el cliente PUB es caer en estado de silencio, pero sería fantástico si pudiéramos cambiar eso a un búfer de tamaño límite, es posible que con ZMQ? o tengo que hacerlo a nivel de aplicación ...

He tratado de establecer HWM y descansar en mis tomas de corriente, pero si no estoy equivocada que sólo sean responsables de casos de consumo lento, donde mi editor está conectado al suscriptor, pero suscriptor es tan lento que comienza editor para amortiguar los mensajes (voluntad hwm limitar el número de esos mensajes) ...

Estoy usando jeromqdesde que estoy orientando plataforma de JVM.

vach:

Estoy publicando una actualización rápida ya que las otras dos respuestas (aunque muy informativo eran realmente mal), y yo no quiero que otros sean mal informados de mi respuesta aceptada. No sólo se puede hacer esto con ZMQ, en realidad es el comportamiento por defecto .

El truco es que si el cliente editor no conectado con el servidor de abonados antes de que continúa descendiendo mensajes (y es por eso que estaba pensando que no almacena los mensajes), pero si sus conecta editor al suscriptor y se reinician de suscriptores, Publisher amortiguar mensajes hasta que se alcanza HWM que es exactamente lo que pedí ... por lo que en breve editor quiere saber que hay alguien en el otro extremo de aceptar mensajes sólo después de que almacenará los mensajes ...

Aquí hay un código de ejemplo que muestra esto (puede que tenga que hacer algunas ediciones básicas para compilarlo).

Solía sólo que esta dependencia org.zeromq:jeromq:0.5.1.

zmq-publisher.kt

fun main() {
   val uri = "tcp://localhost:3006"
   val context = ZContext(1)
   val socket = context.createSocket(SocketType.PUB)

   socket.hwm = 10000
   socket.linger = 0
   "connecting to $uri".log()
   socket.connect(uri)

   fun publish(path: String, msg: Msg) {
      ">> $path | ${msg.json()}".log()
      socket.sendMore(path)
      socket.send(msg.toByteArray())
   }

   var count = 0

   while (notInterrupted()) {
      val msg = telegramMessage("message : ${++count}")
      publish("/some/feed", msg)
      println()

      sleepInterruptible(1.second)
   }
}

y por supuesto zmq-subscriber.kt


fun main() {
   val uri = "tcp://localhost:3006"
   val context = ZContext(1)
   val socket = context.createSocket(SocketType.SUB)

   socket.hwm = 10000
   socket.receiveTimeOut = 250

   "connecting to $uri".log()
   socket.bind(uri)

   socket.subscribe("/some/feed")

   while (true) {
      val path = socket.recvStr() ?: continue
      val bytes = socket.recv()
      val msg = Msg.parseFrom(bytes)
      "<< $path | ${msg.json()}".log()
   }
}

Pruebe a ejecutar por primera vez sin editor de abonados, a continuación, cuando se lanza suscriptor se ha perdido todos los mensajes hasta ahora ... ahora sin necesidad de reiniciar editor, parada de suscriptores de espera por algún tiempo y comenzar de nuevo.

He aquí un ejemplo de una de mis servicios que realmente se benefician de esta ... Esta es la estructura [current service]sub:server <= pub:client[service being restarted]sub:server <=* pub:client[multiple publishers]

Debido a que recomienzo el servicio en el medio, todos los editores comienzan amortiguar sus mensajes, el servicio final que estaba observando ~ 200 mensajes por segundo observa gota a 0 (los que 1 ó 2 son los latidos del corazón) y luego la explosión repentina de más de 1000 mensajes de entrar, porque todos los editores vacían sus memorias intermedias (reinicio tomó alrededor de 5 segundos) ... estoy realmente no perder un solo mensaje aquí ...

introducir descripción de la imagen aquí

Tenga en cuenta que debe tener subscriber:server <= publisher:clientpar (de esta manera editor sabe "sólo hay un lugar en el que necesito para entregar estos mensajes a" (se puede tratar vinculante sobre el editor y la conexión de abonados, pero no podrá ver los mensajes editor tampón más simplemente porque su cuestionable si suscriptor que acaba de desconectar lo hizo porque ya no necesita los datos o porque no)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=314675&siteId=1
Recomendado
Clasificación