El trabajo de un snitch es determinar la proximidad del host relativa para cada nodo en un clúster, que se utiliza para determinar de qué nodos leer y escribir. Los snitches recopilan información sobre la topología de su red para que Cassandra pueda enrutar las solicitudes de manera eficiente. El snitch descubrirá dónde están los nodos en relación con otros nodos.
A modo de ejemplo, examinemos cómo participa el snitch en una operación de lectura. Cuando Cassandra realiza una lectura, debe contactar una cantidad de réplicas determinadas por el nivel de consistencia. Para admitir la velocidad máxima para las lecturas, Cassandra selecciona una única réplica para consultar el objeto completo y solicita réplicas adicionales para los valores de hash para garantizar que se devuelva la última versión de los datos solicitados. La función de el snitch es ayudar a identificar la réplica que devolverá este dato de forma rápida, y esta es la réplica que se consulta para obtener los datos completos.
El snitch predeterminado (el SimpleSnitch) es la topología inconsciente; es decir, no conoce los racks y los centros de datos en un clúster, lo que lo hace inadecuado para implementaciones de centros de datos múltiples. Por esta razón, Cassandra viene con varios snitches para diferentes entornos de nube, incluyendo Amazon EC2, Google Cloud y Apache Cloudstack.
Los snitches se pueden encontrar en el paquete org.apache.cassandra.locator. Cada snitch implementa la interfaz IEndpointSnitch.
Si bien Cassandra proporciona una manera conectable de describir de forma estática la topología de su clúster, también proporciona una función llamada "snitching dinámico" que ayuda a optimizar el enrutamiento de las lecturas y escrituras a lo largo del tiempo. Así es como funciona. Su snitch seleccionado se envuelve con otro snitch llamado DynamicEndpointSnitch. El snitch dinámico obtiene su comprensión básica de la topología de la snitch seleccionada. A continuación, supervisa el rendimiento de las solicitudes a los otros nodos, e incluso realiza un seguimiento de cosas como qué nodos realizan la compactación. Los datos de rendimiento se utilizan para seleccionar la mejor réplica para cada consulta. Esto permite a Cassandra evitar las solicitudes de enrutamiento a réplicas que tienen un bajo rendimiento.
La implementación de snitching dinámico utiliza una versión modificada del mecanismo de detección de fallas Phi utilizado por los Gossiper(que hablamos el post anterior). El "umbral de maldad" es un parámetro configurable que determina cuánto peor debe realizar un nodo preferido que el nodo con el mejor desempeño para perder su estado preferencial. Las puntuaciones de cada nodo se restablecen periódicamente para permitir que un nodo con un rendimiento deficiente demuestre que se ha recuperado y reclamar su estado preferido.