Como implementar Failover e Load Balance no DataSnap 2010
Uma pergunta frequente dos desenvolvedores durante as minhas viagens pela America Latina está relacionado ao desenvolvimento multicamada com DataSnap, após explicar toda a tecnologia sempre vem a pergunta "Como implementar Failover e Load Balance neste tipo de aplicação, o que é mais do que natural.
Quando pensamos em servidores de aplicação como parte do nosso desenvolvimento multicamada temos como um dos objetivos centralizar processamento, investimento em hardware, atualizações, etc. Quando pensamos em centralizar precisamos pensar também em redundância, ou seja, se um servidor falhar outro deve assumir, também pensamos em dividir a carga de processamento, ou seja, de acordo com o volume de processamento de cada servidor no momento redirecionamos a carga para que estiver menos sobrecarregado, chamamos isso de load balance.
Implementar essas duas características até então não era algo muito simples e exigia muito código, agora com o DataSnap 2010 a história é bem diferente.
DataSnap 2010 traz um recurso chamado HTTP Tunneling que lhe permite o controle do direcionamento da informação que está sendo enviada/recebida entre cliente e servidor. Como o próprio nome diz HTTP Tunneling, você terá que utilizar HTTP como Transporter na sua aplicação cliente para usufruir destas vantagens, o que não é um problema. Caso você queira utilizar TCP/IP na aplicação cliente, não será possível utilizar este recurso de forma simples, então recomendo utilizar HTTP.
Implementar Load Balance e Failover quer dizer criar um middleware entre a aplicação cliente e servidora, este middleware será responsável por decidir o que fazer com a informação recebida, para onde enviar, quando enviar, como enviar, etc.
Traduzindo isso para o mundo DataSnap, teremos uma aplicação cliente conectando a um servidor que neste caso chamaremos de Failover e o servidor DataSnap, o servidor de Failover será o nosso Firewall, neste post vou simular a queda de um servidor DataSnap e automaticamente a conexão será direcionada para outro servidor DataSnap.
Não é necessário fazer grandes mudanças na sua aplicação para suportar HTTP Tunneling, basicamente é ter a aplicação cliente conectando ao servidor de Failover através de HTTP, do servidor de Failover para o servidor DataSnap você poderá usar TCP/IP ou HTTP.
O servidor Failover terá apenas 2 componentes, o DSHTTPService que representa o seu Failover Server e estará conectado ao DSHTTPServiceAuthenticationManager, apenas para questões de segurança, pois quero que somente pessoas autorizadas conectem a este servidor.
Para habilitar o recurso de HTTP Tunneling você terá que implementar os eventos referente ao HTTP Service Tunnel Service, que são:
Cada um destes eventos será executado na sua ordem natural ou quando algum erro ocorrer, os nomes de cada evento são obvios, a aplicação exemplo implementa todos estes eventos, com o objetivo de mostrar no log as informações enviadas e recebidas durante a utilização da mesma.
No caso de uma solução de Failover todos os eventos devem ser implementados, os eventos OnErrorXXX entrarão em ação quando um erro ocorrer e necessitam do conteúdo que está sendo transferido para saber o que fazer, assim sendo eles dependem dos outros eventos. Neste posto vou focar no evento OnErrorOpenSession o qual irá efetuar o redirecionamento em caso de error na abertura de sessão.
Abaixo a implementação do método chamado Redirect que esta associado ao evento OnErrorOpenSession, repare que os dados da Sessão e conteúdo são parâmetros neste método, ou seja, tudo o que precisamos para poder redirecionar a informação.
Como controle estamos utilizando o Session.UserFlag, para permitir apenas um redirecionamento e caso o Sender seja uma Exception vamos armazenar a mensagem de error. A seguir criamos um DBXProperties que contém as informações do novo servidor que deverá ser redirecionado, neste exemplo utilizei o mesmo HostName, mas a porta será a 213, ou seja, tenho outro servidor DataSnap.
A partir dai basta reabrir a sessão com as novas propriedades que a mesma será redirecionada para o novo servidor.
Você pode estar achando fácil demais, na verdade é muito fácil.
Claro que você está curioso pra saber como funciona a execução, o que você precisa é um servidor DataSnap, servidor Failover e a aplicação cliente, neste caso utilize o próprio Data Explorer do Delphi será utilizando como aplicação cliente. A seguir os passos para executar este exemplo:

Implementar essas duas características até então não era algo muito simples e exigia muito código, agora com o DataSnap 2010 a história é bem diferente.
DataSnap 2010 traz um recurso chamado HTTP Tunneling que lhe permite o controle do direcionamento da informação que está sendo enviada/recebida entre cliente e servidor. Como o próprio nome diz HTTP Tunneling, você terá que utilizar HTTP como Transporter na sua aplicação cliente para usufruir destas vantagens, o que não é um problema. Caso você queira utilizar TCP/IP na aplicação cliente, não será possível utilizar este recurso de forma simples, então recomendo utilizar HTTP.
Implementar Load Balance e Failover quer dizer criar um middleware entre a aplicação cliente e servidora, este middleware será responsável por decidir o que fazer com a informação recebida, para onde enviar, quando enviar, como enviar, etc.
Traduzindo isso para o mundo DataSnap, teremos uma aplicação cliente conectando a um servidor que neste caso chamaremos de Failover e o servidor DataSnap, o servidor de Failover será o nosso Firewall, neste post vou simular a queda de um servidor DataSnap e automaticamente a conexão será direcionada para outro servidor DataSnap.
Não é necessário fazer grandes mudanças na sua aplicação para suportar HTTP Tunneling, basicamente é ter a aplicação cliente conectando ao servidor de Failover através de HTTP, do servidor de Failover para o servidor DataSnap você poderá usar TCP/IP ou HTTP.
O servidor Failover terá apenas 2 componentes, o DSHTTPService que representa o seu Failover Server e estará conectado ao DSHTTPServiceAuthenticationManager, apenas para questões de segurança, pois quero que somente pessoas autorizadas conectem a este servidor.
Para habilitar o recurso de HTTP Tunneling você terá que implementar os eventos referente ao HTTP Service Tunnel Service, que são:
- DSHTTPService1.HttpServer.TunnelService.OnErrorOpenSession
- DSHTTPService1.HttpServer.TunnelService.OnErrorWriteSession
- DSHTTPService1.HttpServer.TunnelService.OnErrorReadSession
- DSHTTPService1.HttpServer.TunnelService.OnOpenSession
- DSHTTPService1.HttpServer.TunnelService.OnWriteSession
- DSHTTPService1.HttpServer.TunnelService.OnReadSession
- DSHTTPService1.HttpServer.TunnelService.OnCloseSession
Cada um destes eventos será executado na sua ordem natural ou quando algum erro ocorrer, os nomes de cada evento são obvios, a aplicação exemplo implementa todos estes eventos, com o objetivo de mostrar no log as informações enviadas e recebidas durante a utilização da mesma.
No caso de uma solução de Failover todos os eventos devem ser implementados, os eventos OnErrorXXX entrarão em ação quando um erro ocorrer e necessitam do conteúdo que está sendo transferido para saber o que fazer, assim sendo eles dependem dos outros eventos. Neste posto vou focar no evento OnErrorOpenSession o qual irá efetuar o redirecionamento em caso de error na abertura de sessão.
Abaixo a implementação do método chamado Redirect que esta associado ao evento OnErrorOpenSession, repare que os dados da Sessão e conteúdo são parâmetros neste método, ou seja, tudo o que precisamos para poder redirecionar a informação.
Como controle estamos utilizando o Session.UserFlag, para permitir apenas um redirecionamento e caso o Sender seja uma Exception vamos armazenar a mensagem de error. A seguir criamos um DBXProperties que contém as informações do novo servidor que deverá ser redirecionado, neste exemplo utilizei o mesmo HostName, mas a porta será a 213, ou seja, tenho outro servidor DataSnap.
A partir dai basta reabrir a sessão com as novas propriedades que a mesma será redirecionada para o novo servidor.
Você pode estar achando fácil demais, na verdade é muito fácil.
procedure TForm6.Redirect(Sender: TObject; Session: TDSTunnelSession; Content: TBytes; var Count: Integer);
var
DBXProperties: TDBXDatasnapProperties;
Msg: String;
begin
if Sender is Exception then
Msg := Exception(Sender).Message;
Log('>>' + Msg);
if Session.UserFlag = 1 then
Raise Exception.Create('Backup session cannot be redirected once more.' + Msg);
DBXProperties := TDBXDatasnapProperties.Create(nil);
DBXProperties.Values[TDBXPropertyNames.DriverName] := 'Datasnap';
DBXProperties.Values[TDBXPropertyNames.HostName] := 'localhost';
DBXProperties.Values[TDBXPropertyNames.Port] := '213';
try
try
Session.Reopen(DBXProperties);
Session.UserFlag := 1;
Msg := 'Flow commuted to alternate resource.';
Log('>>' + Msg);
except
Raise Exception.Create(Msg + '. Commuting to alternate resource failed.');
end;
finally
DBXProperties.free;
end;
end;
Claro que você está curioso pra saber como funciona a execução, o que você precisa é um servidor DataSnap, servidor Failover e a aplicação cliente, neste caso utilize o próprio Data Explorer do Delphi será utilizando como aplicação cliente. A seguir os passos para executar este exemplo:
- Execute o servidor Failover, o exemplo utiliza HTTP e porta 8080
- Execute 2 instâncias do servidor DataSnap, uma na porta 211 e outra na porta 213, o servidor na porta 213 será o servidor de backup em caso de falho do servidor que está na porta 211
- Crie um DataSnap alias no Data Explorer, lembre-se de utilizar o protocolo HTTP e porta 8080
- Execute o método EchoString que aparece na lista de Procedures, passe o valor Delphi 2010 como parâmetro e execute, veja que o retorno será Delphi 2010 (Server 211)
- Feche a aplicação DataSnap server, porta 211
- Repita o passo número 4 e veja que o retorno será Delphi 2010 (Server 213)
- Veja o log no servidor Failover, você verá uma exception e o redirecionamento ocorrendo
Para facilitar o entendimento preparei um vídeo apresentando como executar este exemplo.
Você pode efetuar o download do código fonte aqui
Para outros posts relacionados ao DataSnap, clique aqui

Boa Tarde Andreano,
Como faço para entrar em contato contigo por e-mail para poder obter mais informações do RAD Studio XE, pois pretendemos atualizar nosso RAD Studio 2006 mas antes precisamos obter algumas informações, pois queremos migrar nossos produtos para Web com Prism e utilizando um servidor DataSnap no Delphi.
Poderia nos ajudar?
Obrigado.