MADRID · NOV 21-22 · 2014
Aplicaciones escalables en la
nube: mentiras y verdades
Enrique Catalá
MVP en SQL Server, Mentor SolidQ
@enriquecatala
Miguel Lopez
Cloud Champion, Director SolidQ
@augurarte
MADRID · NOV 21-22 · 2014
Agenda
1. Errores de diseño y arquitectura
2. Conoce la nube
MADRID · NOV 21-22 · 2014
¿Verdad o mentira?
“Puedo usar Azure para escalar hasta el
‘infinito’ mi plataforma SQL Server on-premise
a la vez que ahorro costes”
Verdad
DBreplica1
Replica1 Replica2 Replica n
DBreplica2 DBreplica3
Azure Republicador(opcional)
Transactional replication
SYNC
WANSQL1 (onpremise)
ON PREMISE Azure
Nodos secundarios replicación
Capa de base de datos, suscriptores (5s-15s delay)
SQL Standard Edition
Nodo publicador Instancia OnPremise que
contiene los datos maestros a replicar mediante replicación transaccional
MADRID · NOV 21-22 · 2014
ELB / ILB
DBreplica1
Replica1 Replica2 Replica n
DBreplica2 DBreplica3
Azure Republicador(opcional)
Transactional replication
SYNC
Azure
Peticiones balanceadas automáticamente
(ILB/ELB)
Nodos secundarios replicación
Capa de base de datos, suscriptores (5s-15s delay)
SQL Standard Edition
Add-AzureInternalLoadBalancer-ServiceName $svc-InternalLoadBalancerName $ilb
MADRID · NOV 21-22 · 2014
demo
Arquitectura elástica
MADRID · NOV 21-22 · 2014
“Para implementar una aplicación Web que se
accederá de forma masiva a través de la Web,
y que gestiona contactos (o usuarios), una
base de datos SQL server o SQL Database es
la mejor opción a la hora de elegir la capa de
datos.”
¿Verdad o mentira?
Mentira
MADRID · NOV 21-22 · 2014
Bases de datos y cargas de trabajo
en aplicaciones en la nube
MADRID · NOV 21-22 · 2014
NoSQL Key-Value
Azure Table Storage
Caso de cliente con usuarios/grupos en tablas
https://haveibeenpwned.com/HowFastIsAzureTableStorage/[email protected]
MADRID · NOV 21-22 · 2014
Algo diferente de programar…
public class BreachedAccount : TableEntity { public BreachedAccount() { } public string Websites { get; set; } }
var breachedAccount = new BreachedAccount { PartitionKey = “undominio.com”, RowKey = “un-correo01", Websites = "Adobe;Stratfor" };
var insertOperation = TableOperation.Insert(breachedAccount); table.Execute(insertOperation);
var batch = new TableBatchOperation(); batch.Insert(breachedAccount1); batch.Insert(breachedAccount2); batch.Insert(breachedAccount3); table.ExecuteBatch(batch);
MADRID · NOV 21-22 · 2014
demo
NoSQL - Azure Table Storage
MADRID · NOV 21-22 · 2014
¿Verdad o mentira?
“Hablando de rendimiento, Azure tiene máquinas tan potentes, que con sólo elegir el tipo de máquina adecuada para mi App, puedo ejecutar cualquier aplicación que quiera”
Verdad a medias:
La frase anterior es
cierta, pero…”La
CPU es muy valiosa”
VM Size Cores RAM Local SSD
Standard_G1 2 28 Gb 406 Gb
Standard_G2 4 56 Gb 812 Gb
Standard_G3 8 112 Gb 1,630 Gb
Standard_G4 16 224 Gb 3,250 Gb
Standard_G5 32 448 Gb 6,500 Gb
MADRID · NOV 21-22 · 2014
La CPU es muy valiosa
MáquinaPuntuación
single-thread
Puntuación
multi-threadDescripción
Portatil Enrique Catalá 1911 4826 Intel i7 1.73Ghz
Entorno VM A3 (4cores) 1066 3635 AMD Opteron 4171 2.1Ghz
Entorno VM A4 (8cores) 1072 6617 AMD Opteron 4171 2.1Ghz
Entorno VM A7 (AMD) 1077 5622 AMD Opteron 4171 2.1Ghz
Entorno VM A7 (Intel) 1115 6680 Intel Xeon E5-2660 2.2Ghz
Entorno A9 (8 cores) 2460 10580 Intel Xeon E5-2670 2.6Ghz
Entorno VM D14 (16 cores) 1857 21444 Intel Xeon E5-2660 @ 2.20 GHz
* Benchmark no oficial y susceptible de cambios
MADRID · NOV 21-22 · 2014
La CPU es muy valiosa
Azure A4
OnPremise
Azure A4
OnPremise
Azure A4
OnPremise
MADRID · NOV 21-22 · 2014
La CPU es muy valiosa
• List<T> -> O(n)
• Dictionary<T,U> -> O(1)
MADRID · NOV 21-22 · 2014
La CPU es muy valiosa
No olvides optimizar T-SQL, importa ahora
todavía mas
MADRID · NOV 21-22 · 2014
“En Azure podemos usar Azure Federations para
montar una aplicación multi-organización (tenant)
basada en SQL Database que pueda escalar la
capa de datos, incluso por diferentes regiones”
¿Verdad o mentira?
mentira
MADRID · NOV 21-22 · 2014
Escalabilidad de SQL Database
MADRID · NOV 21-22 · 2014
Administrador de mapeo de shards
MADRID · NOV 21-22 · 2014
SQL Database Elastic Scale
No más federaciones (no soportado)
Database Sharding
Soporte API .NET
Soporte API PowerShell / Automation
Soporte migración desde Federations
MADRID · NOV 21-22 · 2014
demo
SQL DB Elastic Scale
Mover datos entre shards
MADRID · NOV 21-22 · 2014
¿Verdad o mentira?
“Es preferible hacer menos peticiones a BBDD
que devuelvan mas filas vs muchas peticiones
devolviendo pocas filas”
Verdad: El coste de round-trip es muy elevado
MADRID · NOV 21-22 · 2014
¿Verdad o mentira?
“Los ORM son necesarios en el desarrollo
cloud porque facilitan el desarrollo aunque
perdamos visibilidad de lo que hace el código
por debajo”
Mentira
-Los ORM no escalan, es así de simple
-Entity Framework es mi amigo
MADRID · NOV 21-22 · 2014
Entity Framework: Malos usos
Usar el método .Contains() recompilará
siempre una query EF
MADRID · NOV 21-22 · 2014
Entity Framework: ¿y ahora qué?
Después de 18 meses de duro trabajo, la
aplicación no escala…¿qué hacemos?
Librería Método ¿Qué hace?
System.Data.Entity.Core.
Query.PlanCompiler.Pla
nCompiler
Compile(cqt.DbCommandTree ctree, out
List<ProviderCommandInfo> providerCommands,
out ColumnMap resultColumnMap, out int
columnCount,
out Set<md.EntitySet> entitySets)
IMPORTANTE: Compila query hacia SQL Server.
Coste de compilación. Aquí generalmente es donde
debemos poner esfuerzos en optimizar linq
System.Data.Entity.Core.
Objects.Elinq.CompiledE
LinqQueryState
GetExecutionPlan(MergeOption? forMergeOption) Obtener plan de ejecución ya compilado
previamente
System.Data.Entity.Core.
Objects.Elinq.ELinqQuer
yState
GetExecutionPlan(MergeOption? forMergeOption) Obtener plan de ejecución todavía no compilado
System.Data.Entity.Core.
Objects.ObjectQuery<T>
GetResults(MergeOption? forMergeOption) IMPORTANTE:Obtiene datos. Incluye datos
GetExecutionPlan, Compile y el coste de
materializar incluido. Es el coste total
MADRID · NOV 21-22 · 2014
Entity Framework: ¿y ahora qué?
Después de 18 meses de duro trabajo, la
aplicación no escala…¿qué hacemos?
Librería Método ¿Qué hace?
System.Data.Entity.Core.Qu
ery.PlanCompiler.PlanCom
piler
Compile(cqt.DbCommandTree ctree, out
List<ProviderCommandInfo> providerCommands, out
ColumnMap resultColumnMap, out int columnCount,
out Set<md.EntitySet> entitySets)
IMPORTANTE: Compila query hacia SQL Server. Coste
de compilación. Aquí generalmente es donde debemos
poner esfuerzos en optimizar linq
System.Data.Entity.Core.Obj
ects.Elinq.CompiledELinqQu
eryState
GetExecutionPlan(MergeOption? forMergeOption) Obtener plan de ejecución ya compilado previamente
System.Data.Entity.Core.Obj
ects.Elinq.ELinqQueryState
GetExecutionPlan(MergeOption? forMergeOption) Obtener plan de ejecución todavía no compilado
System.Data.Entity.Core.Obj
ects.ObjectQuery<T>
GetResults(MergeOption? forMergeOption) IMPORTANTE:Obtiene datos. Incluye datos
GetExecutionPlan, Compile y el coste de materializar
incluido. Es el coste total
MADRID · NOV 21-22 · 2014
Entity Framework: ¿y ahora qué?
Pero descuida, todavía se puede poner peor
1. Mapeos query linq – query t-sql complicados¿alguien ha dicho la palabra “interceptor”?
2. ¿Configuraste tu caché de queries en EF de forma adecuada?
¿Cómo?
3. ¿Utilizas IQueriable como si no hubiera un mañana?Si una de las queries linkadas se recompila, todas las demás
también
…Leerse: “Performance Considerations for Entity Framework 4, 5, and 6”
MADRID · NOV 21-22 · 2014
Q&A
Dudas, cuestiones, inquietudes?
MADRID · NOV 21-22 · 2014
GRACIAS!
Enrique Catalá
MVP en SQL Server, Mentor SolidQ
@enriquecatala
Miguel Lopez
Cloud Champion, Mentor SolidQ
@augurarte
MADRID · NOV 21-22 · 2014
Grab that keyboard and start blowing brains
out.
Remember: this template is also available online.
Now it’s your turn