ARQUITETURA WEB
escalando sua aplicação além do hype
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
No content
Slide 15
Slide 15 text
No content
Slide 16
Slide 16 text
No content
Slide 17
Slide 17 text
No content
Slide 18
Slide 18 text
Um bom arquiteto escolhe
tecnologias por suas
desvantagens
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
podemos escalar
SEM o hype…
Slide 21
Slide 21 text
Rafael Ponte
@rponte
Slide 22
Slide 22 text
No content
Slide 23
Slide 23 text
Fortaleza - Terra do Sol
Slide 24
Slide 24 text
ARQUITETURA WEB
escalando sua aplicação além do hype
Slide 25
Slide 25 text
Como escalar minha
app para MILHARES de
usuários?
Slide 26
Slide 26 text
Loja Virtual
Slide 27
Slide 27 text
No content
Slide 28
Slide 28 text
Revisitando a Web…
Slide 29
Slide 29 text
servidor
Slide 30
Slide 30 text
servidor
Slide 31
Slide 31 text
navegador
servidor
Slide 32
Slide 32 text
navegador
servidor
requisição
Slide 33
Slide 33 text
navegador
servidor db
requisição
Slide 34
Slide 34 text
navegador
servidor db
requisição
resposta
Slide 35
Slide 35 text
navegador
servidor db
requisição
resposta
Slide 36
Slide 36 text
2 conceitos
importantes
Slide 37
Slide 37 text
Performance
X
Escalabilidade
Slide 38
Slide 38 text
tempo de resposta
(response time)
Slide 39
Slide 39 text
navegador
servidor db
requisição
resposta
Slide 40
Slide 40 text
navegador
servidor db
requisição
resposta
tempo resposta
Slide 41
Slide 41 text
navegador
servidor db
requisição
resposta
tempo resposta: 100ms
Slide 42
Slide 42 text
operações / unidade_tempo
(throughput)
Slide 43
Slide 43 text
usuários / minuto
(throughput)
Slide 44
Slide 44 text
usuários / segundo
(throughput)
Slide 45
Slide 45 text
usuários / segundo
(throughput)
Slide 46
Slide 46 text
requisições / segundo
(throughput)
Slide 47
Slide 47 text
navegador
servidor db
requisição
resposta
Slide 48
Slide 48 text
navegador
servidor db
requisição
resposta
tempo resposta: 100ms
Slide 49
Slide 49 text
servidor db
requisição
resposta
tempo resposta: 100ms
Slide 50
Slide 50 text
servidor db
requisição
resposta
tempo resposta: 100ms
Slide 51
Slide 51 text
servidor db
requisição
resposta
tempo resposta: 1s
Slide 52
Slide 52 text
servidor db
requisição
resposta
tempo resposta: 7s
Slide 53
Slide 53 text
servidor db
requisição
resposta
tempo resposta: 24s
Slide 54
Slide 54 text
servidor db
requisição
resposta
tempo resposta: 0
Slide 55
Slide 55 text
nossa aplicação não escala mais
do que: 80 req/s
Slide 56
Slide 56 text
navegador
servidor db
requisição
resposta
throughput: 80 req/s
Slide 57
Slide 57 text
navegador
servidor db
requisição
resposta
throughput: 250 req/s
Slide 58
Slide 58 text
navegador
servidor db
requisição
resposta
throughput: 1000 req/s
List produtos = //...
for (Produto p : produtos) {
p.setNome(p.getNome()
.toUpperCase());
}
Atualizando várias entidades
Slide 159
Slide 159 text
Query : [“UPDATE produto SET nome = ? WHERE id = ?”]
Params: [(‘PROD.1', 1), (‘PROD.2', 2), (‘PROD.3', 3)]
1 roundtrip
Slide 160
Slide 160 text
List produtos = //...
for (Produto p : produtos) {
entityManager.remove(p);
}
Removendo várias entidades
Slide 161
Slide 161 text
Query : [“DELETE FROM produto WHERE id = ?”]
Params: [(1), (2), (3)]
1 roundtrip
Slide 162
Slide 162 text
quanto menos roundtrips ao
banco, menor o response time
Slide 163
Slide 163 text
db
T = Tacq + Treq + Texec + Tres + Tidle
apresentação
negócio
persistência
Slide 164
Slide 164 text
Use Consultas Planejadas
(DTO Projections)
Slide 165
Slide 165 text
@Entity
class NotaFiscal {
…
@OneToMany
List itens;
}
Slide 166
Slide 166 text
NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
processaItensDaNota(nf);
Processando os itens de uma nota
Slide 167
Slide 167 text
NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
processaItensDaNota(nf);
Processando os itens de uma nota
Slide 168
Slide 168 text
Processando os itens de uma nota
NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
processaItensDaNota(nf);
Slide 169
Slide 169 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 170
Slide 170 text
List notas = dao.lista();
for (NotaFiscal nf : notas) {
processaItensDaNota(nf);
}
Processando os itens de varias notas
Slide 171
Slide 171 text
List notas = dao.lista();
for (NotaFiscal nf : notas) {
processaItensDaNota(nf);
}
Processando os itens de varias notas
Slide 172
Slide 172 text
Processando os itens de varias notas
List notas = dao.lista();
for (NotaFiscal nf : notas) {
processaItensDaNota(nf);
}
Slide 173
Slide 173 text
SELECT nf.* FROM NotaFiscal 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=?
...
Hibernate executa n+1 selects
List notas = dao.lista();
for (NotaFiscal nf : notas) {
processaItensDaNota(nf);
}
Slide 174
Slide 174 text
são muitos hits ao banco
(Select N+1)
Slide 175
Slide 175 text
solução?
Slide 176
Slide 176 text
@Entity
class NotaFiscal {
…
@OneToMany(fetch=FetchType.EAGER)
List itens;
}
Utilizando FetchMode=EAGER
Slide 177
Slide 177 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 178
Slide 178 text
antes de definir um mapeamento
global deste tipo você precisa se
perguntar...
Slide 179
Slide 179 text
SEMPRE que uma nota é carregada,
todos seus itens também são
necessários?
Slide 180
Slide 180 text
não?
Slide 181
Slide 181 text
@Entity
class NotaFiscal {
…
@OneToMany(fetch=FetchType.LAZY)
List itens;
}
Utilizando FetchMode=LAZY
Slide 182
Slide 182 text
entityManager
.createQuery(
" SELECT n
FROM NotaFiscal n
LEFT JOIN fetch n.itens")
.getResultList();
Utilizando Join Fetch
Slide 183
Slide 183 text
entityManager
.createQuery(
" SELECT n
FROM NotaFiscal n
LEFT JOIN fetch n.itens")
.getResultList();
Utilizando Join Fetch
LAZY permite
mudar para EAGER
Slide 184
Slide 184 text
Opa! Não para aí…
Slide 185
Slide 185 text
SEMPRE que uma nota é carregada,
TODAS as colunas são
necessárias?
Slide 186
Slide 186 text
não?
Slide 187
Slide 187 text
List notas =
entityManager
.createQuery(
" SELECT n
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 188
Slide 188 text
List notas =
entityManager
.createQuery(
" SELECT n.numero, n.serie
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 189
Slide 189 text
List notas =
entityManager
.createQuery(
" SELECT n.numero, n.serie
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 190
Slide 190 text
List????> notas =
entityManager
.createQuery(
" SELECT n.numero, n.serie
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 191
Slide 191 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 192
Slide 192 text
List notas =
entityManager
.createQuery(
" SELECT n.numero, n.serie
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 193
Slide 193 text
List notas =
entityManager
.createQuery(
" SELECT new Devolucao(n.numero,
n.serie)
FROM NotaFiscal n
WHERE n.tipo = 'DEVOLUCAO'")
.getResultList();
DTO Projections
Slide 194
Slide 194 text
SELECT nf.numero, nf.serie
FROM NotaFiscal nf
WHERE nf.tipo = 'DEVOLUCAO'
SQL otimizado
List notas = //...
Slide 195
Slide 195 text
quanto menor a quantidade de
dados recuperados, menor o
response time
Slide 196
Slide 196 text
db
T = Tacq + Treq + Texec + Tres + Tidle
apresentação
negócio
persistência
Slide 197
Slide 197 text
Como otimizar minha query?
Slide 198
Slide 198 text
SQL Nativo
(deixe seu banco trabalhar)
Slide 199
Slide 199 text
Stored Procedures
(leve o processamento para os
dados)
Slide 200
Slide 200 text
No content
Slide 201
Slide 201 text
DBA
(peça ajuda)
Slide 202
Slide 202 text
mesmo com todas essas
melhorias…
Slide 203
Slide 203 text
picos de acessos
podem aumentar
nosso response time
Slide 204
Slide 204 text
Caching
(aliviando o banco de dados)
Slide 205
Slide 205 text
NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
Carregando uma nota por ID
Slide 206
Slide 206 text
No content
Slide 207
Slide 207 text
EM
Slide 208
Slide 208 text
Banco de Dados
EM
Slide 209
Slide 209 text
Banco de Dados
EM NotaFiscal nf = entityManager
.find(NotaFiscal.class, 42);
Slide 210
Slide 210 text
SELECT nf.*
FROM NotaFiscal nf
WHERE nf.id = 42
Hibernate executa 1 select
NotaFiscal nf = entityManger.find(NotaFiscal.class, 42);
Slide 211
Slide 211 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 212
Slide 212 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 213
Slide 213 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 214
Slide 214 text
Banco de Dados
EM
Slide 215
Slide 215 text
Banco de Dados
EM
First Level Cache
Slide 216
Slide 216 text
Banco de Dados
EM
Slide 217
Slide 217 text
Banco de Dados
EM EM EM EM
Slide 218
Slide 218 text
Banco de Dados
????
EM EM EM EM
Slide 219
Slide 219 text
Banco de Dados
Second Level Cache
EM EM EM EM
Slide 220
Slide 220 text
Banco de Dados
Second Level Cache
EM Session Session
Session
EM EM EM
First Level Cache
Slide 221
Slide 221 text
Banco de Dados
EntityManagerFactory
EM EM EM EM
Slide 222
Slide 222 text
persistence.xml
#1 habilitamos o cache
Slide 223
Slide 223 text
@Entity
@Cache(...)
class Produto {
@Id
private Long id;
private String nome;
}
#2 configuramos as entidades
Slide 224
Slide 224 text
ehcache.xml
Slide 225
Slide 225 text
db
T = Tacq + Treq + Texec + Tres + Tidle
apresentação
negócio
persistência
Slide 226
Slide 226 text
a consulta mais rápida é aquela
que nem chega no banco de
dados
Slide 227
Slide 227 text
db
apresentação
negócio
persistência
Slide 228
Slide 228 text
db
apresentação
negócio
persistência
Slide 229
Slide 229 text
db
negócio
persistência
apresentação
Slide 230
Slide 230 text
“There are only two hard things in
Computer Science: cache invalidation
and naming things.”
— Phil Karlton
Slide 231
Slide 231 text
navegador
servidor db
requisição
resposta
Performance Consistência
Slide 232
Slide 232 text
E se houver processamento
pesado?
Slide 233
Slide 233 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 234
Slide 234 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 235
Slide 235 text
@Service
public class PedidoService {
public void finaliza(Pedido pedido) {
// efetua pagamento
// dá baixa no estoque
// atualiza pedido
// envia email de confirmação
}
}
Slide 236
Slide 236 text
navegador
servidor db
Slide 237
Slide 237 text
navegador
servidor db
Slide 238
Slide 238 text
navegador
servidor db
Slide 239
Slide 239 text
se a execução é custosa então é
um possível gargalo…
Slide 240
Slide 240 text
Assincronicidade
(processa mais tarde)
Slide 241
Slide 241 text
@Service
public class PedidoService {
public void finaliza(Pedido pedido) {
// efetua pagamento
// dá baixa no estoque
// atualiza pedido
// envia email de confirmação
}
}
Slide 242
Slide 242 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 243
Slide 243 text
Spring usa um
pool de threads
Slide 244
Slide 244 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 245
Slide 245 text
e se além de custosa
ela também for em
grande quantidade…
Slide 246
Slide 246 text
poderíamos usar
uma fila…
Slide 247
Slide 247 text
navegador
servidor db
Slide 248
Slide 248 text
navegador
servidor db
X
Slide 249
Slide 249 text
navegador
servidor db
fila
Slide 250
Slide 250 text
@Service
public class PedidoService {
@Autowired
private JmsTemplate fila;
public void finaliza(Pedido pedido) {
fila.convertAndSend("fila.pedidos", pedido);
}
}
Slide 251
Slide 251 text
@Service
public class PedidoService {
@Autowired
private JmsTemplate fila;
public void finaliza(Pedido pedido) {
fila.convertAndSend("fila.pedidos", pedido);
}
}
Slide 252
Slide 252 text
e em algum momento um
processo consumiria a
fila…
Slide 253
Slide 253 text
navegador
servidor db
fila
Slide 254
Slide 254 text
navegador
servidor db
fila
consumidor
Slide 255
Slide 255 text
servidor db
fila
consumidor
navegador
Slide 256
Slide 256 text
servidor db
fila
consumidor
navegador
Slide 257
Slide 257 text
servidor db
fila
consumidor
navegador
Slide 258
Slide 258 text
@Service
public class ProcessadorDePedidos {
@JmsListener(destination="fila.pedidos")
public void processa(Pedido pedido) {
// efetua pagamento
// dá baixa no estoque
// atualiza pedido
// envia email de confirmação
}
}
Slide 259
Slide 259 text
no fim nossa requisição
responderia
imediatamente
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); // imediato!!
}
}
Slide 261
Slide 261 text
Wow!!
Slide 262
Slide 262 text
1) tunamos a JVM;
2) tunanamos a camada de
persistência;
3) adicionamos caching;
4) adicionamos processamento
assincrono;
Slide 263
Slide 263 text
1) tunamos a JVM;
2) tunamos a camada de
persistência;
3) adicionamos caching;
4) adicionamos processamento
assincrono;
Slide 264
Slide 264 text
1) tunamos a JVM;
2) tunamos a camada de
persistência;
3) adicionamos caching;
4) adicionamos processamento
assincrono;
Slide 265
Slide 265 text
1) tunamos a JVM;
2) tunamos a camada de
persistência;
3) adicionamos caching;
4) adicionamos processamento
assincrono;
Slide 266
Slide 266 text
Sistema
não aguenta?
Slide 267
Slide 267 text
Passo 2
(MELHORANDO A MÁQUINA)
Slide 268
Slide 268 text
navegador
servidor db
requisição
resposta
Slide 269
Slide 269 text
navegador
servidor db
requisição
resposta
Slide 270
Slide 270 text
cpu
memoria
Slide 271
Slide 271 text
No content
Slide 272
Slide 272 text
No content
Slide 273
Slide 273 text
X
Slide 274
Slide 274 text
No content
Slide 275
Slide 275 text
No content
Slide 276
Slide 276 text
No content
Slide 277
Slide 277 text
x 6
x 6
Slide 278
Slide 278 text
Mais
requisições?
Slide 279
Slide 279 text
No content
Slide 280
Slide 280 text
No content
Slide 281
Slide 281 text
No content
Slide 282
Slide 282 text
Escalabilidade Vertical
(scale up)
Slide 283
Slide 283 text
No content
Slide 284
Slide 284 text
No content
Slide 285
Slide 285 text
No content
Slide 286
Slide 286 text
No content
Slide 287
Slide 287 text
No content
Slide 288
Slide 288 text
No content
Slide 289
Slide 289 text
No content
Slide 290
Slide 290 text
X
Slide 291
Slide 291 text
Sistema
não aguenta?
Slide 292
Slide 292 text
Passo 3
(ADICIONANDO MAIS MÁQUINAS)
Slide 293
Slide 293 text
navegador
servidor db
requisição
resposta
Slide 294
Slide 294 text
navegador
servidor db
requisição
resposta
Slide 295
Slide 295 text
No content
Slide 296
Slide 296 text
No content
Slide 297
Slide 297 text
=
Slide 298
Slide 298 text
No content
Slide 299
Slide 299 text
No content
Slide 300
Slide 300 text
No content
Slide 301
Slide 301 text
ip?
Slide 302
Slide 302 text
No content
Slide 303
Slide 303 text
No content
Slide 304
Slide 304 text
No content
Slide 305
Slide 305 text
200 reqs
Slide 306
Slide 306 text
200 reqs
100 reqs
100 reqs
Slide 307
Slide 307 text
Balanceador
de Carga
Slide 308
Slide 308 text
Balanceador
de Carga
Slide 309
Slide 309 text
Balanceador
de Carga
Slide 310
Slide 310 text
No content
Slide 311
Slide 311 text
Mais
requisições?
Slide 312
Slide 312 text
No content
Slide 313
Slide 313 text
No content
Slide 314
Slide 314 text
No content
Slide 315
Slide 315 text
No content
Slide 316
Slide 316 text
Cluster
Slide 317
Slide 317 text
No content
Slide 318
Slide 318 text
No content
Slide 319
Slide 319 text
Escalabilidade Horizontal
(scale out)
Slide 320
Slide 320 text
Apesar de mais
barata…
Slide 321
Slide 321 text
No content
Slide 322
Slide 322 text
(1a requisição)
Slide 323
Slide 323 text
(1a requisição)
Slide 324
Slide 324 text
Sessão
Slide 325
Slide 325 text
(2a requisição)
qual?
Slide 326
Slide 326 text
(2a requisição)
Slide 327
Slide 327 text
(2a requisição)
Slide 328
Slide 328 text
Sticky Session
Slide 329
Slide 329 text
—
Slide 330
Slide 330 text
Mas e se…
Slide 331
Slide 331 text
No content
Slide 332
Slide 332 text
No content
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
No content
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
?
Slide 341
Slide 341 text
?
Slide 342
Slide 342 text
Falta
Redundância
Slide 343
Slide 343 text
Passo 4
(REPLICANDO ESTADO)
Slide 344
Slide 344 text
No content
Slide 345
Slide 345 text
(1a requisição)
Slide 346
Slide 346 text
(1a requisição)
Slide 347
Slide 347 text
(2a requisição)
Slide 348
Slide 348 text
(2a requisição)
qual?
Slide 349
Slide 349 text
(2a requisição)
Slide 350
Slide 350 text
(2a requisição)
Slide 351
Slide 351 text
No content
Slide 352
Slide 352 text
Session
Replication
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
No content
Slide 357
Slide 357 text
Replica Estado
Slide 358
Slide 358 text
No content
Slide 359
Slide 359 text
Alta Disponibilidade
(high availability)
Slide 360
Slide 360 text
Mais
requisições?
Slide 361
Slide 361 text
No content
Slide 362
Slide 362 text
No content
Slide 363
Slide 363 text
No content
Slide 364
Slide 364 text
No content
Slide 365
Slide 365 text
Se tenho mais
máquinas…
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
Replicar sessão é
CARO
Slide 371
Slide 371 text
Passo 5
(REMOVENDO ESTADO)
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
X X X X X
Slide 377
Slide 377 text
No content
Slide 378
Slide 378 text
ONDE?
Slide 379
Slide 379 text
No content
Slide 380
Slide 380 text
No content
Slide 381
Slide 381 text
No content
Slide 382
Slide 382 text
No content
Slide 383
Slide 383 text
No content
Slide 384
Slide 384 text
Cache Distribuído
Slide 385
Slide 385 text
Cache Distribuído
Slide 386
Slide 386 text
Cache Distribuído
Slide 387
Slide 387 text
No content
Slide 388
Slide 388 text
STATELESS
(shared nothing architecture)
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
Mais
requisições?
Slide 393
Slide 393 text
No content
Slide 394
Slide 394 text
256GB
Slide 395
Slide 395 text
256GB 256GB
Slide 396
Slide 396 text
Recapitulando…
Slide 397
Slide 397 text
tunando sua aplicação
Slide 398
Slide 398 text
tunando sua aplicação
melhorando sua máquina
Slide 399
Slide 399 text
tunando sua aplicação
adicionando máquinas
melhorando sua máquina
Slide 400
Slide 400 text
tunando sua aplicação
replicando estado
adicionando máquinas
melhorando sua máquina
Slide 401
Slide 401 text
tunando sua aplicação
replicando estado
adicionando máquinas
melhorando sua máquina
removendo estado
Slide 402
Slide 402 text
Todas
plataformas
Slide 403
Slide 403 text
No content
Slide 404
Slide 404 text
CACHE
Slide 405
Slide 405 text
CACHE
PROCESSAMENTO
ASSINCRONO
Slide 406
Slide 406 text
CACHE
BALANCEAMENTO
DE CARGA
PROCESSAMENTO
ASSINCRONO