19
GORM for Cassandra @rafbermudez

Gorm for cassandra

Embed Size (px)

Citation preview

GORM for

Cassandra

@rafbermudez

¿Y tú?

Soy un yonki de Groovy

Cassandra, te quiero conocer

¿Cómo he llegado hasta aquí?

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

APACHE CASSANDRAEN

8 PASOS

Intro

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

● Sistema NoSQL, distribuído y open source

● Objetivo: Big Data○ Escalabilidad y Disponibilidad

● Topología en Anillo○ Masterless ○ Clustering Column

● INSERT Y DELETE○ INSERT = UPDATE (casi)

● CQL (Cassandra Query Language)

Row oriented or column oriented?

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

● rows oriented○ Row id, Columnas diferentes

apple -> colour weight price variety

"red" 100 40 "Cox"

orange -> colour weight price origin

"orange" 120 50 "Spain"

● column oriented○ Column id, 1 fila y millones de columnas

temperature -> 2012-09-01 2012-09-02 2012-09-03 ...

40 41 39 ...

● CASSANDRA = rows contain columns!!○ Idénticas columnas○ Acceso fila + columna

CAP Theorem

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

¿Aquí?

● PRIMARY KEY○ Clave primaria○ Simple o compuesta

● PARTITION KEY○ Distribuye los datos por los nodos○ primary key simple = partition key○ primary key compuesta = 1er atributo es la partition key

● CLUSTERING COLUMN○ Define cómo se ordenan los datos en el nodo○ son los siguientes atributos de una primary key compuesta

Distribución de los datos en el anillo

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

Replication factor = 1

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

Replication factor = multi

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

Consistency Level

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

● N = Determina el número n de réplicas que tienen que validar una lectura

○ N = QUORUM = mayoría simple

Un poquito más complejo...y eficaz

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

● Realmente usa virtual nodes

¡No muerde!

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra

● CREATE TABLECREATE TABLE users (

user_name varchar PRIMARY KEY,

password varchar,

gender varchar,

birth_year bigint

);

● SELECTSELECT * FROM users

WHERE gender = 'male' LIMIT 50000;

● UPDATEUPDATE users SET password = '123456' WHERE user_name = 'rafbermudez'

❏ Apache Cassandra

❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra

CASSANDRA Y GROOVY

● Astyanax Cassandra Java Client (Netflix)

● Datastax Cassandra Java driver

● GORM 5 for Cassandra○ Basado en últimos drivers de Datastax○ Soporte para:

■ Grails 2, Grails 3, SpringBoot■ dynamic finders, criteria and named queries■ Cassandra schema creation■ Marshalling from Cassandra to Groovy/Java types and back again■ ...

Posibilidades

❏ Apache Cassandra

❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra

● GORM for Hibernate○ Soporta Hibernate 3,4 y 5○ Reescrito basándose en Traits

● GORM for Neo4j○ Neo4j 2.3.x○ Mapea “trivialmente” modelos de dominio a grafos

● MongoDB○ Reescrito basándose en MongoDB 3.x driver○ Mejora en la conversión: documento <-> objeto

● GORM 5 for Cassandra

GORM 5

❏ Apache Cassandra

❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra

● Domain Class○ Crea un UUID autoincremental internamente

class Person { String firstName String lastName}

new Person(firstName: "Fred", lastName: "Flintstone").save()

● Cassandra e Hibernateclass Person {

UUID id String firstName String lastName

static mapping = { id generator:’uuid2’ }

}static mapWith = "cassandra"

Clases de dominio

❏ Apache Cassandra

❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra

class Person { String firstName String lastName

}

● Caso 1: 72% de Juanes en Españadef people = Person.findAllByFirstName("Juan")

def people = Person.findAllByFirstName("Juan", [allowFiltering:true])

def people = Person.findAllByFirstName("Juan", [allowFiltering:true, fetchSize: 200])

● Caso 2: Muy pocos Wallys

def wallys = Person.

findAllByFirstNameAndAgeLessThanEquals('Wally', [allowFiltering:true])

def wallys = Person.

findAllByFirstNameAndAgeLessThanEquals('Wally', [allowFiltering:true, max:5])

Crea un índice

Consultas

❏ Apache Cassandra

❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra

● FetchSize y AllowFiltering

● No existe offset

● También provee una low-level APIdef cassandraTemplate

String personCQL = "SELECT firstName FROM person"List personList = cassandraTemplate.select(personCQL, Person.class)

Consultas

❏ Apache Cassandra

❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra

❏ Apache Cassandra■ Intro■ Key-value vs Column■ CAP■ Partition Key■ Replication Factor■ Consistency Level■ Virtual Nodes■ Example

❏ Groovy + Cassandra■ Posibilidades■ Gorm 5■ Gorm 5 for Cassandra

Finished! Thank you!