datasnap avançado - respostas para um sistema robusto - embarcadero conference 2015

37
Datasnap Avançado Respostas para um Sistema Robusto Kelver Merlotti

Upload: kelver-merlotti

Post on 14-Apr-2017

2.668 views

Category:

Software


3 download

TRANSCRIPT

Page 1: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Datasnap AvançadoRespostas para um Sistema RobustoKelver Merlotti

Page 2: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Kelver Merlotti• Embarcadero MVP• Coordenador editorial da Active Delphi• Consultor independente• Especialista em N-Tier e Mobile• Trabalha com Delphi há +15 anos• Contatos

• Email: [email protected]• Twitter: @kmerlotti• Facebook: http://fb.com/kmerlotti

2

Page 3: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Vamos falar sobre…• Segurança com

Authentication;Authorization; e Transport Filters

• Performance com Caching; Rest Filters; e

• Responsidivade with Callbacks

3

Page 4: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Authentication e Authorization

Page 5: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Diferença• Authentication acontece quando “alguém” tenta acessar o servidor,

enquanto Authorization acontece quando “alguém” já logado em seu servidor tenta usar algo dele. Dito isso:

• Não há como autorizar alguém ainda não autenticado• Se está autenticado, ainda poderá não estar autorizado a fazer algo

5

Page 6: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Como autenticar• TDSAuthenticationManager.onAuthenticate, que nos dá informações como:

• O Protocolo sendo utilizado: http, https ou tcp• O contexto sendo utilizado (http://server:port/context/something)• O Usuário e Senha sendo utilizados

• Após testar as credenciais você pode decidir se a operação é válida ou não e adicionar alguns papéis (roles) ao usuário que está se autenticando.

• Este papéis serão úteis logo mais, quando precisar decidir o que este usuário pode ou não fazer.

6

Page 7: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Como autorizar• Existem 3 formas de aprovar/rejeitar uma tentativa de executar algo em

seu servidor:• Usando o atributo TRoleAuth em classes e métodos

• Menos flexível, mas requer praticamente nenhum código• Usando a coleção TDSAuthenticationManager.Roles

• Útil com DataSetProvider’s e com muitas roles/profiles• Pode requerer mais código

• Usando o evento TDSAuthenticationManager.onAuthorize• Mais flexível, 100% codificado

• Importante: TDSAuthManager.Roles sobrescreverá qualquer atributo TRoleAuth!7

Page 8: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Authentication e Authorization na prática

8

Page 9: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Mais sobre Authentication e Authorization• Authentication and Authorization (DocWiki)

• http://docwiki.embarcadero.com/RADStudio/Seattle/en/Authentication_and_Authorization

• Secure DataSnap Development (CodeRage 8 Session Replay)• http://www.youtube.com/watch?v=X1CW9A1bCzk

• Delphi Labs: DataSnap XE - Authentication and Authorization• http://edn.embarcadero.com/article/41267

• Authentication and Authorization with DataSnap and REST• https://mathewdelong.wordpress.com/2010/09/12/authentication-and-authorization-with-datasnap-and-rest/9

Page 10: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Transport Filters

Page 11: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015
Page 12: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Que filtro é esse?• É um código a ser executado sobre os bytes que serão enviados e

recebidos pelas aplicações servidora e cliente.• Delphi traz 3 filtros prontos para uso:

• 1 Filtro de Compactação, baseado em Zlib; e• 2 Filtros de Criptografia, baseado em RSA e PC1

• Todos estes filtros tem efeito sobre TCP/IP e devem ser declarados em ambos os lados, cliente e servidor.

• Filtros podem ser customizados, estendendo a classe Data.DBXTransport.TTransportFilter

12

Page 13: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Transport Filter na prática

13

Page 14: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Mais sobre Transport Filters• Filtering DataSnap Byte Stream (DocWiki)

• http://docwiki.embarcadero.com/RADStudio/Seattle/en/Filtering_DataSnap_Byte_Stream

• Delphi Labs: DataSnap XE - Transport Filters• http://edn.embarcadero.com/article/41293

• Secure DataSnap Development (CodeRage 8 Session Replay)• http://www.youtube.com/watch?v=X1CW9A1bCzk

• DataSnap Filter Compendium• http://www.danieleteti.it/datasnap-filters-compendium/14

Page 15: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Caching

Page 16: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Nada é mais rápido para processar do queo que não precisa ser processado!

16

Page 17: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

DataSnap REST Parameter Cache• Em um servidor REST, quando um método retorna um ou mais tipos complexos como

Streams, ele pode responder ao cliente que estes dados estão em cache, possibilitando este cliente requisitar os dados em cache. Tudo que você precisa é definir o cabeçalho “Accept” da requisição como “application/rest”.

• Então o servidor responderá com algo como: • {"result":["0/0/0"],"cacheId":0,"cmdIndex":0}

• Isto significa que agora você tem um Parâmetro com este cacheId armazenado em sua sessão. Basta fazer uma nova requisição com o mesmo “dssession” para obter o conteúdo. A URL é mais ou menos assim:• http://host:port/datasnap/cache/0/0/0

17

Page 18: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

“Cacheando” dados• Fazer cache de dados é (quase) sempre uma boa ideia!• Não é tão simples fazer, mas é muito valioso no ambiente de produção.• Pode ser feito do lado servidor ou do lado cliente, que é preferível.• Dados que não mudam com frequência são ótimos candidatos a estarem em cache,

como:• Países, Estados, Cidades, Unidades de Medida, etc.

• É essencial ter um mecanismo de invalidação de cache, que depende do contexto, mas normalmente é feito por:• Tempo de vida, definindo a data e hora a expirar• Mudança nos dados

• Usando um hash dos dados; ou• Usando um controle de versão dos dados (InterBase Change Views é O CARA nisso!)

18

Page 19: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Cache do lado cliente• Sempre que possível, armazene dados do lado cliente!• Evitará tráfego desnecessário com o Servidor de Aplicação e

consequentemente com Servidor de Banco de Dados• Requer mais cuidado com a invalidação• Considere utilizar:

• ClientDataSet’s; • FDMemTable’s • FireDAC LocalSQL

• Lembre-se: em muitos casos tentar sincronizar o cache pode ser perda de tempo. Jogue-o fora e crie novamente.19

Page 20: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Cache do lado servidor• Usado para evitar acesso desnecessário ao banco de dados• Pode ser um cache único para todos os clientes ou um cache por cliente

• Pode-se usar a propriedade TDSServerClass.LifeCycle para gerenciar isso• Server: Um único cache (que faz mais sentido, mas nem sempre possível)• Session: Cada cliente terá seu próprio cache

20

Page 21: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Caching na prática

21

Page 22: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Mais sobre Caching• DBX Parameter Caching

• http://docwiki.embarcadero.com/RADStudio/Seattle/en/DBX_Parameter_Caching

• DataSnap REST Messaging Protocol - Session Parameter Caching• http://docwiki.embarcadero.com/RADStudio/Seattle/en/

DataSnap_REST_Messaging_Protocol#Session_Parameter_Caching

22

Page 23: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

REST Request Filters23

Page 24: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015
Page 25: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

REST Request Filters• Mais relacionado a REST do que Datasnap em si

Se não está familiarizado com REST, pode começar aqui: http://www.restapitutorial.com/

• Em resumo, servidores REST geralmente oferecem uma forma de “selecionar” do resultado somente o pedaço que o cliente solicitou, ao invés de todo o conteúdo. Isto é chamado REST Request Filters.

• São usados no final da URL, como:…/metodo/parametro?filter.function=params

• Datasnap possui 2 filtros REST embutidos: SubString (ss) e Table (t).25

Page 26: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Filtro SubString• Pode operar sobre Strings e seus caracteres ou sobre Streams e seus bytes• Possui 3 funções:

• Count(c): único parâmetro, para definir os primeiros N caracteres desejados• …?ss.c=1 retornará o primeiro caractere ou byte

• Offset(o): único parâmetro, para definir os primeiros N caracteres que deseja ignorar• …?ss.o=10 retornará todo o conteúdo após o 10º caractere ou byte

• Range(r): dois parâmeteros, para definir o offset e o count• …?ss.r=10,20 retornará o conteúdo a partir do 11º ao 30º caractere ou byte (Ignora 10, retorna 20)

26

Page 27: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Filtro Table• Opera sobre Datasets, com as mesmas 3 funções do SubString, mas

filtrando registros ao invés de caracteres ou bytes• Count(c): único parâmetro, para definir os primeiros N registros desejados

• …?t.c=1 retornará o primeiro registro• Offset(o): único parâmetro, para definir os primeiros N registros que deseja ignorar

• …?t.o=10 retornará todos os registros após o 10º

• Range(r): dois parâmetros, para definir o offset e o count• …?t.r=10,20 retornará os registros do 11º ao 30º (ignora 10, retorna 20)

27

Page 28: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

REST Request Filters na prática

28

Page 29: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Mais sobre REST Request Filters• Request Filters

• http://docwiki.embarcadero.com/RADStudio/Seattle/en/Request_Filters

• DataSnap REST Messaging Protocol - Request Filters• http://docwiki.embarcadero.com/RADStudio/Seattle/en/

DataSnap_REST_Messaging_Protocol#Request_Filters

• REST Servers in Delphi XE using DataSnap• http://www.embarcadero.com/br/rad-in-action/datasnap-rest

29

Page 30: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Callback

Page 31: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Callback: o que é?

Quando você liga para alguém, ele/ela pode te ligar de volta, certo?

E é isso que o servidor faz!

Se um cliente “liga” pra um servidor, este servidor pode “ligar de voltar” para este cliente!

31

Page 32: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Ok, mas para que?• Para dar ao servidor a possibilidade de “falar” com o cliente de forma

proativa!

• Quando um cliente solicita algo ao servidor, não sabe o que está acontecendo lá até que recebe a resposta.• Do outro lado, o servidor não sabe como dizer ao cliente o que está

acontecendo.• Usar um callback permite ao servidor fazer isso!

32

Page 33: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Legal! Como?• Usando um método de callback; ou• Usando um canal de callback!

33

Page 34: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Callback na prática

34

Page 35: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Mais sobre Callback• Using Callbacks

• http://docwiki.embarcadero.com/RADStudio/Seattle/en/Using_Callbacks• REST Heavyweight Callbacks

• http://docwiki.embarcadero.com/RADStudio/Seattle/en/REST_Heavyweight_Callbacks• Delphi Labs: DataSnap XE - Callbacks - Artigo e vídeos (parte 1, 2 e 3)

• http://edn.embarcadero.com/article/41374• https://youtu.be/5zO3_g9Z-wc• https://youtu.be/geEzwg8XX8k• https://youtu.be/Hwode7a8O5k

• Heavyweight Callbacks (HTTP) with DataSnap - Artigo e vídeos (parte 1 e 2)• https://mathewdelong.wordpress.com/2011/05/30/heavyweight-callbacks/• https://youtu.be/IrweqUlENHU• https://youtu.be/xVUAisxqW0U

35

Page 36: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

Para terminar…

• Explore os recursos do Datasnap! Eles estão lá para serem usados! E funcionam :)

• Veja os exemplos, leia a documentação. Estude!

• Wizards nunca darão os melhores resultados. Vá além!

• Sempre planeje seu servidor levando em consideração seu ambiente de produção. Até a qualidade da rede deve ser considerada.

• Leia sobre pool de conexões de banco de dados e use-o!

• Leveza nunca é suficiente já que nosso objetivo é ser o mais rápido possível! Mas só trabalho pesado pode trazer resultados leves! ;)36

Page 37: Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

http://fb.com/DelphiBrasilhttp://fb.com/EmbarcaderoBRhttp://www.embarcadero.com/mvp-directoryhttp://www.embarcaderobr.com.br/treinamentos/

Kelver [email protected] | @kmerlotti | http://fb.com/kmerlotti