Cassic

LUCAS-GABRIEL ( ßeta )


Apresentação

O LUCAS-GABRIEL é um middleware com a finalidade de aumentar a escalabilidade associada a independência dos SGBDRs com arquitetura cliente-servidor de duas camadas.

Arquitetura do LUCAS-GABRIEL

Figura 1 - Arquitetura do LUCAS-GABRIEL


O LUCAS-GABRIEL efetua a distribuição horizontal dos dados entre instâncias distintas de SGBDRs, mas sem interferir diretamente sobre o processamento dos SGBDRs. Ele atua numa camada intermediária entre o Sistema Cliente e os SGBDRs. Com esta camada intermediária o processo de comunicação entre o Sistema Cliente e SGBDR muda. Este novo processo é mostrado na seqüência:

I. O Sistema Cliente manda a solicitação ao LUCAS (Lançador Uniforme de Consultas Acessado por Software);

II. O LUCAS recebe as solicitações do Sistema Cliente, organiza estas solicitações e as envias ao GABRIEL (Gerenciador de Acesso a Banco Receptor de Invocações Enviadas do LUCAS);

III. O GABRIEL recebe as solicitações e processa as mesmas, agindo de maneira distinta para cada tipo de solicitação:
    a. Inclusão: É feita a distribuição de maneira a manter os SGBDRs balanceados.
    b. Alterações/Exclusões: A solicitação é replicada entre os SGBDRs para que a solicitação seja executada.
    c. Consultas: A solicitação é repassada para os SGBDRs, o retorno da consulta é consolidado num arquivo XML.

IV. O Gabriel envia uma resposta ao LUCAS;

V. O LUCAS repassa a resposta ao Sistema Cliente.

Desta maneira o Sistema Cliente não se comunica diretamente com os SGBDRs, apenas através do LUCAS-GABRIEL. Em contrapartida, o LUCAS-GABRIEL deixa transparente ao Sistema Cliente a estrutura física dos dados persistidos. Também é possível incluir novas instâncias de SGBDRs na estrutura computacional sem que o Sistema Cliente perceba tal ação.

O LUCAS-GABRIEL também pode ser visto como uma interface ODBC1, uma vez que o Sistema Cliente pode acessar vários tipos de SGBDRs sem a necessidade de uma codificação de acesso especializada.

1. Esta versão do LUCAS-GABRIEL só usa os SGBDRs Firebird ou Interbase, mas estão previstos outros SGBDR populares (PostgreSQL, MySQL, SQLServer, Oracle) para as próximas versões

Instalação

No lado do Sistema Cliente não é instalado nenhum driver de conexão com o SGBDR. O único arquivo que deve está junto com o Sistema Cliente é a DLL onde o LUCAS está encapsulado.

Numa máquina entre o Sistema Cliente e os SGBDRs deve ser instalado o GABRIEL. Nesta mesma máquina devem ser instalados os drivers cliente do SGBDRs, uma vez que o GABRIEL é visto pelos SGBDRs com um sistema cliente comum.

Cada instância de SGBDR deve manter uma cópia do banco de dados com todas as tabelas e todos os atributos. A chave primária será gerada pelo GABRIEL, logo, o SGBDR não deve gerar nenhum valor para a chave primária. Tendo como exemplo o metadado abaixo, ele deve se repetir em todas as instâncias dos SGBDRs conectados ao GABRIEL, pois como já foi mencionado anteriormente, o LUCAS-GABRIEL efetua a distribuição horizontal dos dados entre instâncias distintas de SGBDRs.

create table CLIENTE (
  ID integer not null primary key,
  Nome varchar(50),
  Ender varchar(40),
  Bairro varchar(20),
  CEP varchar(10),
  Munic varchar(20),
  UF      char(2)
);

Diagrama de caso de uso

O middleware é dividido em duas partes, o LUCAS e o GABRIEL (figura 2). O LUCAS fica do lado cliente, isto quer dizer que cada cliente deve ter o LUCAS instalado localmente. Entre o LUCAS e os SGBDRs tem-se o GABRIEL, que é o núcleo do middleware.  O middleware não terá nada instalado do lado do SGBDR, para o SGBDR o GABRIEL é um cliente.

Diagrama de caso de uso sintetico

Figura 2 - Diagrama de caso de uso sintético


Funcionalidade

A troca de mensagens entre LUCAS e GABRIEL é realizada via socket. Nas consultas de dados, o GABRIEL consolida os dados num arquivo XML e envia ao LUCAS via socket. Um exemplo de um arquivo XML gerado pelo GABRIEL e enviado ao LUCAS pode ser visto na figura 3.

Exemplo de arquivo XML gerado pelo GABRIEL e enviado ao LUCAS

Figura 3 - Exemplo de arquivo XML gerado pelo GABRIEL e enviado ao LUCAS


O esquema do arquivo XML gerado está diretamente relacionado com o metadado da origem dos dados, mas três tags são comuns a todos os arquivos XML gerados:

<?xml version="1.0" encoding="ISO-8859-1"?>
    Esta tag especial define a versão do documento XML através do atributo version, enquanto o atributo encoding define a tabela caracteres que será usada no arquivo. Esta tag deve aparecer apenas uma vez no arquivo XML

<dados>
    Local onde os registros ficam armazenados. Esta tag deve aparecer apenas uma vez no arquivo XML.

<registro>
    Define uma tupla e os valores armazenados em seus atributos. Esta tag pode aparecer uma vez, várias vezes ou nenhuma vez no arquivo XML, o que define a quantidade de vezes é o resultado gerado pela consulta.

<NOME>, <ENDER>, <BAIRRO>, <CEP>, <CIDADE> e <UF>
    Homônimos dos atributos da tupla retornada pela consulta. No conteúdo de cada tag está o valor do atributo da tupla.

GABRIEL

As configurações e atributos do GABRIEL ficam visíveis constantemente. A figura 4 mostra uma instância do GABRIEL.

Instancia do GABRIEL

Figura 4 - Instância do GABRIEL


Os itens da interface do aplicativo são explicados na seqüência:

Botão GetPorta: Captura a porta que o GABRIEL está usando para se comunicar com o LUCAS e mostra na caixa de edição Porta, localizada a direita do botão SetPorta.

Botão SetPorta: Atualiza a porta que o GABRIEL irá usar para se comunicar com o LUCAS, passando como nova porta o valor inserido na caixa de edição Porta, localizada a sua direita.

Caixa de edição Porta: Utilizada para (i) mostrar a porta de comunicação atual e (ii) ser configurada pelo usuário para informar a nova porta de comunicação.

Botão GetRelembrar: Captura o flag Relembrar (este flag indica se será efetuada uma contagem de registros nas tabelas que receber uma inclusão). Caso o flag Relembrar esteja ativo a caixa de combinação Relembrar é assinalada.

Botão SetRelembrar: Atualiza o flag Relembrar, passando como novo flag o valor da caixa de combinação Relembrar.

Caixa de combinação Relembrar: Utilizada para (i) mostrar o flag Relembrar atual e (ii) ser configurada pelo usuário para informar o novo valor do flag Relembrar.

Botão GetServidor: Captura o nome e endereço dos servidores configurados no GABRIEL e mostra na grade Servidores.

Grade Servidores: Mostra o nome e endereço dos servidores configurados no GABRIEL.

Botão SetServidor: Atualiza os servidores configurados no GABRIEL, (i) passando como parâmetro os valores das caixas de edição Servidor e Endereço e (ii) atualizando a informação da grade Servidores.

Botão EraseServidor: Exclui do GABRIEL o servidor com nome idêntico ao informado na caixa de edição Servidor.

Caixa de edição Servidor: Configurada pelo usuário para informar o nome do servidor configurado no GABRIEL.

Caixa de edição Endereço: Configurada pelo usuário para informar o endereço do servidor configurado no GABRIEL.

Botão GetTabela: Captura o nome, a chave primária e o último número gerado para a chave primária das tabelas configuradas no GABRIEL e mostra na grade Tabelas.

Caixa de edição Atualização: Configurada pelo usuário para informar o tempo, em milissegundos, que a grade Tabelas deve ter seus valores atualizados.

Grade Tabelas: Mostra o nome, a chave primária e o último número gerado para a chave primária das tabelas configuradas no GABRIEL.

Botão SetTabela: Atualiza as tabelas configuradas no GABRIEL (i) passando como parâmetro os valores das caixas de edição Tabela, Chave e Gerador e  (ii) atualizando a informação da grade Tabela.

Botão EraseTabela: Exclui do GABRIEL a tabela com nome idêntico ao informado na caixa de edição Tabela.

Caixa de edição Tabela: Configurada pelo usuário para informar o nome da tabela.

Caixa de edição Chave: Configurada pelo usuário para informar o nome da chave primária da tabela.

Caixa de edição Gerador: Configurada pelo usuário para informar o último valor usado pela chave primária da tabela.

LUCAS

O LUCAS está encapsulado dentro de uma DLL. O aplicativo cliente deve utilizar a DLL para efetuar a chamada aos métodos do LUCAS. A Tabela 1 mostra os métodos do LUCAS e como devem ser invocados através da DLL.

Tabela 1 - Métodos do LUCAS

Método

Chama via DLL

Parâmetro

Descrição

SetPorta

LUCAS_SetPorta

Porta

Configura porta de conexão com o GABRIEL

SetMediador

LUCAS_SetMediador

Endereco

Configura endereço do GABRIEL

SetResposta

LUCAS_SetResposta

Endereco

Configura endereço do arquivo XML de retorno

SetConfiguracao

LUCAS_SetConfiguracao

- Porta

- EnderecoMediador

- EnderecoResposta

- Configura porta de conexão com o GABRIEL

- Configura endereço do GABRIEL

- Configura endereço do arquivo XML de retorno

SetTabela

LUCAS_SetTabela

Tabela

Configura tabela que será usada na solicitação

SetChaveEstrangeira

LUCAS_SetChaveEstrangeira

- Tabela

- Campo

- Configura tabela estrangeira

- Configura campo da tabela local

SetDados

LUCAS_SetDados

- Campo

- Valor

- Configura campo da tabela local

- Configura valor que será atribuído ao campo

Clear

LUCAS_Clear

 

Limpa todas as solicitações pendentes

ClearChaveEstrangeira

LUCAS_ClearChaveEstrangeiraTudo

 

Limpa todas as chaves estrangeiras das solicitações pendentes

ClearChaveEstrangeira

LUCAS_ClearChaveEstrangeira

- Tabela

- Campo

Limpa a chave estrangeira da solicitação atual com tabela estrangeira e campo local iguais aos passados pelos parâmetros

ClearDados

LUCAS_ClearDadosTudo

 

Limpa todos os dados das solicitações pendentes

ClearDados

LUCAS_ClearDados

Campo

Limpa todos os dados da solicitação atual com campo igual ao passado pelo parâmetro

GetPorta

LUCAS_GetPorta

 

Captura porta de conexão com o GABRIEL

GetMediador

LUCAS_GetMediador

 

Captura endereço do GABRIEL

GetResposta

LUCAS_GetResposta

 

Captura endereço do arquivo XML de retorno

GetTabela

LUCAS_GetTabela

 

Captura IDs, tabelas, tipos de solicitações e condições das solicitações pendentes

GetChaveEstrangeira

LUCAS_GetChaveEstrangeira

 

Captura IDs, tabelas estrangeiras e campos da tabelas locais das solicitações pendentes


GetDados

LUCAS_GetDados

 

Captura IDs, campos e valores dos dados das solicitações pendentes

GetPendente

LUCAS_GetPendente

 

Captura o número de solicitações pendentes

SetIncluir

LUCAS_SetIncluir

Requisitar

Informa que a pendência atual se refere a uma inclusão

SetAlterar

LUCAS_SetAlterar

- Condicao

- Requisitar

Informa que a pendência atual se refere a uma alteração

SetExcluir

LUCAS_SetExcluir

- Condicao

- Requisitar

Informa que a pendência atual se refere a uma exclusão

SetConsultar

LUCAS_SetConsultar

- Condicao

Informa que a pendência atual se refere a uma consulta

SetConsultarSQL

LUCAS_SetConsultarSQL

ComandoSelect

Executa o conteúdo do parâmetro (o parâmetro deve ser um comando select)

SetRequisitar

LUCAS_SetRequisitar

 

Executa todas as requisições pendentes


Configurar o LUCAS

O Sistema Cliente deve configurar o LUCAS antes de iniciar as solicitações. O próximo código apresenta um exemplo para efetuar a configuração:

LUCAS_SetAtivarSoquete(False);
LUCAS_SetMediador(‘10.30.0.45‘);
LUCAS_SetPorta(1010);
LUCAS_SetResposta(‘C:\Pasta_Resposta\‘);
LUCAS_SetAtivarSoquete(True);

Incluir registro independente

A figura 5 mostra o diagrama de seqüência para incluir um registro numa tabela sem chave estrangeira.

Diagrama de Sequencia - Incluir registro independente

Figura 5 - Diagrama de Seqüência – Incluir registro independente


No caso de uma inclusão independente o Sistema Cliente deve invocar os métodos Clear e SetTabela do LUCAS, em seguida, para cada campo e valor que se deseja incluir no novo registro o método SetDados deve ser invocado.

Para entender melhor, imagine que se deseja incluir um registro na tabela Cliente com os dados da tabela 2.

Tabela 2 - Incluir registro independente

Tabela: Cliente

Campo

Valor

Nome

José da Silva

Endereco

Rua Todos os Santos

Cidade

Juazeiro do Norte

UF

CE

O Sistema Cliente deve executar o código semelhante ao mostrado:

LUCAS_Clear;
LUCAS_SetTabela(‘Cliente’);
LUCAS_SetDados(‘Nome’, ‘José da Silva’);
LUCAS_SetDados(‘Endereco’, ‘Rua Todos os Santos’);
LUCAS_SetDados(‘Cidade’, ‘Juazeiro do Norte’);
LUCAS_SetDados(‘UF’, ‘CE’);
LUCAS_SetIncluir(True);

Incluir registro dependente

A figura 6 mostra o diagrama de seqüência para incluir um registro numa tabela que possua chave estrangeira, e onde esta chave estrangeira deve ser igual a chave primária de uma inclusão anterior, mas ainda desconhecida.

Diagrama de Sequencia - Incluir registro dependente

Figura 6 - Diagrama de Seqüência - Incluir registro dependente


Uma venda via pedido é um cenário onde se inclui registros dependentes. A chave primária do pedido é chave estrangeira para seus itens, mas a chave primária só será conhecida no momento da inclusão.

O desconhecimento da chave primária do pedido pode causar inconsistência nos dados, uma vez que se forem incluídos dois ou mais pedidos num mesmo instante, não tem como saber qual a chave primária que os itens lançados nesses pedidos distintos devem obter, uma vez que um pedido pode ser persistido (i) antes de todos, (ii) após todos ou (iii) entre lançamentos.

Para simplificar, é mostrado como incluir dados em casos semelhantes, conforme tabela 3.

Tabela 3 - Incluir registro dependente

Tabela: Pedido

Campo

Valor

DtPedido

01/01/2009

ID_Vend

10

ID_Cliente

153

Tabela: Pedido_Item

Campo

Valor

ID_Pedido

???????

ID_Produto

1234567890

Quant

2

Tabela: Pedido_Item

Campo

Valor

ID_Pedido

???????

ID_Produto

0987654321

Quant

5

O código que deve ser executado pelo Sistema Cliente fica semelhante ao mostrado:

LUCAS_Clear;
LUCAS_SetTabela(‘Pedido’);
LUCAS_SetDados(‘DtPedido’, ‘01/01/2009’);
LUCAS_SetDados(‘ID_Vend’, ‘10’);
LUCAS_SetDados(‘ID_Cliente’, ‘153’);
LUCAS_SetIncluir(False);

LUCAS_SetTabela(‘Pedido_Item');
LUCAS_SetChaveEstrangeira(‘Pedido’, 'ID_Pedido');
LUCAS_SetDados(‘ID_Produto’, ‘1234567890’);
LUCAS_SetDados(‘Quant’, ‘2’);
LUCAS_SetIncluir(False);

LUCAS_SetDados(‘ID_Produto’, ‘0987654321’);
LUCAS_SetDados(‘Quant’, ‘5’);
LUCAS_SetIncluir(False);

LUCAS_SetRequisitar;

Note que só foi preciso configurar o nome da tabela e a chave estrangeira (SetTabela e SetChaveEstrangeira) no primeiro item. Uma vez que o parâmetro do método SetIncluir recebeu o valor falso, o mesmo se encarrega de configurar estes valores (SetTabela e SetChaveEstrangeira) automaticamente, ficando por conta do Sistema Cliente informar apenas os campos e seus valores através do método SetDados. O método SetRequisitar envia as solicitações ao GABRIEL.

A figura 7 mostra o fluxograma para inclusão de dados.

Fluxograma para inclusao de dados

Figura 7 - Fluxograma para inclusão de dados


Alterar registro

A figura 8 mostra o diagrama de seqüência da alteração de dados de uma tabela.

Diagrama de Sequencia - Alterar registro

Figura 8 - Diagrama de Seqüência - Alterar registro


Tendo como base os dados da tabela 4, é mostrado a seguir como o Sistema Cliente deve efetuar a alteração neste registro.

Tabela 4 - Alterar registro

Tabela: Cliente

Campo

Valor Atual

Novo Valor

ID

150

 

Nome

José da Silva

 

Endereco

Rua Todos os Santos

Rua Padre Cicero

Cidade

Juazeiro do Norte

 

UF

CE

 

O código que deverá ser executado pelo Sistema Cliente:

LUCAS_Clear;
LUCAS_SetTabela(‘Cliente’);
LUCAS_SetDados(‘Endereco’, ‘Rua Padre Cicero’);
LUCAS_SetAlterar(‘ID = 150’, True);

A figura 9 mostra o fluxograma para alteração de dados.

Fluxograma para alteracao de dados

Figura 9 - Fluxograma para alteração de dados


Excluir registro

A figura 10 mostra o diagrama de seqüência da exclusão de dados de uma tabela.

Diagrama de Sequencia - Excluir registro

Figura 10 - Diagrama de Seqüência - Excluir registro


O código executado pelo Sistema Cliente deve ficar semelhante ao mostrado a seguir:

LUCAS_Clear;
LUCAS_SetTabela(‘Cliente’);
LUCAS_SetExcluir(‘ID = 150’, True);

A figura 11 mostra o fluxograma para exclusão de dados.

Fluxograma para exclusao de dados

Figura 11 - Fluxograma para exclusão de dados


Consultar registro

A figura 12 mostra o diagrama de seqüência da consulta de dados de uma tabela.

Diagrama de Sequencia - Consultar Registro

Figura 12 - Diagrama de Seqüência - Consultar Registro


O Sistema Cliente deve ficar com o código semelhante ao mostrado:

LUCAS_Clear;
LUCAS_SetTabela(‘Cliente’);
LUCAS_SetDados(‘ID’, ‘’);
LUCAS_SetDados(‘Nome’, ‘’);
LUCAS_SetDados(‘Endereco’, ‘’);
LUCAS_SetDados(‘Cidade’, ‘’);
LUCAS_SetDados(‘UF’, ‘’);
LUCAS_SetConsultar(‘ID between 100 and 1000’);

A figura 13 mostra o fluxograma para consulta de dados.

Fluxograma para consulta de dados

Figura 13 - Fluxograma para consulta de dados


Fluxos alternativos e Funcionalidade

As solicitações de inclusão, alteração e exclusão podem ficar pendentes no LUCAS, bastando para isso informar como falso o parâmetro Requisitar dos métodos SetIncluir, SetAlterar e SetExcluir.

Para enviar as pendências ao GABRIEL o método SetRequisitar deve ser invocado de maneira direta ou indireta.  No primeiro caso o Sistema Cliente deve incorporar no seu código a chamada ao método SetRequisitar.  No outro caso basta informar o parâmetro Requisitar da do último método de solicitação (SetIncluir, SetAlterar e SetExcluir) como verdadeiro para invocar indiretamente o método SetRequisitar, que por sua vez envia as pendências ao GABRIEL.

Após o método SetRequisitar ser executado, o método Clear é invocado para apagar todas as solicitações enviadas.

O método SetChaveEstrangeira só é utilizado pelo LUCAS em conjunto com o método SetIncluir. Nos outros métodos (SetAlterar, SetExcluir e SetConsultar) ele é desprezado.

O segundo parâmetro do método SetDados (Valor) não é utilizado quando o método é usado em conjunto o SetConsultar.

Vantagens do LUCAS-GABRIEL

Embora existam outras propostas de distribuição de dados, o middleware LUCAS-GABRIEL apresenta um conjunto de benefícios não igualados pelos concorrentes:

• Independência de linguagem de programação do Sistema Cliente;

• Independência de SGBDR;

• Estrutura distribuída de armazenamento de dados;

• Balanceamento dos dados armazenados entre os SGBDRs;

• Transparência na distribuição dos dados;

• Alta escalabilidade.

A independência de linguagem de programação para o Sistema Cliente é um ponto forte do middleware, pois beneficiar sistemas legados.

Com a independência de SGBDR, as regras de acesso ao banco de dados, mantidas no Sistema Cliente, não precisam mudar quando o SGBDR for mudado.

A estrutura distribuída de armazenamento de dados aumenta o poder computacional de processamento, melhorando o desempenho quando comparado com uma estrutura centralizada.

O balanceamento dos dados entre os SGBDRs aumento o desempenho das solicitações feitas pelo Sistema Cliente. Uma vez que cada SGBDR tem apenas parte dos dados, o processamento das solicitações nesses dados exige um poder computacional menor.

O Sistema Cliente não precisa ficar preocupado em gerenciar os dados distribuídos, o middleware LUCAS-GABRIEL faz isso de maneira transparente.

Problemas de escalabilidade podem ser contornados incluindo novos servidores de dados na estrutura gerenciada pelo middleware LUCAS-GABRIEL.

Outra vantagem do middleware LUCAS-GABRIEL é a possibilidade de usá-lo como SOA em consultas entre empresas do mesmo grupo que retornem, por exemplo, o histórico de compras e pagamentos de um determinado cliente, conjuntura comum em empresas que tenham uma ou mais filiais, e que são obrigadas a utilizar soluções nem sempre práticas (consulta via telefone entre a matriz e as filiais, troca de mensagens instantâneas, etc.) para obter tais informações.

Implementações Previstas

O uso de esquemas pelo GABRIEL para gerenciar os dados e as instâncias dos SGBDRs possibilitando:

Fragmentação vertical dos dados: Para o middleware efetuar a fragmentação vertical dos dados;

Fragmentação de relação inteira: Para possibilitar fragmentar o bando de dados por tabela, mantendo todos os dados de uma tabela num único servidor;

Redundância dos dados: Para manter alta disponibilidade dos dados;

Balanceamento automático de carga: Para sempre que um novo servidor ingressasse na arquitetura, o middleware se encarregaria de refazer o balanceamento entre as instâncias do SGBDRs, aumentando o desempenho do sistema como um todo;

Junção de tabelas: Para permitir consultar dados distribuídos pelas tabelas normalizadas.