Que es Akka Sharding y su relación con Domain Driven Development.
Los fundamentos técnicos en los que está soportado
Ejemplos prácticos (codificados en Scala)
"[...] Los actores son objetos que encapsulan estado y comportamiento y que sólo se comunican intercambiando mensajes [...]"*
Derivado de esto: implica también"identidad"
Todos los actores tienen su propio buzón donde se almacenan los mensajes.
Es en realidad una URI o dirección lógica del actor. Es serializable y se puede enviar entre actores. Esto permite la ubicación transparente en el sistema de actores.
Es el encargado de gestionar los mensajes con un grupo de hilos
asignado.
Símil de la "torre de control": los hilos son las pistas de
aterrizaje, los mensajes son los aviones que esperan a tomar
tierra y el dispatcher sería la torre de control.
Se puede asignar un dispatcher a uno o varios actores.
Akka "out of the box" implementa patrones de estabilidad com "Bulkheading", "Circuit breaker", "bounded mailbox", Supervisores, Confirmación de entrega (confirmando la entrega de al menos un mensaje), etc..
"[...] implementar entidades en software significa crear identidad [...]" *
En resumen : Además de estado y lógica sólo se puede acceder a través de una interfaz pública que enmascara la lógica interna.
Ahora nos podemos hacer la pregunta
Entidades reflejan estado y comportamiento
Los actores también
Cada instancia de una entidad es única en el dominio
Un actor es único en el sistema de actores
Tienen una interfaz pública de acceso
"[..] Akka Cluster proporciona un servicio de cluster
descentralizado basado en peer-to-peer, tolerante a fallos, sin
ningún punto único de fallos o cuellos de botella.
Lo hace usado protocolos gossip y un detector automático de
fallos[..]"
No existen maestros/esclavos ← Particionado
Existen réplicas ← Alta disponibilidad
No conserva la consistencia secuencial ← Consistencia "relajada"
Intercambio de mensajes gossip entre réplicas.
Imaginemos tres nodos A
, B
y C
y una sesión gossip entre
A
, B
Log y sumario de A
de un determinado valor antes del
intercambio gossip
+===++----+----+----+ +===++----+
| A || a1 | a2 | a3 | → | A || a3 |
+===++----+----+----+ +===++----+
| B || b1 | → | B || b1 |
+===++----+ +===++----+
| C || c1 | → | C || c1 |
+===++----+ +===++----+
Log Sumario
Log y sumario de B
del mismo valor antes del intercambio
gossip
+===++----+ +===++----+
| A || a1 | → | A || a1 |
+===++----+----+ +===++----+
| B || b1 | b2 | → | B || b2 |
+===++----+----+----+ +===++----+
| C || c1 | c2 | c3 | → | C || c3 |
+===++----+----+----+ +===++----+
Log Sumario
Tres nodos A
, B
y C
. Sesión gossip entre A
, B
Intercambio de sumarios y valores entre los dos nodos
NODO A NODO B
+===++----+ +===++----+
| A || a3 | a2, a3 → | A || a1 |
+===++----+ +===++----+
| B || b1 | ← b2 | B || b2 |
+===++----+ +===++----+
| C || c1 | ← c2, c3 | C || c3 |
+===++----+ +===++----+
Tres nodos A
, B
y C
. Sesión gossip entre A
, B
NODO A NODO B
+===++----+----+----+ +===++----+----+----+
| A || a1 | a2 | a3 | | A || a1 | a2 | a3 |
+===++----+----+----+ +===++----+----+----+
| B || b1 | b2 | | B || b1 | b2 |
+===++----+----+----+ +===++----+----+----+
| C || c1 | c2 | c3 | | C || c1 | c2 | c3 |
+===++----+----+----+ +===++----+----+----+
Log Log
"Cuando un nodo puede demostrar, que el estado del clúster que está observando, ha sido observado por todos los demás nodos del clúster"
Nodo que administra la convergencia del cluster y las transiciones de los nodos a los que pertenece.
Si hay convergencia gossip, todos los nodos saben quien es el líder.
Sólo es un rol y puede cambiar por la convergencia.
Se emiten eventos del cluster, que permiten conocer el estado de cada nodo que pueden escuchar los diferentes integrantes del cluster.
----
| |
joining > [weakly up] > | up | > leaving / exiting > down > removed
| |
----
El cluster envía mensajes periódicos de heartbeats para comprobar que otros nodos están disponibles.
Estados:
=> ureacheable
=> reacheable
Cuando por ejemplo por problemas de red parte de los nodos del cluster no pueden "ver" otros nodos del cluster.
Por lo tanto hay nodos inaccesibles.
No hay convergencia
No se puede ni añadir, ni eliminar nodos del cluster.
Se puede llegar a denegación de servicio
Utilizando akka-management
Akka split brain resolver
Escuchando eventos del cluster
La única señal para tomar decisiones: "no responder en un tiempo dado a los mensajes heartbeats".
Mantener la mayoría. Se mantendrá la partición que tenga mayor número de nodos.
Un ejemplo bancario: cuentas corrientes y transferencias.
1 / 47