{"id":524,"date":"2009-12-30T06:01:22","date_gmt":"2009-12-29T22:01:22","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=524"},"modified":"2011-03-08T12:19:25","modified_gmt":"2011-03-08T04:19:25","slug":"como-implementar-failover-e-load-balance-no-datasnap-2010","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/","title":{"rendered":"Como implementar Failover e Load Balance no DataSnap 2010"},"content":{"rendered":"<p>Uma pergunta frequente dos desenvolvedores durante as minhas viagens pela America Latina est\u00e1 relacionado ao desenvolvimento multicamada com DataSnap, ap\u00f3s explicar toda a tecnologia sempre vem a pergunta &#8220;Como implementar Failover e Load Balance neste tipo de aplica\u00e7\u00e3o, o que \u00e9 mais do que natural.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-529\" style=\"margin: 4px; border: 0px;\" title=\"Failover\" src=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2009\/12\/failover.gif\" alt=\"\" width=\"335\" height=\"221\" \/><\/p>\n<p>Quando pensamos em servidores de aplica\u00e7\u00e3o como parte do nosso desenvolvimento multicamada temos como um dos objetivos centralizar processamento, investimento em hardware, atualiza\u00e7\u00f5es, etc. Quando pensamos em centralizar precisamos pensar tamb\u00e9m em redund\u00e2ncia, ou seja, se um servidor falhar outro deve assumir, tamb\u00e9m pensamos em dividir a carga de processamento, ou seja, de acordo com o volume de processamento de cada servidor no<\/p>\n<p>momento redirecionamos a carga para que estiver menos sobrecarregado, chamamos isso de load balance.<\/p>\n<p>Implementar essas duas caracter\u00edsticas at\u00e9 ent\u00e3o n\u00e3o era algo muito simples e exigia muito c\u00f3digo, agora com o <a href=\"http:\/\/www.andreanolanusse.com\/pt\/tag\/datasnap\/\"><strong>DataSnap 2010<\/strong><\/a> a hist\u00f3ria \u00e9 bem diferente.<\/p>\n<p>DataSnap 2010 traz um recurso chamado HTTP Tunneling que lhe permite o controle do direcionamento da informa\u00e7\u00e3o que est\u00e1 sendo enviada\/recebida entre cliente e servidor. Como o pr\u00f3prio nome diz HTTP Tunneling, voc\u00ea ter\u00e1 que utilizar HTTP como Transporter na sua aplica\u00e7\u00e3o cliente para usufruir destas vantagens, o que n\u00e3o \u00e9 um problema. Caso voc\u00ea queira utilizar TCP\/IP na aplica\u00e7\u00e3o cliente, n\u00e3o ser\u00e1 poss\u00edvel utilizar este recurso de forma simples, ent\u00e3o recomendo utilizar HTTP.<\/p>\n<p>Implementar Load Balance e Failover quer dizer criar um middleware entre a aplica\u00e7\u00e3o cliente e servidora, este middleware ser\u00e1 respons\u00e1vel por decidir o que fazer com a informa\u00e7\u00e3o recebida, para onde enviar, quando enviar, como enviar, etc.<\/p>\n<p>Traduzindo isso para o mundo DataSnap, teremos uma aplica\u00e7\u00e3o cliente conectando a um servidor que neste caso chamaremos de Failover e o servidor DataSnap, o servidor de Failover ser\u00e1 o nosso Firewall, neste post vou simular a queda de um servidor DataSnap e automaticamente a conex\u00e3o ser\u00e1 direcionada para outro servidor DataSnap.<\/p>\n<p>N\u00e3o \u00e9 necess\u00e1rio fazer grandes mudan\u00e7as na sua aplica\u00e7\u00e3o para suportar HTTP Tunneling, basicamente \u00e9 ter a aplica\u00e7\u00e3o cliente conectando ao servidor de Failover atrav\u00e9s de HTTP, do servidor de Failover para o servidor DataSnap voc\u00ea poder\u00e1 usar TCP\/IP ou HTTP.<\/p>\n<p>O servidor Failover ter\u00e1 apenas 2 componentes, o DSHTTPService que representa o seu Failover Server e estar\u00e1 conectado ao DSHTTPServiceAuthenticationManager, apenas para quest\u00f5es de seguran\u00e7a, pois quero que somente pessoas autorizadas conectem a este servidor.<\/p>\n<p>Para habilitar o recurso de HTTP Tunneling voc\u00ea ter\u00e1 que implementar os eventos referente ao HTTP Service Tunnel Service, que s\u00e3o:<\/p>\n<ul>\n<li>DSHTTPService1.HttpServer.TunnelService.OnErrorOpenSession<\/li>\n<li>DSHTTPService1.HttpServer.TunnelService.OnErrorWriteSession<\/li>\n<li>DSHTTPService1.HttpServer.TunnelService.OnErrorReadSession<\/li>\n<li>DSHTTPService1.HttpServer.TunnelService.OnOpenSession<\/li>\n<li>DSHTTPService1.HttpServer.TunnelService.OnWriteSession<\/li>\n<li>DSHTTPService1.HttpServer.TunnelService.OnReadSession<\/li>\n<li>DSHTTPService1.HttpServer.TunnelService.OnCloseSession<\/li>\n<\/ul>\n<p>Cada um destes eventos ser\u00e1 executado na sua ordem natural ou quando algum erro ocorrer, os nomes de cada evento s\u00e3o obvios, a aplica\u00e7\u00e3o exemplo implementa todos estes eventos, com o objetivo de mostrar no log as informa\u00e7\u00f5es enviadas e recebidas durante a utiliza\u00e7\u00e3o da mesma.<\/p>\n<p>No caso de uma solu\u00e7\u00e3o de Failover todos os eventos devem ser implementados, os eventos OnErrorXXX entrar\u00e3o em a\u00e7\u00e3o quando um erro ocorrer e necessitam do conte\u00fado que est\u00e1 sendo transferido para saber o que fazer, assim sendo eles dependem dos outros eventos. Neste posto vou focar no evento OnErrorOpenSession o qual ir\u00e1 efetuar o redirecionamento em caso de error na abertura de sess\u00e3o.<\/p>\n<p>Abaixo a implementa\u00e7\u00e3o do m\u00e9todo chamado Redirect que esta associado ao evento OnErrorOpenSession, repare que os dados da Sess\u00e3o e conte\u00fado s\u00e3o par\u00e2metros neste m\u00e9todo, ou seja, tudo o que precisamos para poder redirecionar a informa\u00e7\u00e3o.<\/p>\n<p>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\u00e9m as informa\u00e7\u00f5es do novo servidor que dever\u00e1 ser redirecionado, neste exemplo utilizei o mesmo HostName, mas a porta ser\u00e1 a 213, ou seja, tenho outro servidor DataSnap.<\/p>\n<p>A partir dai basta reabrir a sess\u00e3o com as novas propriedades que a mesma ser\u00e1 redirecionada para o novo servidor.<\/p>\n<p>Voc\u00ea pode estar achando f\u00e1cil demais, na verdade \u00e9 muito f\u00e1cil.<\/p>\n<pre class=\"brush: pascal\">procedure TForm6.Redirect(Sender: TObject; Session: TDSTunnelSession; Content: TBytes; var Count: Integer);\r\nvar\r\n  DBXProperties: TDBXDatasnapProperties;\r\n  Msg: String;\r\nbegin\r\n  if Sender is Exception then\r\n    Msg := Exception(Sender).Message;\r\n  Log('&gt;&gt;' + Msg);\r\n\r\n  if Session.UserFlag = 1 then\r\n    Raise Exception.Create('Backup session cannot be redirected once more.' + Msg);\r\n\r\n  DBXProperties := TDBXDatasnapProperties.Create(nil);\r\n  DBXProperties.Values[TDBXPropertyNames.DriverName] := 'Datasnap';\r\n  DBXProperties.Values[TDBXPropertyNames.HostName]  := 'localhost';\r\n  DBXProperties.Values[TDBXPropertyNames.Port]      := '213';\r\n\r\n  try\r\n    try\r\n      Session.Reopen(DBXProperties);\r\n      Session.UserFlag := 1;\r\n\r\n      Msg := 'Flow commuted to alternate resource.';\r\n      Log('&gt;&gt;' + Msg);\r\n    except\r\n      Raise Exception.Create(Msg + '. Commuting to alternate resource failed.');\r\n    end;\r\n  finally\r\n    DBXProperties.free;\r\n  end;\r\n\r\nend;<\/pre>\n<p>Claro que voc\u00ea est\u00e1 curioso pra saber como funciona a execu\u00e7\u00e3o, o que voc\u00ea precisa \u00e9 um servidor DataSnap, servidor Failover e a aplica\u00e7\u00e3o cliente, neste caso utilize o pr\u00f3prio Data Explorer do Delphi ser\u00e1 utilizando como aplica\u00e7\u00e3o cliente. A seguir os passos para executar este exemplo:<\/p>\n<ol>\n<li>Execute o servidor Failover, o exemplo utiliza HTTP e porta 8080<\/li>\n<li>Execute 2 inst\u00e2ncias do servidor DataSnap, uma na porta 211 e outra na porta 213, o servidor na porta 213 ser\u00e1 o servidor de backup em caso de falho do servidor que est\u00e1 na porta 211<\/li>\n<li>Crie um DataSnap alias no Data Explorer, lembre-se de utilizar o protocolo HTTP e porta 8080<\/li>\n<li>Execute o m\u00e9todo EchoString que aparece na lista de Procedures, passe o valor <strong>Delphi 2010<\/strong> como par\u00e2metro e execute, veja que o retorno ser\u00e1 <strong>Delphi 2010 (Server 211)<\/strong><\/li>\n<li>Feche a aplica\u00e7\u00e3o DataSnap server, porta 211<\/li>\n<li>Repita o passo n\u00famero 4 e veja que o retorno ser\u00e1 <strong>Delphi 2010 (Server 213)<\/strong><\/li>\n<li>Veja o log no servidor Failover, voc\u00ea ver\u00e1 uma exception e o redirecionamento ocorrendo<\/li>\n<\/ol>\n<p style=\"text-align: left;\">Para facilitar o entendimento preparei um v\u00eddeo apresentando como executar este exemplo.<\/p>\n<p style=\"text-align: center;\">\n<p style=\"text-align: center;\"><object style=\"width: 425px; height: 344px;\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"100\" height=\"100\" codebase=\"http:\/\/download.macromedia.com\/pub\/shockwave\/cabs\/flash\/swflash.cab#version=6,0,40,0\"><param name=\"allowFullScreen\" value=\"true\" \/><param name=\"allowScriptAccess\" value=\"always\" \/><param name=\"src\" value=\"http:\/\/www.youtube.com\/v\/GejZv3_lxLI\" \/><param name=\"allowfullscreen\" value=\"true\" \/><embed style=\"width: 425px; height: 344px;\" type=\"application\/x-shockwave-flash\" width=\"100\" height=\"100\" src=\"http:\/\/www.youtube.com\/v\/GejZv3_lxLI\" allowscriptaccess=\"always\" allowfullscreen=\"true\"><\/embed><\/object><\/p>\n<p style=\"text-align: left;\">Voc\u00ea pode efetuar o download do c\u00f3digo fonte <a href=\"http:\/\/cc.embarcadero.com\/Item\/27391\"><strong>aqui<\/strong><\/a><\/p>\n<p style=\"text-align: left;\">Para outros posts relacionados ao DataSnap, <strong><a href=\"http:\/\/www.andreanolanusse.com\/pt\/tag\/datasnap\/\">clique aqui<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma pergunta frequente dos desenvolvedores durante as minhas viagens pela America Latina est\u00e1 relacionado ao desenvolvimento multicamada com DataSnap, ap\u00f3s explicar toda a tecnologia sempre vem a pergunta &#8220;Como implementar Failover e Load Balance neste tipo de aplica\u00e7\u00e3o, o que \u00e9 mais do que natural. Quando pensamos em servidores de aplica\u00e7\u00e3o como parte do nosso [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"","footnotes":""},"categories":[102],"tags":[23,181,22],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Como implementar Failover e Load Balance no DataSnap 2010 | Delphi 2010<\/title>\n<meta name=\"description\" content=\"Aprenda como implementar servidores de Failover (redund\u00e2ncia) e Load Balance em DataSnap 2010 e Delphi 2010, video e c\u00f3digo fonte dispon\u00edveis\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como implementar Failover e Load Balance no DataSnap 2010 | Delphi 2010\" \/>\n<meta property=\"og:description\" content=\"Aprenda como implementar servidores de Failover (redund\u00e2ncia) e Load Balance em DataSnap 2010 e Delphi 2010, video e c\u00f3digo fonte dispon\u00edveis\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2009-12-29T22:01:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2011-03-08T04:19:25+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2009\/12\/failover.gif\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:site\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\">\n\t<meta name=\"twitter:data1\" content=\"5 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"description\":\"Andreano Lanusse blog - artigos, tutoriais e v&iacute;deos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e t&eacute;cnicas de programa&ccedil;&atilde;o\",\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/www.andreanolanusse.com\/pt\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2009\/12\/failover.gif\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2009\/12\/failover.gif\",\"width\":558,\"height\":369},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/\",\"name\":\"Como implementar Failover e Load Balance no DataSnap 2010 | Delphi 2010\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#primaryimage\"},\"datePublished\":\"2009-12-29T22:01:22+00:00\",\"dateModified\":\"2011-03-08T04:19:25+00:00\",\"description\":\"Aprenda como implementar servidores de Failover (redund\\u00e2ncia) e Load Balance em DataSnap 2010 e Delphi 2010, video e c\\u00f3digo fonte dispon\\u00edveis\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"Como implementar Failover e Load Balance no DataSnap 2010\",\"datePublished\":\"2009-12-29T22:01:22+00:00\",\"dateModified\":\"2011-03-08T04:19:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#webpage\"},\"commentCount\":38,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#primaryimage\"},\"keywords\":[\"DataSnap\",\"Delphi\",\"V\\u00eddeo\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/como-implementar-failover-e-load-balance-no-datasnap-2010\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\"},\"sameAs\":[\"https:\/\/twitter.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/524"}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/comments?post=524"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/524\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media?parent=524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=524"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}