java para sistemas de missão critica: mito ou realidade?

22
JUSTJAVA’2006 SUCESU-SP – Sociedade de Usuários de Informática e Telecomunicações São Paulo Conferencista : Alberione Braz da Silva e Marcelo Martins Pires

Upload: elliando-dias

Post on 28-Jul-2015

879 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: Java para sistemas de missão critica: mito ou realidade?

JUSTJAVA’2006

SUCESU-SP – Sociedade de Usuários de Informática e Telecomunicações São Paulo

Conferencista : Alberione Braz da Silva e Marcelo Martins Pires

Page 2: Java para sistemas de missão critica: mito ou realidade?

2

ConferencistaConferencista

Alberione Braz da SilvaConsultor de Negócios e Sistemas para América Latina pela Telefonica Internacional S/A.Mestre em Sistemas de Computação pela Pontifícia Universidade Católica de Campinas e Engenheiro de Minas pela Universidade Federal de Pernambuco

Marcelo Martins PiresConsultor de Sistema para Brasil e América Latina da Telefonica.Especialista Soluções J2EE pela FIAP, Especialista em Orientação a Objetos pela Unicamp e Tecnólogo em Processamento de Dados pela FATEC

Page 3: Java para sistemas de missão critica: mito ou realidade?

3

TítuloTítulo

Java para sistemas de missão critica:

mito ou realidade?

Page 4: Java para sistemas de missão critica: mito ou realidade?

4

AgendaAgenda

• Premissas Envolvidas

• Arquitetura Sugerida por Fornecedores e a arquitetura utilizada

• Influência da Arquitetura no desenvolvimento de um sistema de missão

crítica

– Fluxo do processamento

– Custo computacional

– Uso de I/O através do DMA (Direct Memory Access)

• Codificação

– Ordenação/Organização de arquivos

– Persistência de dados utilizando o BerkeleyDB

– Framework Spring

– Melhores praticas para programação

• Demonstração dos resultados

• Conclusão

• Propostas

• Perguntas

Page 5: Java para sistemas de missão critica: mito ou realidade?

5

Premissas EnvolvidasPremissas Envolvidas

• Processamento de 500 milhões de CDRs/dia.

• Processamento on-line quase em tempo real (~3min).

• Redução de custo proposto com infra-estrutura.

• Redução de custo com aquisição de Software e manutenção sem utilização de OpenSource.

As principais premissas eram utilização do java como

linguagem de programação e com máxima portabilidade, outras foram:

Page 6: Java para sistemas de missão critica: mito ou realidade?

6

Arquitetura Sugerida por Fornecedores e a arquitetura utilizadaArquitetura Sugerida por Fornecedores e a arquitetura utilizada

De modo geral a arquitetura proposta pelo fornecedor de

infra-estrtura para o sistema CORE foi de um equipamento multiprocessado com 12 CPUs de 1.2GHz, com 24 Gbytes

de memória, com storage de 100Gbyte RAID-5 e com banco de dados.

A arquitetura utilizada para o sistema CORE foi de um

equipamento multiprocessado com 6 CPUs de 1.2GHz com 12 Gbytes de memória, com storage de 500Gbyte

RAID 0+1 (utilizado 150 Gbytes hoje).

Page 7: Java para sistemas de missão critica: mito ou realidade?

7

Influência da Arquitetura no desenvolvimento de um sistema de missão crítica - Fluxo do processamento (4 etapas lógicas)

Influência da Arquitetura no desenvolvimento de um sistema de missão crítica - Fluxo do processamento (4 etapas lógicas)

Gerenciador de

Processos de normaliza-

ção, consolidação e

recuperação de receitaX Indica a seqüência dos semáforos

Aplicação de

algoritmos

Validação

Consolidação1

2

2

3

4

Arqs. do BMP

Arqs. Validos e distribuídos por Tecnologia Arqs. CDRs Normalizados sem consolidação

Arqs. CDRs Normalizadas consolidadas

Arqs.

de

alertas

Agregação

NormalizaçãoAgregação

NormalizaçãoAgregação

NormalizaçãoAgregação

NormalizaçãoAgregação

NormalizaçãoAgregação

NormalizaçãoAgregação

NormalizaçãoAgregação

NormalizaçãoAgregação

NormalizaçãoAgregação

Normalização

Page 8: Java para sistemas de missão critica: mito ou realidade?

8

Influência da Arquitetura no desenvolvimento de um sistema de missão crítica – Custo Computacional (Relação entre CPUs, Threads, memória e desempenho)

Influência da Arquitetura no desenvolvimento de um sistema de missão crítica – Custo Computacional (Relação entre CPUs, Threads, memória e desempenho)

Normalmente, quando fala-se em Threads os desenvolvedores atem-se na forma de disponibilizá-la e não em sua relações CPUs e Memória, que esta relacionado diretamente com custo computacional. Como se segue:

Threads

CPUs

Memória

Ganho de 6 CPUs

Ganho de 12 GBytes

Para promover este ganho realizou-se as seguintes ações:

•Fixou-se na JVM em 6 GBytes a memória mínima e

máxima utilizada, com isto, evita-se o overhead de gerenciamento pela própria JVM.

•Usou-se a característica do gerenciamento de Threads do ambiente, ou seja, uso-se cinco threads

executando em paralelo (relação direta com a

quantidade de CPUs) e cinco em slice.

Page 9: Java para sistemas de missão critica: mito ou realidade?

9

Influência da Arquitetura no desenvolvimento de um sistema de missão crítica – Uso de I/O através do DMA (Direct Memory Access)

Influência da Arquitetura no desenvolvimento de um sistema de missão crítica – Uso de I/O através do DMA (Direct Memory Access)

A características dos sistemas voltados a missão critica são grandes volumes e grande quantidade de acesso as unidades de armazenamento ou comunicação para tratamento das informação.

Para promover este ganho realizou-se as seguintes ações:

•Usou-se o DMA

•Usou-se o pacote NIO que permite a utilização do

DMA através da JVM

Page 10: Java para sistemas de missão critica: mito ou realidade?

10

Codificação – Ordenação/Organização de arquivos Codificação – Ordenação/Organização de arquivos

�Localização dos elementos, do arquivo consolidado, através da implementação de Busca binária.Ex: Localizando o elemento 88

00 11 22 33 44 55 66 77 88 99 100

00 11 22 33 44 55 66 77 88 99 100

00 11 22 33 44 55 66 77 88 99 100

�Organização ordenada por nome de arquivo

...

...

Consolidação das CDR das 9 horas da manhã

Page 11: Java para sistemas de missão critica: mito ou realidade?

11

Codificação – Persistência de dados utilizando o BerkeleyDBCodificação – Persistência de dados utilizando o BerkeleyDB

�Soluções de baixo custo

�Trata-se de um banco de dados embutido na aplicação

�Famoso por sua robusteza, performance e escalabilidade

�Utilizado em soluções de missão crítica

�Pode ser usado em aplicações que necessitem de storages concorrentes de alta

performance

�Não é um servidor de banco de dados, não pode ser considerado como um SGBD

relacional ou orientado a objetos

�Não possui uma linguagem de consulta como o SQL

�O Berkeley DB suporta transações ACID, Undo e Redo (write-ahead logging),

recuperação de falhas com checkpoints, utiliza bloqueio para o controle de

concorrência (two-phase locking) e detecta deadlocks.

Page 12: Java para sistemas de missão critica: mito ou realidade?

12

Codificação – Framework SpringCodificação – Framework Spring

Spring CoreBean Container

Spring MVCSpring DAOJDBC SupportDAO Support

Spring ContextJDBC SupportDAO Support

Spring AOPSpring ORM

Hibernate SupportJDO Support

Spring WebWeb Utilities

�O módulo Spring Core representa as principais funcionalidades do Spring, no qual o principal elemento é o BeanFactory.

�Trata-se de uma implementação do padrão Factory, responsável em remover a programação de Singletons e permitindo o baixo acoplamento entre a configuração e a especificação de dependências, de sua lógica de programação.

<bean id="axeAdapterManager" class="br.com.telefonica.sacc.core.adapter.controller.DefaultAdapterManager" singleton="false">

<property name="broker" ref="axeBroker" /><property name="parser" ref="axeParser" /><property name="agregator" ref="connectorAgregatorManager" /><property name="persistence" ref="persistenceManager" />

</bean>

package br.com.telefonica.sacc.core.adapter.controller;public class DefaultAdapterManager implements AdapterManager, BrokerListener {

private CDRBroker broker;private CDRParser parser;private AgregatorManager agregator;private PersistenceManager persistenceManager;

Page 13: Java para sistemas de missão critica: mito ou realidade?

13

Codificação – Melhores práticas para programaçãoCodificação – Melhores práticas para programação

A forma de codificação e a própria lógica implementada pode afetar bastante

o desempenho, pois cada segundo perdido é multiplicado pelo volume de

informações a serem tratadas.

• Utilizar Classes e Métodos que usam a DMA como estrutura de acesso a arquivos (ex.:java.nio)

• Utilizar Classes com menor nível de hierarquia no Diagrama Classes de referência

• Utilizar arrays de bytes ou caracteres para efetuar a leitura, transformação e/ou gravação

Acesso a arquivos de

dados e parâmetros

• Evitar a criação de instancias dentro fluxo crítico do processo

• Evitar Alocação de objetos dentro fluxo crítico do processo

• Reduzir processamento no processo de Garbage Collection

• Reciclar instancias

• Compartilhar instancias

• Evitar a concatenação de caracteres ou strings com o uso do sinal “+”

• Utilizar o metodo append da classe StringBuilder (não é thread safe) ao invés da concatenação de Strings

• Evitar o excesso de extensão de classes

• Evitar o redimensionamento de arrays, vetores e strings dentro do fluxo crítico do processo

• Evitar o uso de string em todo fluxo processamento crítico

Estruturas de classes e objetos

Page 14: Java para sistemas de missão critica: mito ou realidade?

14

Codificação – Melhores práticas para programaçãoCodificação – Melhores práticas para programação

• Utilizar preferencialmente, em operações binárias, o comando condicional switch/case

• Utilizar o conjunto de condicionais IF sempre do melhor caso condicional para o pior caso.public void fazerAlgo (String codigo){

if (codigo.equals(“mais comum”)){//...

} else if (codigo.equals(“segunda mais comum”)){//...

} else if (codigo.equals(“terceira mais comum”)){//...

}}

• Substituir alguns testes por Exception Handling

• Ao invés de executar testes custosos como instanceog e teste de valor nulo (null) utilize Exception HandlingMais lento:

if (foo != null && foo.isHappy()){// ...

}Mais rápido:

try{if ( foo.isHappy()){

//...}

}catch(NullPointerException ex) {}

Estruturas Condicionais

Page 15: Java para sistemas de missão critica: mito ou realidade?

15

Codificação – Melhores práticas para programaçãoCodificação – Melhores práticas para programação

• Utilizar sempre que possível o comando FOR nas estruturas de laço/repetição

• Declarações podem ficar fora da estrutura de laçomais lento:

for (int i = 0; i < policy.getVehicleCount(); i++){IAddress address = company.getAddress();//...

}mais rápido:

int count = policy.getVehicleCount();IAddress address = null;for (int i = 0; i < count; i++){

address = company.getAddress(); //...}

• Executar teste condicionais fora do laço sempre que possívelmais lento:

for (int i = 0; i > max; i++){if (codido.equals(“vermelho”)) { //do X }else { //do Y }

}mais rápido:

if (codigo.equals(“vermelho”)){for (int i = 0; i > max; i++){

// do X}

} else{for (int i = 0; i > max; i++){

// do Y}

}

Otimizando Estrutura de

repetição

Page 16: Java para sistemas de missão critica: mito ou realidade?

16

Codificação – Melhores práticas para programaçãoCodificação – Melhores práticas para programação

• De preferência pelo uso de Arrays a Collections

• Acessar um elemento em uma Array é de dois a três vezes mais rápido em relação a Collection como um ArrayList

• Caso o tamanho seja conhecido e fixado e os elementos podendo ser indexados por por valores inteiros, a utilização de um array traráum ganho de desempenho significativo

• Porém o ganho de desempenho só poderá ser significativo caso exista operações com grande número de repetições

• Na criação de Maps Utilize objetos Inteiros como chaves (Keys)

• O método hashCode e equals serão executados de com uma melhor desempenho

ManipulandoArrays e Coleções

• Caso no costrutor da classe contenha uma inicialização/associação de valores a um campo (propriedade) da classe, a inicialização dessa mesmo campo em sua declaração é desnecessário/inapropriado

public class Node{

private String name = “Qualquer coisa";

//...

}

Melhor prática:public class Node{

private String name;

public Node (String name){

this.name = name;

}

}

Inicialização dos campos

nos construtores

Page 17: Java para sistemas de missão critica: mito ou realidade?

17

Codificação – Melhores práticas para programaçãoCodificação – Melhores práticas para programação

• No Quadro a esquerda, podemos omitir a linha referente a verificação de valores numéricos, incluindo um bloco try/catch, melhorando o desempenho e tornando a função de 3 a 4 vezes mais rápida que a solução padrão.

De 2 a 3 vezes mais Rápido!

public static long toLong(byte[] number){

long valor = 0;long mult = 1; for (int i = number.length-1; i >=

0; i--){

if (number[i] > 0x2F && number[i] < 0x3A)

{valor += (number[i] - 0x30) *

mult;mult *= 10;

}}return valor;

}

• Utilizar a leitura de um texto qualquer atraves de array de bytes, não utilizando String, e efetuar a conversao atraves da multiplicacao dos valores pelo multiplo de 10

Conversões de String para

tipos primitivos

Mais lento!

public static long toLongDefault(String numero)

{return Long.parseLong(numero);

}

Page 18: Java para sistemas de missão critica: mito ou realidade?

18

Demonstração dos resultadosDemonstração dos resultados

Os principais pontos que afetem o desempenho são: o tamanho dos arquivos

tratados, ocorrência de erro na checagem devido a forma de implementação

e processo de “Posto em marcha”.

Fatores que afetam o desempenho para Thread 5

0

5

10

15

20

25

30

1 11 21 31 41 51 61 71 81 91 101 111 121 131 141

Arquivo

Ad

min

sio

na

l

MB/Seg CDRs/Seg

“Posto em marcha” Erro de checagem Tamanho do arquivo

Page 19: Java para sistemas de missão critica: mito ou realidade?

19

ConclusãoConclusão

Atualmente pode-se aplicar a linguagem java para o desenvolvimento de qualquer tipo de sistema, inclusive de

missão crítica e/ou de grandes volumes. Mantendo-se, a

portabilidade, escalabilidade e interoperabilidade que a linguagem java e a JVM proporciona.

Com isto, pode-se sugerir a quebra do paradigma que a

linguagem java e a JVM são lentas.

Page 20: Java para sistemas de missão critica: mito ou realidade?

20

PropostasPropostas

• Quando afeta o desempenho a utilização do spring?

• A classe no nível com menor extensão é melhor para

o desempenho?

Como atingiu-se as metas de desempenho ficaram

algumas questões pendentes de estudo, que podem ser avaliadas. Que são:

Page 21: Java para sistemas de missão critica: mito ou realidade?

21

PerguntasPerguntas

Perguntas ?

Page 22: Java para sistemas de missão critica: mito ou realidade?

22

ObrigadoObrigado

Alberione Braz da Silva

[email protected]

Marcelo Martins [email protected]