PILARES DA ESCALABILIDADE
Estratégias de Otimização e Melhoria de Performance
Slide 2
Slide 2 text
o hype
venceu…
Slide 3
Slide 3 text
Hype-Driven Development
https://blog.daftcode.pl/hype-driven-development-3469fc2e9b22
Slide 4
Slide 4 text
No content
Slide 5
Slide 5 text
No content
Slide 6
Slide 6 text
…e de todas as modas
Slide 7
Slide 7 text
No content
Slide 8
Slide 8 text
https://deniseyu.io/art/
Slide 9
Slide 9 text
https://deniseyu.io/art/
Slide 10
Slide 10 text
No content
Slide 11
Slide 11 text
Se você não tem pré-
requisito de
desempenho ou
throughput então você
não tem problema de
escala.
Slide 12
Slide 12 text
No content
Slide 13
Slide 13 text
Microservices não
existe para escalar
aplicações, mas
sim para escalar
times.
Slide 14
Slide 14 text
https://www.youtube.com/watch?v=GBTdnfD6s5Q
Slide 15
Slide 15 text
https://www.youtube.com/watch?v=GBTdnfD6s5Q
“ Eu não escrevi um livro
sobre microservices, mas sim
sobre como você arquiteta
para Entrega Contínua. ”
— Sam Newman
Slide 16
Slide 16 text
No content
Slide 17
Slide 17 text
No content
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
The monolith to microservices
SPECTRUM
https://chrisscott.me/the-monolith-to-microservice-spectrum/
Slide 20
Slide 20 text
The monolith to microservices
SPECTRUM
https://chrisscott.me/the-monolith-to-microservice-spectrum/
Slide 21
Slide 21 text
The monolith to microservices
SPECTRUM
https://chrisscott.me/the-monolith-to-microservice-spectrum/
Slide 22
Slide 22 text
The monolith to microservices
SPECTRUM
https://chrisscott.me/the-monolith-to-microservice-spectrum/
Slide 23
Slide 23 text
Um bom arquiteto escolhe
tecnologias por suas
DESVANTAGENS
List produtos = //...
for (Produto p : produtos) {
p.setNome(p.getNome()
.toUpperCase());
}
Atualizando várias entidades
Slide 174
Slide 174 text
UPDATE produto SET nome = ? WHERE id = ?
Params: [('PROD.1', 1), ('PROD.2', 2), ('PROD.3', 3)]
1 roundtrip
Slide 175
Slide 175 text
List produtos = //...
for (Produto p : produtos) {
entityManager.remove(p);
}
Removendo várias entidades
Slide 176
Slide 176 text
DELETE FROM produto WHERE id = ?
Params: [(1), (2), (3)]
1 roundtrip
Slide 177
Slide 177 text
quanto menos roundtrips ao
banco, menor o response time
Slide 178
Slide 178 text
db
T = Tacq + Treq + Texec + Tres + Tidle
apresentação
negócio
persistência
Slide 179
Slide 179 text
Use Consultas Planejadas
(DTO Projections)
Slide 180
Slide 180 text
@Entity
class NotaFiscal {
…
@OneToMany
List itens;
}
Slide 181
Slide 181 text
NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
processaItensDaNota(nf);
Processando os itens de uma nota
Slide 182
Slide 182 text
Processando os itens de uma nota
NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
processaItensDaNota(nf);
Slide 183
Slide 183 text
Processando os itens de uma nota
NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
processaItensDaNota(nf);
Slide 184
Slide 184 text
SELECT nf.*
FROM NotaFiscal nf
WHERE nf.id = 42
Hibernate executa 2 selects
NotaFiscal nf = entityManger.find(NotaFiscal.class, 42);
Slide 185
Slide 185 text
SELECT nf.*
FROM NotaFiscal nf
WHERE nf.id = 42
SELECT i.*
FROM Item i
WHERE i.nota_fiscal_id = 42
Hibernate executa 2 selects
NotaFiscal nf = entityManger.find(NotaFiscal.class, 42);
processaItensDaNota(nf);
Slide 186
Slide 186 text
List notas = dao.lista();
for (NotaFiscal nf : notas) {
processaItensDaNota(nf);
}
Processando os itens de varias notas
Slide 187
Slide 187 text
Processando os itens de varias notas
List notas = dao.lista();
for (NotaFiscal nf : notas) {
processaItensDaNota(nf);
}
Slide 188
Slide 188 text
Processando os itens de varias notas
List notas = dao.lista();
for (NotaFiscal nf : notas) {
processaItensDaNota(nf);
}
Slide 189
Slide 189 text
SELECT nf.* FROM NotaFiscal nf
Hibernate executa n+1 selects
List notas = dao.lista();
Slide 190
Slide 190 text
SELECT nf.* FROM NotaFiscal nf
Hibernate executa n+1 selects
List notas = dao.lista();
for (NotaFiscal nf : notas) {
processaItensDaNota(nf);
}
SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
...
Slide 191
Slide 191 text
são muitos hits ao banco
(Select N+1)
Slide 192
Slide 192 text
são muitos hits ao banco
(Select N+1)
Slide 193
Slide 193 text
solução?
Slide 194
Slide 194 text
@Entity
class NotaFiscal {
…
@OneToMany(fetch=FetchType.EAGER)
List itens;
}
Utilizando FetchMode=EAGER
Slide 195
Slide 195 text
Hibernate executa 1 select
List notas = dao.lista();
Slide 196
Slide 196 text
SELECT nf.*, i.*
FROM NotaFiscal nf
LEFT OUTER JOIN Item i
ON nf.id = i.nota_fiscal_id
Hibernate executa 1 select
List notas = dao.lista();
Slide 197
Slide 197 text
antes de de
fi
nir um mapeamento
global deste tipo você precisa se
perguntar...
Slide 198
Slide 198 text
SEMPRE que uma Nota é carregada,
todos seus Itens também são
necessários?
Slide 199
Slide 199 text
não?
Slide 200
Slide 200 text
@Entity
class NotaFiscal {
…
@OneToMany(fetch=FetchType.LAZY)
List itens;
}
Utilizando FetchMode=LAZY
Slide 201
Slide 201 text
entityManager
.createQuery(
"SELECT n
FROM NotaFiscal n
LEFT JOIN fetch n.itens")
.getResultList();
Utilizando Join Fetch
Slide 202
Slide 202 text
entityManager
.createQuery(
"SELECT n
FROM NotaFiscal n
LEFT JOIN fetch n.itens")
.getResultList();
Utilizando Join Fetch
habilita EAGER em
mapeamentos
LAZY
Slide 203
Slide 203 text
Opa! Não para aí…
Slide 204
Slide 204 text
SEMPRE que uma Nota é carregada,
TODAS as colunas são
necessárias?
Slide 205
Slide 205 text
não?
Slide 206
Slide 206 text
List notas =
entityManager
.createQuery(
“SELECT n
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 207
Slide 207 text
List notas =
entityManager
.createQuery(
“SELECT n.numero, n.serie
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 208
Slide 208 text
List notas =
entityManager
.createQuery(
"SELECT n.numero, n.serie
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 209
Slide 209 text
List????> notas =
entityManager
.createQuery(
"SELECT n.numero, n.serie
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 210
Slide 210 text
class Devolucao {
Integer numero;
String serie;
public Devolucao(Integer n, String s) {
this.numero = n;
this.serie = s;
}
// getters e setters
}
Criando o DTO
Slide 211
Slide 211 text
List notas =
entityManager
.createQuery(
"SELECT n.numero, n.serie
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 212
Slide 212 text
List notas =
entityManager
.createQuery(
“SELECT new Devolucao(n.numero, n.serie)
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 213
Slide 213 text
SQL otimizado
List notas = //...
Slide 214
Slide 214 text
SELECT nf.numero, nf.serie
FROM NotaFiscal nf
WHERE nf.tipo = 'DEVOLUCAO'
SQL otimizado
List notas = //...
Slide 215
Slide 215 text
Opa! Ainda carrega MUITAS linhas
do banco…
Slide 216
Slide 216 text
List notas =
entityManager
.createQuery(
“SELECT new Devolucao(n.numero, n.serie)
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
Paginação
Slide 217
Slide 217 text
List notas =
entityManager
.createQuery(
“SELECT new Devolucao(n.numero, n.serie)
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.setMaxResults(100)
.getResultList();
Paginação
Slide 218
Slide 218 text
List notas =
entityManager
.createQuery(
“SELECT new Devolucao(n.numero, n.serie)
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.setMaxResults(100)
.getResultList();
Paginação
Slide 219
Slide 219 text
SQL otimizado
List notas = //...
Slide 220
Slide 220 text
SELECT nf.numero, nf.serie
FROM NotaFiscal nf
WHERE nf.tipo = ‘DEVOLUCAO'
LIMIT 100
SQL otimizado
List notas = //...
Slide 221
Slide 221 text
quanto menor a quantidade de
dados recuperados, menor o
response time
Slide 222
Slide 222 text
db
T = Tacq + Treq + Texec + Tres + Tidle
apresentação
negócio
persistência
Slide 223
Slide 223 text
Como otimizar minha query?
Slide 224
Slide 224 text
SQL Nativo
(deixe seu banco trabalhar)
Slide 225
Slide 225 text
Stored Procedures
(leve o processamento para os
dados)
Slide 226
Slide 226 text
No content
Slide 227
Slide 227 text
DBA
(peça ajuda)
Slide 228
Slide 228 text
mesmo com todas essas
melhorias…
Slide 229
Slide 229 text
…PICOS de acessos
podem aumentar
nosso response time
Slide 230
Slide 230 text
Caching
(aliviando o banco de dados)
Slide 231
Slide 231 text
NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
Carregando uma nota por ID
Slide 232
Slide 232 text
No content
Slide 233
Slide 233 text
EM
Slide 234
Slide 234 text
Banco de Dados
EM
Slide 235
Slide 235 text
Banco de Dados
EM NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
Slide 236
Slide 236 text
SELECT nf.*
FROM NotaFiscal nf
WHERE nf.id = 42
Hibernate executa 1 select
NotaFiscal nf = entityManger.find(NotaFiscal.class, 42);
Slide 237
Slide 237 text
NotaFiscal nf1 = entityManager
.find(NotaFiscal.class, 42);
NotaFiscal nf2 = entityManager
.find(NotaFiscal.class, 42);
NotaFiscal nf3 = entityManager
.find(NotaFiscal.class, 42);
Carregando uma nota por ID
Slide 238
Slide 238 text
NotaFiscal nf1 = entityManager
.find(NotaFiscal.class, 42);
NotaFiscal nf2 = entityManager
.find(NotaFiscal.class, 42);
NotaFiscal nf3 = entityManager
.find(NotaFiscal.class, 42);
Carregando uma nota por ID
Slide 239
Slide 239 text
SELECT nf.*
FROM NotaFiscal nf
WHERE nf.id = 42
Hibernate executa 1 select
NotaFiscal nf1 = entityManger.find(NotaFiscal.class, 42);
Slide 240
Slide 240 text
SELECT nf.*
FROM NotaFiscal nf
WHERE nf.id = 42
Hibernate executa 1 select
NotaFiscal nf1 = entityManger.find(NotaFiscal.class, 42);
NotaFiscal nf2 = entityManger.find(NotaFiscal.class, 42);
// sem SQL
Slide 241
Slide 241 text
SELECT nf.*
FROM NotaFiscal nf
WHERE nf.id = 42
Hibernate executa 1 select
NotaFiscal nf1 = entityManger.find(NotaFiscal.class, 42);
NotaFiscal nf2 = entityManger.find(NotaFiscal.class, 42);
NotaFiscal nf3 = entityManger.find(NotaFiscal.class, 42);
// sem SQL
// sem SQL
Slide 242
Slide 242 text
Banco de Dados
EM
Slide 243
Slide 243 text
Banco de Dados
EM
First Level Cache
Slide 244
Slide 244 text
Banco de Dados
EM
Slide 245
Slide 245 text
Banco de Dados
EM EM EM EM
Slide 246
Slide 246 text
Banco de Dados
????
EM EM EM EM
Slide 247
Slide 247 text
Banco de Dados
Second Level Cache
EM EM EM EM
Slide 248
Slide 248 text
Banco de Dados
Second Level Cache
EM Session Session
Session
EM EM EM
First Level Cache
Slide 249
Slide 249 text
Banco de Dados
EntityManagerFactory
EM EM EM EM
Slide 250
Slide 250 text
persistence.xml
#1 habilitamos o cache
Slide 251
Slide 251 text
@Entity
@Cache(...)
class Produto {
@Id
private Long id;
private String nome;
}
#2 con
fi
guramos as entidades
Slide 252
Slide 252 text
db
T = Tacq + Treq + Texec + Tres + Tidle
apresentação
negócio
persistência
Slide 253
Slide 253 text
a consulta mais rápida é
aquela que nem chega no banco
de dados
Slide 254
Slide 254 text
db
apresentação
negócio
persistência
Slide 255
Slide 255 text
db
apresentação
negócio
persistência
Slide 256
Slide 256 text
db
negócio
persistência
apresentação
Slide 257
Slide 257 text
“There are only two hard things in
Computer Science: cache invalidation
and naming things.”
— Phil Karlton
Slide 258
Slide 258 text
navegador
servidor db
requisição
resposta
Performance Consistência
Slide 259
Slide 259 text
E se houver um
processamento PESADO?
Slide 260
Slide 260 text
@Controller
public class PedidoController {
@Autowired
public PedidoService service;
@PostMapping(path="/vendas/finaliza", ...)
public void finalizaPedido(Pedido pedido) {
// faz alguma validação de dados
service.finaliza(pedido); // demorado...
}
}
Slide 261
Slide 261 text
@Controller
public class PedidoController {
@Autowired
public PedidoService service;
@PostMapping(path="/vendas/finaliza", ...)
public void finalizaPedido(Pedido pedido) {
// faz alguma validação de dados
service.finaliza(pedido); // demorado...
}
}
Slide 262
Slide 262 text
@Service
public class PedidoService {
public void finaliza(Pedido pedido) {
// efetua pagamento
// dá baixa no estoque
// atualiza pedido
// envia email de confirmação
}
}
Slide 263
Slide 263 text
navegador
servidor db
Slide 264
Slide 264 text
navegador
servidor db
Slide 265
Slide 265 text
navegador
servidor db
Slide 266
Slide 266 text
se a execução é custosa então
ela é um possível gargalo…
Slide 267
Slide 267 text
Assincronicidade
(processa mais tarde)
Slide 268
Slide 268 text
@Service
public class PedidoService {
public void finaliza(Pedido pedido) {
// efetua pagamento
// dá baixa no estoque
// atualiza pedido
// envia email de confirmação
}
}
Slide 269
Slide 269 text
@Service
public class PedidoService {
@Async
public void finaliza(Pedido pedido) {
// efetua pagamento
// dá baixa no estoque
// atualiza pedido
// envia email de confirmação
}
}
Slide 270
Slide 270 text
Spring usa um
pool de threads
Slide 271
Slide 271 text
@Controller
public class PedidoController {
@Autowired
public PedidoService service;
@PostMapping(path="/vendas/finaliza", ...)
public void finalizaPedido(Pedido pedido) {
// faz alguma validação de dados
service.finaliza(pedido);
}
}
Slide 272
Slide 272 text
@Controller
public class PedidoController {
@Autowired
public PedidoService service;
@PostMapping(path="/vendas/finaliza", ...)
public void finalizaPedido(Pedido pedido) {
// faz alguma validação de dados
service.finaliza(pedido);
}
}
IMEDIATO!
Slide 273
Slide 273 text
…e se além de
custosa ela também
for em grande
quantidade?
Slide 274
Slide 274 text
poderíamos usar
uma
fi
la…
Slide 275
Slide 275 text
navegador
servidor db
Slide 276
Slide 276 text
navegador
servidor db
X
Slide 277
Slide 277 text
navegador
servidor db
fi
la
Slide 278
Slide 278 text
navegador
servidor db
fi
la
Slide 279
Slide 279 text
navegador
servidor db
fi
la
Slide 280
Slide 280 text
navegador
servidor db
fi
la
Slide 281
Slide 281 text
navegador
servidor db
fi
la
Slide 282
Slide 282 text
@Controller
public class PedidoController {
@Autowired
public PedidoService service;
@PostMapping(path="/vendas/finaliza", ...)
public void finalizaPedido(Pedido pedido) {
// faz alguma validação de dados
service.finaliza(pedido);
}
}
Slide 283
Slide 283 text
@Controller
public class PedidoController {
@Autowired
public PedidoService service;
@PostMapping(path="/vendas/finaliza", ...)
public void finalizaPedido(Pedido pedido) {
// faz alguma validação de dados
service.finaliza(pedido);
}
}
Slide 284
Slide 284 text
@Controller
public class PedidoController {
@Autowired
public JmsTemplate fila;
@PostMapping(path="/vendas/finaliza", ...)
public void finalizaPedido(Pedido pedido) {
// faz alguma validação de dados
fila.convertAndSend("fila.pedidos", pedido);
}
}
Slide 285
Slide 285 text
e em algum momento um
processo consumiria a
fi
la…
Slide 286
Slide 286 text
navegador
servidor db
fi
la
Slide 287
Slide 287 text
navegador
servidor db
fi
la
consumidor
Slide 288
Slide 288 text
servidor db
fi
la
consumidor
navegador
Slide 289
Slide 289 text
servidor db
fi
la
consumidor
navegador
Slide 290
Slide 290 text
servidor db
fi
la
consumidor
navegador
Slide 291
Slide 291 text
@Service
public class PedidoService {
@Async
public void finaliza(Pedido pedido) {
// efetua pagamento
// dá baixa no estoque
// atualiza pedido
// envia email de confirmação
}
}
Slide 292
Slide 292 text
@Service
public class PedidoService {
@Async
public void finaliza(Pedido pedido) {
// efetua pagamento
// dá baixa no estoque
// atualiza pedido
// envia email de confirmação
}
}
Slide 293
Slide 293 text
@Service
public class PedidoService {
@JmsListener(destination="fila.pedidos")
public void finaliza(Pedido pedido) {
// efetua pagamento
// dá baixa no estoque
// atualiza pedido
// envia email de confirmação
}
}
Slide 294
Slide 294 text
no
fi
m nossa requisição
continuaria respondendo
imediatamente
Slide 295
Slide 295 text
@Controller
public class PedidoController {
@Autowired
public JmsTemplate fila;
@PostMapping(path="/vendas/finaliza", ...)
public void finalizaPedido(Pedido pedido) {
// faz alguma validação de dados
fila.convertAndSend("fila.pedidos", pedido);
}
}
IMEDIATO!
Slide 296
Slide 296 text
Wow!!
Slide 297
Slide 297 text
1) tunamos a JVM;
2) tunanamos a camada de
persistência;
3) adicionamos caching;
4) adicionamos processamento
assincrono;
Slide 298
Slide 298 text
1) tunamos a JVM;
2) tunamos a camada de
persistência;
3) adicionamos caching;
4) adicionamos processamento
assincrono;
Slide 299
Slide 299 text
1) tunamos a JVM;
2) tunamos a camada de
persistência;
3) adicionamos caching;
4) adicionamos processamento
assincrono;
Slide 300
Slide 300 text
1) tunamos a JVM;
2) tunamos a camada de
persistência;
3) adicionamos caching;
4) adicionamos
processamento assincrono;
Slide 301
Slide 301 text
Sistema
não aguenta?
Slide 302
Slide 302 text
Passo 2
(MELHORANDO A MÁQUINA)
Slide 303
Slide 303 text
navegador
servidor db
requisição
resposta
Slide 304
Slide 304 text
navegador
servidor db
requisição
resposta
Slide 305
Slide 305 text
cpu
memoria
Slide 306
Slide 306 text
No content
Slide 307
Slide 307 text
No content
Slide 308
Slide 308 text
X
Slide 309
Slide 309 text
No content
Slide 310
Slide 310 text
No content
Slide 311
Slide 311 text
No content
Slide 312
Slide 312 text
x 6
x 6
Slide 313
Slide 313 text
Mais
requisições?
Slide 314
Slide 314 text
No content
Slide 315
Slide 315 text
No content
Slide 316
Slide 316 text
No content
Slide 317
Slide 317 text
Escalabilidade Vertical
(scale up)
Slide 318
Slide 318 text
No content
Slide 319
Slide 319 text
No content
Slide 320
Slide 320 text
No content
Slide 321
Slide 321 text
No content
Slide 322
Slide 322 text
No content
Slide 323
Slide 323 text
No content
Slide 324
Slide 324 text
No content
Slide 325
Slide 325 text
X
Slide 326
Slide 326 text
Sistema
não aguenta?
Slide 327
Slide 327 text
Passo 3
(ADICIONANDO MAIS MÁQUINAS)
Slide 328
Slide 328 text
navegador
servidor db
requisição
resposta
Slide 329
Slide 329 text
navegador
servidor db
requisição
resposta
Slide 330
Slide 330 text
No content
Slide 331
Slide 331 text
No content
Slide 332
Slide 332 text
=
Slide 333
Slide 333 text
No content
Slide 334
Slide 334 text
No content
Slide 335
Slide 335 text
No content
Slide 336
Slide 336 text
ip?
Slide 337
Slide 337 text
No content
Slide 338
Slide 338 text
No content
Slide 339
Slide 339 text
No content
Slide 340
Slide 340 text
200 reqs
Slide 341
Slide 341 text
200 reqs
100 reqs
100 reqs
Slide 342
Slide 342 text
Balanceador
de Carga
Slide 343
Slide 343 text
Balanceador
de Carga
Slide 344
Slide 344 text
Balanceador
de Carga
Slide 345
Slide 345 text
No content
Slide 346
Slide 346 text
Mais
requisições?
Slide 347
Slide 347 text
No content
Slide 348
Slide 348 text
No content
Slide 349
Slide 349 text
No content
Slide 350
Slide 350 text
No content
Slide 351
Slide 351 text
Cluster
Slide 352
Slide 352 text
No content
Slide 353
Slide 353 text
No content
Slide 354
Slide 354 text
Escalabilidade Horizontal
(scale out)
Slide 355
Slide 355 text
Apesar de mais
barata…
Slide 356
Slide 356 text
No content
Slide 357
Slide 357 text
(1a requisição)
Slide 358
Slide 358 text
(1a requisição)
Slide 359
Slide 359 text
Sessão
Slide 360
Slide 360 text
(2a requisição)
qual?
Slide 361
Slide 361 text
(2a requisição)
Slide 362
Slide 362 text
(2a requisição)
Slide 363
Slide 363 text
Sticky Session
Slide 364
Slide 364 text
—
Slide 365
Slide 365 text
Mas e se…
Slide 366
Slide 366 text
No content
Slide 367
Slide 367 text
No content
Slide 368
Slide 368 text
No content
Slide 369
Slide 369 text
No content
Slide 370
Slide 370 text
No content
Slide 371
Slide 371 text
No content
Slide 372
Slide 372 text
No content
Slide 373
Slide 373 text
No content
Slide 374
Slide 374 text
No content
Slide 375
Slide 375 text
?
Slide 376
Slide 376 text
?
Slide 377
Slide 377 text
Falta
Redundância
Slide 378
Slide 378 text
Passo 4
(REPLICANDO ESTADO)
Slide 379
Slide 379 text
No content
Slide 380
Slide 380 text
(1a requisição)
Slide 381
Slide 381 text
(1a requisição)
Slide 382
Slide 382 text
(2a requisição)
Slide 383
Slide 383 text
(2a requisição)
qual?
Slide 384
Slide 384 text
(2a requisição)
Slide 385
Slide 385 text
(2a requisição)
Slide 386
Slide 386 text
No content
Slide 387
Slide 387 text
Session
Replication
Slide 388
Slide 388 text
No content
Slide 389
Slide 389 text
No content
Slide 390
Slide 390 text
No content
Slide 391
Slide 391 text
No content
Slide 392
Slide 392 text
Replica Estado
Slide 393
Slide 393 text
No content
Slide 394
Slide 394 text
Alta Disponibilidade
(high availability)
Slide 395
Slide 395 text
Mais
requisições?
Slide 396
Slide 396 text
No content
Slide 397
Slide 397 text
No content
Slide 398
Slide 398 text
No content
Slide 399
Slide 399 text
No content
Slide 400
Slide 400 text
Se tenho mais
máquinas…
Slide 401
Slide 401 text
No content
Slide 402
Slide 402 text
No content
Slide 403
Slide 403 text
No content
Slide 404
Slide 404 text
No content
Slide 405
Slide 405 text
Replicar sessão é
CARO
Slide 406
Slide 406 text
Passo 5
(REMOVENDO ESTADO)
Slide 407
Slide 407 text
No content
Slide 408
Slide 408 text
No content
Slide 409
Slide 409 text
No content
Slide 410
Slide 410 text
No content
Slide 411
Slide 411 text
X X X X X
Slide 412
Slide 412 text
No content
Slide 413
Slide 413 text
ONDE?
Slide 414
Slide 414 text
No content
Slide 415
Slide 415 text
No content
Slide 416
Slide 416 text
No content
Slide 417
Slide 417 text
No content
Slide 418
Slide 418 text
No content
Slide 419
Slide 419 text
Cache Distribuído
Slide 420
Slide 420 text
Cache Distribuído
Slide 421
Slide 421 text
Cache Distribuído
Slide 422
Slide 422 text
No content
Slide 423
Slide 423 text
STATELESS
(shared nothing architecture)
Slide 424
Slide 424 text
No content
Slide 425
Slide 425 text
No content
Slide 426
Slide 426 text
No content
Slide 427
Slide 427 text
Mais
requisições?
Slide 428
Slide 428 text
No content
Slide 429
Slide 429 text
256GB
Slide 430
Slide 430 text
256GB 256GB
Slide 431
Slide 431 text
Recapitulando…
Slide 432
Slide 432 text
tunando sua aplicação
Slide 433
Slide 433 text
tunando sua aplicação
melhorando sua máquina
Slide 434
Slide 434 text
tunando sua aplicação
adicionando máquinas
melhorando sua máquina
Slide 435
Slide 435 text
tunando sua aplicação
replicando estado
adicionando máquinas
melhorando sua máquina
Slide 436
Slide 436 text
tunando sua aplicação
replicando estado
adicionando máquinas
melhorando sua máquina
removendo estado
Slide 437
Slide 437 text
Todas
plataformas
Slide 438
Slide 438 text
No content
Slide 439
Slide 439 text
CACHE
Slide 440
Slide 440 text
CACHE
PROCESSAMENTO
ASSINCRONO
Slide 441
Slide 441 text
CACHE
BALANCEAMENTO
DE CARGA
PROCESSAMENTO
ASSINCRONO