tutorial kafka descargar cast apache-zookeeper

apache zookeeper - kafka - Preocupaciones sobre la receta de bloqueo del zookeeper



zookeeper tutorial (2)

... Pero, Zookeeper puede pensar que la sesión del cliente1 está agotada, y luego ...

De la documentación de Zookeeper:

  • La eliminación de un nodo solo provocará que un cliente se active, ya que cada nodo está vigilado exactamente por un cliente. De esta forma, evitas el efecto rebaño.
  • No hay votaciones ni tiempos de espera.

Así que no creo que el problema que describen surja. Me parece que pensé que podría haber un riesgo de colgar bloqueos si algo les sucede a los clientes que los crean, pero el escenario que describe no debería surgir.

Mientras leía la receta para la cerradura del ZooKeeper, me confundí. Parece que esta receta para bloqueos distribuidos no puede garantizar "cualquier instantánea en el tiempo, dos clientes creen que tienen el mismo bloqueo" . Pero dado que ZooKeeper es tan ampliamente adoptado, si hubo tales errores en la documentación de referencia, alguien debería haberlo señalado hace mucho tiempo, así que, ¿qué entendí mal?

Citando la receta de los candados distribuidos :

Cabellos

Bloqueos totalmente distribuidos que son globalmente síncronos, lo que significa que en cualquier instantánea en el tiempo, no hay dos clientes que crean que tienen el mismo bloqueo . Estos se pueden implementar utilizando ZooKeeeper. Al igual que con las colas de prioridad, primero defina un nodo de bloqueo.

  1. Llame a create () con un nombre de ruta de " locknode / guid-lock-" y la secuencia y los indicadores efímeros establecidos.
  2. Llame a getChildren () en el nodo de bloqueo sin configurar el indicador de observación (esto es importante para evitar el efecto de rebaño).
  3. Si la ruta de acceso creada en el paso 1 tiene el sufijo de número de secuencia más bajo, el cliente tiene el bloqueo y el cliente sale del protocolo.
  4. Las llamadas del cliente existen () con la marca de observación establecida en la ruta en el directorio de bloqueo con el siguiente número de secuencia más bajo.
  5. si existe () devuelve falso, vaya al paso 2. De lo contrario, espere una notificación para la ruta del paso anterior antes de ir al paso 2.

Considere el siguiente caso:

  • Client1 adquirió con éxito el bloqueo (en el paso 3), con el nodo ZooKeeper "locknode / guid-lock-0";
  • Client2 creó el nodo "locknode / guid-lock-1", no pudo obtener el bloqueo y ahora está viendo "locknode / guid-lock-0";
  • Más tarde, por alguna razón (por ejemplo, la congestión de la red), Client1 no envía un mensaje de latido al clúster de ZooKeeper a tiempo, pero Client1 todavía está trabajando, suponiendo erróneamente que aún mantiene el bloqueo.
  • Pero, ZooKeeper puede pensar que la sesión de Client1 se ha agotado, y luego

    1. eliminar "locknode / guid-lock-0",
    2. enviar una notificación a Client2 (o tal vez enviar primero la notificación),
    3. pero no puede enviar una notificación de "tiempo de espera de sesión" a Client1 a tiempo (por ejemplo, debido a la congestión de la red).
  • Client2 recibe la notificación, va al paso 2, obtiene el único nodo "" locknode / guid-lock-1 ", que se creó a sí mismo; por lo tanto, Client2 asume que mantiene el bloqueo.
  • Pero al mismo tiempo, Client1 asume que mantiene el bloqueo.

¿Es este un escenario válido?


El escenario que describas podría surgir. El Cliente 1 piensa que tiene el bloqueo, pero de hecho su sesión ha caducado, y el Cliente 2 adquiere el bloqueo.

La biblioteca del cliente de ZooKeeper informará al Cliente 1 que su conexión se ha desconectado (pero el cliente no sabe que la sesión ha expirado hasta que el cliente se conecta al servidor), por lo que el cliente puede escribir algo de código y asumir que su bloqueo se ha perdido Si ha estado desconectado demasiado tiempo. Pero el hilo que utiliza el bloqueo debe comprobar periódicamente que el bloqueo sigue siendo válido, lo que es intrínsecamente aleatorio.