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