30/11/2011 DataSnap e Cloud Deep Dive Agenda • • • • RAD Cloud Overview DBExpress Novo API Cloud Novidades no DataSnap 1 30/11/2011 API Cloud 2 30/11/2011 O que é novo no API Cloud? “Delphi API for accessing cloud application services from Amazon and Microsoft Azure.” Serviços suportados pelo API Cloud Storage Azure Blobs Service Amazon S3 Table Azure Table Service SimpleDB Queue Azure Queue Service Amazon SQS 3 30/11/2011 Convenção de nomes • Amazon e Microsoft utilizam diferentes nomes para as mesmas coisas… Container = Bucket Blobs = Object Page = Multipart ACL = ACL (Access Control List) Microsoft Azure • Blob Storage – Unstructured storage – Defined Container – For storing large pieces of data such as: Images, Video, Documents, etc. • Azure Tables – – – – Scalable structured storage NOSQL type tables Entities stored in a table Different set of properties made up of different types • Queues – Persistent asynchronous messaging – Each message is up to 8kb long 4 30/11/2011 Amazon WS • Simple Storage Service (S3) – – – – Blob Storage Unstructured storage Defined Container For storing large pieces of data such as: Images, Video, Documents, etc. • SimpleDB ‐ Tables – – – – Scalable structured storage NOSQL type tables Entities stored in a table Different set of properties made up of different types • Simple Queue Service (SQS) – Persistent asynchronous messaging – Each message is up to 64kb long Distribuição para Cloud • O gestor de distribuição suporta: – Microsoft Azure – Amazon EC2 5 30/11/2011 O que há de novo no DataSnap O que há de novo no DataSnap • Enhancements – Server – REST Interfaces – Callback – Authentication Manager • New DataSnap Monitoring and Control 6 30/11/2011 Server • Suporte de informação de Proxy para ligações DataSnap HTTP em TSQLConnection e TDSRESTConnection • Novo TDBXChannelInfo.DBXClientInfo (TDBXClientInfo record) que fornece: – IP Address – Protocol – Application Name (se possível) – apenas em HTTP Suporte HTTPS • Para servidores stand‐alone DataSnap • Para servidores stand‐alone WebBroker • DataSnap wizards actualizados com suporte HTTPS 7 30/11/2011 Gestor de Sessão • Suporte de sessão para protocolo TCP/IP • Suporte para “store” e “retrieve” Tobject nas sessões • Sessões “criadas” e “destruídas” com o protocolo TCP/IP agora notificam o now AddSessionEvent e RemoveSessionEvent • Suporte para múltiplos Callback Tunnels na interface DataSnap REST Gestor Callback Tunnel • Classe TDSCallbackTunnelManager na unidade DSServer • Permite o seguimento quando: – Callback é adicionado ou removido – Tunnel é criado ou encerrado 8 30/11/2011 Callbacks • “Heavyweight callbacks” agora suportam a difusão para callbacks específicos • GetAllChannelNames adicionado ao DSServer para obter o nome de todos os canais callback Eventos Callback no lado cliente • As notificações de quando o gestor de Tunnel é aberto ou encerrado, ou quando os Callbacks são adicionados ou removidos, são também disponibilizadas para: – Delphi DBX Client Events – Delphi REST Client Events – JavaScript REST Client Events 9 30/11/2011 Eventos cliente Delphi DBX • Componente TDSClientCallbackChannelManager, evento OnChannelStateChange • Method signature: (Sender: TObject; const EventItem: TDSClientChannelEventItem); • TunnelClosedByServer – tipo de evento para ligações fechadas pelo servidor ou perda de ligação Eventos cliente Delphi REST • Componente TDSRestClientChannel, evento OnChannelStateChange • Method signature: (Sender: TObject; const EventItem: TDSRESTChannelEventItem); • ChannelClosedByServer – tipo de evento para uma perda de ligação não‐esperada com o servidor 10 30/11/2011 Eventos cliente JavaScript • Cria‐se uma função que devolve um evento quando acontecer uma alteração no canal ou num dos seus callbacks var channel = new ClientChannel (clientID, channelName); channel.onChannelStateChange = HandleChannelEvent; • Se o servidor fechar o canal correctamente, o cliente terá um evento do tipo “ClientChannel. EVENT_CHANNEL_STOP” • Se a ligação for perdida, o cliente terá um evento do tipo “ClientChannel. EVENT_SERVER_DISCONNECT”. Suporte de sessão JavaScript • initSessionData function (in serverFunctionExecutor.js) poderá levar um segundo parâmetro (opcional) • O parâmetro irá fazer referência à ID geral do cookie – dssessionid • Vai permitir ter o controlo total sobre que aplicação utiliza cada ID/cookie de sessão 11 30/11/2011 JSON results e REST calls • O evento OnResult event foi adicionado aos componentes TDSHTTPWebDispatcher e TDSHTTPService • Permite transformar o formato do resultado JSON em chamada REST • Method signature: (Sender: TObject; var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean); Query parameters in REST calls • GetInvocationMetadata().QueryParams • Devolve uma TStrings que contém os valores dos parâmetros de todas as queries que passaram pelo URL da chamada REST 12 30/11/2011 Monitorização e controlo DataSnap Monitorização e Controlo DataSnap “DataSnap servers in XE2 are able to easily monitor connections, and close any TCP connection they wish.” 13 30/11/2011 O que consegue fazer • • • • • Ter controlo sobre as ligações cliente Monitorizar os pedidos cliente Limitar o número de pedidos por ligação Melhorar a segurança E mais… Como funciona isso? • Os componentes TDSTCPServerTransport têm dois novos eventos: – onConnect – onDisconnect • As ligações estão relacionadas com um ID de sesão 14 30/11/2011 Estar “à escuta” dos eventos TCP/IP Detectando o desligar “normal” • Por defeito, o evento OnDisconnect não será notificado se o cliente perder a ligação de internet de modo não‐esperado • Este comportamento depende da configuração do sistema operativo • Utilizar os métodos TDSTCPChannel para controlar este comportamento em cada ligação – EnableKeepAlive – DisableKeepAlive 15 30/11/2011 Como utilizar o EnableKeepAlive • Se a ligação estivar “parada” durante 10 segundos, então envia um pacote para verificar se o client ainda está… Event.Channel.EnableKeepAlive(10000); Como utilizar o EnableKeepAlive • Se o cliente não responde, o SO irá tentar enviar o pacote X vezes (Win 7 tenta 10x). • Poderá especificar o número de milissegundos de intervalo entre tentativas se o cliente não responder Event.Channel.EnableKeepAlive(10000, 100); 16 30/11/2011 KeepAlive Enablement • Com o componente TDSTCPServerTransport • Três novas propriedades: – KeepAliveEnablement ‐ (Set: Default, Enabled, Disabled) – KeepAliveTime ‐ Integer Milliseconds value – KeepAliveInterval ‐ Integer Milliseconds value Como utilizar o DisableKeepAlive • Com o canal associado a determinada ligação e chamar: DisableKeepAlive; 17 30/11/2011 Encerrar as ligações Client • A ligação pode ser encerrada a qualquer momento • O Channel fornece a instância da ligação //Saber o Channel associado a determinada ligação e se conseguir, encerrá‐la if FConnections.TryGetValue(Connection, Channel) then Channel.Close; Demo • Fazer o seguimento de todas as ligações TCP/IP e correspondentes sessões • Como encerrar manualmente uma ligação TCP/IP a partir do servidor • Como detectar quando um cliente perdeu a ligação à internet durante a ligação 18