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"
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
Usa funciones monótonas para resolver confictos de actualización
GCounter
, PNCounter
GSet
, ORSet
ORMap
, ORMultiMap
, LWWMap
, PNCounterMap
LWWRegister
, Flag
Por defecto se utiliza Akka Distributed Data para guardar el estado del Cluster Sharding
Local
WriteLocal
. Escribir sólo en la replica local y diseminado después
por gossipReadLocal
. Leer sólo el valor de la replica local
To(n)
WriteTo(n)
. Escribir inmediatamente en al menos n
replicasReadTo(n)
. Valor leído y combinado en al menos n
replicas
Majority
WriteMajority
. Escribir inmediatamente en N/2 + 1
replicas
(N es el número de nodos)ReadMajority
Valor leído y combinado en al menos N/2 + 1
replicas
All
WriteAll
. Escribir inmediatamente en todas las replicasReadAll
. Valor leído y combinado en todas las replicas
"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
Los nodos inaccesibles son dados de baja al cabo de un tiempo
configurable.
No es viable:
Utilizando akka-management
Akka split brain resolver
Escuchando eventos del cluster
Las decisiones deben ser tomadas en un tiempo finito.
Las decisiones deben ser tomadas en un tiempo finito.
Las decisiones deben ser tomadas en un tiempo finito.
Quorum estático. Las particiones que no cumplan el número mínimo de nodos serán eliminadas del cluster.
Mantener la mayoría. Se mantendrá la partición que tenga mayor número de nodos.
Quorum estático. Las particiones que no cumplan el número mínimo de nodos serán eliminadas del cluster.
Mantener la mayoría. Se mantendrá la partición que tenga mayor número de nodos.
El más antiguo. Mantener la partición que contiene el nodo más antiguo.
Quorum estático. Las particiones que no cumplan el número mínimo de nodos serán eliminadas del cluster.
Mantener la mayoría. Se mantendrá la partición que tenga mayor número de nodos.
El más antiguo. Mantener la partición que contiene el nodo más antiguo.
Mantener al árbitro. La partición que sobrevive es la que contiene a un nodo árbitro que se define por configuración.
Un ejemplo bancario: cuentas corrientes y transferencias.
1 / 56