SlideShare una empresa de Scribd logo
1 de 37
Datasnap Avançado
Respostas para um Sistema Robusto
Kelver Merlotti
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: kmerlotti@gmail.com
• Twitter: @kmerlotti
• Facebook: http://fb.com/kmerlotti2
Vamos falar sobre…
• Segurança com
Authentication;
Authorization; e
Transport Filters
• Performance com
Caching;
Rest Filters; e
• Responsidivade with
Callbacks
3
Authentication e Authorization
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
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
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
Authentication e Authorization na prática
8
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
Transport Filters
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
Transport Filter na prática
13
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
Caching
Nada é mais rápido para processar do que
o que não precisa ser processado!
16
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/017
“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
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
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
Caching na prática
21
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
REST Request Filters
23
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
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
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
REST Request Filters na prática
28
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
Callback
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
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
Legal! Como?
• Usando um método de callback; ou
• Usando um canal de callback!
33
Callback na prática
34
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/xVUAisxqW0U35
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
http://fb.com/DelphiBrasil
http://fb.com/EmbarcaderoBR
http://www.embarcadero.com/mvp-directory
http://www.embarcaderobr.com.br/treinamentos/
Kelver Merlotti
kmerlotti@gmail.com | @kmerlotti | http://fb.com/kmerlotti

Más contenido relacionado

La actualidad más candente

게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013영욱 오
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonSeungmo Koo
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성noerror
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~YEONG-CHEON YOU
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdfNHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdfMancheol Jeon
 
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례Hwanhee Kim
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018devCAT Studio, NEXON
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델Seungmo Koo
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉iFunFactory Inc.
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architectureJongwon Kim
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버준철 박
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback흥배 최
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)YEONG-CHEON YOU
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해Nam Hyeonuk
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 

La actualidad más candente (20)

게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성
 
eBPF Basics
eBPF BasicseBPF Basics
eBPF Basics
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdfNHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
NHN 게임서버엔진팀 리빌딩과 운영 방침.pdf
 
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 

Destacado

Testando aplicações DataSnap
Testando aplicações DataSnapTestando aplicações DataSnap
Testando aplicações DataSnapAndreano Lanusse
 
Datasnap com FireDAC - Embarcadero Conference 2015
Datasnap com FireDAC - Embarcadero Conference 2015Datasnap com FireDAC - Embarcadero Conference 2015
Datasnap com FireDAC - Embarcadero Conference 2015Kelver Merlotti
 
Resolvendo problemas de performance em aplicações Delphi e bancos de dados
Resolvendo problemas de performance em aplicações Delphi e bancos de dadosResolvendo problemas de performance em aplicações Delphi e bancos de dados
Resolvendo problemas de performance em aplicações Delphi e bancos de dadosAndreano Lanusse
 
Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Mario Guedes
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkMario Guedes
 
Dados e Serviços Remotos via DataSnap
Dados e Serviços Remotos via DataSnapDados e Serviços Remotos via DataSnap
Dados e Serviços Remotos via DataSnapLanderson Gomes
 
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endModularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endMario Guedes
 
Python + Delphi: Um relacionamento que está dando certo
Python + Delphi: Um relacionamento que está dando certoPython + Delphi: Um relacionamento que está dando certo
Python + Delphi: Um relacionamento que está dando certoFernando Macedo
 
Cacheamento Lado Servidor
Cacheamento Lado ServidorCacheamento Lado Servidor
Cacheamento Lado ServidorMario Guedes
 
Bate papo sobre desenvolvimento de spftware
Bate papo sobre desenvolvimento de spftwareBate papo sobre desenvolvimento de spftware
Bate papo sobre desenvolvimento de spftwareAdriano Santos
 
Rad Studio 10 com Android e Unidac
Rad Studio 10 com Android e UnidacRad Studio 10 com Android e Unidac
Rad Studio 10 com Android e UnidacLanderson Gomes
 
Introdução FireDAC Acesso multi-banco para Delphi e C++ Builder
Introdução FireDACAcesso multi-banco para Delphi e C++ BuilderIntrodução FireDACAcesso multi-banco para Delphi e C++ Builder
Introdução FireDAC Acesso multi-banco para Delphi e C++ BuilderDiego Rosa
 
ListBox e Listview em Apps Mobile - Embarcadero Conference 2013
ListBox e Listview em Apps Mobile - Embarcadero Conference 2013ListBox e Listview em Apps Mobile - Embarcadero Conference 2013
ListBox e Listview em Apps Mobile - Embarcadero Conference 2013Vic Fernandes
 
FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014Alan Glei
 
Hora GTI - Top 10 Tendências Mobile para 2015 e 2016
Hora GTI - Top 10 Tendências Mobile para 2015 e 2016Hora GTI - Top 10 Tendências Mobile para 2015 e 2016
Hora GTI - Top 10 Tendências Mobile para 2015 e 2016Cássio Nandi Citadin
 
FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015Guinther Pauli
 
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturado
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturadoRaspador: Biblioteca em Python para extração de dados em texto semi-estruturado
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturadoFernando Macedo
 

Destacado (20)

Testando aplicações DataSnap
Testando aplicações DataSnapTestando aplicações DataSnap
Testando aplicações DataSnap
 
Datasnap com FireDAC - Embarcadero Conference 2015
Datasnap com FireDAC - Embarcadero Conference 2015Datasnap com FireDAC - Embarcadero Conference 2015
Datasnap com FireDAC - Embarcadero Conference 2015
 
Resolvendo problemas de performance em aplicações Delphi e bancos de dados
Resolvendo problemas de performance em aplicações Delphi e bancos de dadosResolvendo problemas de performance em aplicações Delphi e bancos de dados
Resolvendo problemas de performance em aplicações Delphi e bancos de dados
 
Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
Certificação Delphi
Certificação DelphiCertificação Delphi
Certificação Delphi
 
Dados e Serviços Remotos via DataSnap
Dados e Serviços Remotos via DataSnapDados e Serviços Remotos via DataSnap
Dados e Serviços Remotos via DataSnap
 
Exploring FireDAC
Exploring FireDACExploring FireDAC
Exploring FireDAC
 
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endModularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
 
Python + Delphi: Um relacionamento que está dando certo
Python + Delphi: Um relacionamento que está dando certoPython + Delphi: Um relacionamento que está dando certo
Python + Delphi: Um relacionamento que está dando certo
 
RESTful com json
RESTful com jsonRESTful com json
RESTful com json
 
Cacheamento Lado Servidor
Cacheamento Lado ServidorCacheamento Lado Servidor
Cacheamento Lado Servidor
 
Bate papo sobre desenvolvimento de spftware
Bate papo sobre desenvolvimento de spftwareBate papo sobre desenvolvimento de spftware
Bate papo sobre desenvolvimento de spftware
 
Rad Studio 10 com Android e Unidac
Rad Studio 10 com Android e UnidacRad Studio 10 com Android e Unidac
Rad Studio 10 com Android e Unidac
 
Introdução FireDAC Acesso multi-banco para Delphi e C++ Builder
Introdução FireDACAcesso multi-banco para Delphi e C++ BuilderIntrodução FireDACAcesso multi-banco para Delphi e C++ Builder
Introdução FireDAC Acesso multi-banco para Delphi e C++ Builder
 
ListBox e Listview em Apps Mobile - Embarcadero Conference 2013
ListBox e Listview em Apps Mobile - Embarcadero Conference 2013ListBox e Listview em Apps Mobile - Embarcadero Conference 2013
ListBox e Listview em Apps Mobile - Embarcadero Conference 2013
 
FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014
 
Hora GTI - Top 10 Tendências Mobile para 2015 e 2016
Hora GTI - Top 10 Tendências Mobile para 2015 e 2016Hora GTI - Top 10 Tendências Mobile para 2015 e 2016
Hora GTI - Top 10 Tendências Mobile para 2015 e 2016
 
FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015
 
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturado
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturadoRaspador: Biblioteca em Python para extração de dados em texto semi-estruturado
Raspador: Biblioteca em Python para extração de dados em texto semi-estruturado
 

Similar a Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015

ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoComunidade NetPonto
 
Apostilas - cliente servidor - aula 1 - fabiula
Apostilas - cliente servidor - aula 1 - fabiulaApostilas - cliente servidor - aula 1 - fabiula
Apostilas - cliente servidor - aula 1 - fabiulaDaniel Silveira
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSPledsifes
 
Precisamos de um barco maior introdução ao dimensionamento de aplicações
Precisamos de um barco maior introdução ao dimensionamento de aplicaçõesPrecisamos de um barco maior introdução ao dimensionamento de aplicações
Precisamos de um barco maior introdução ao dimensionamento de aplicaçõesJackson F. de A. Mafra
 
Criando Aplicações Serverless - ARC302 - Sao Paulo Summit
Criando Aplicações Serverless -  ARC302 - Sao Paulo SummitCriando Aplicações Serverless -  ARC302 - Sao Paulo Summit
Criando Aplicações Serverless - ARC302 - Sao Paulo SummitAmazon Web Services
 
Datacenter na nuvem
Datacenter na nuvemDatacenter na nuvem
Datacenter na nuvemIgnacio Nin
 
Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningFelipe Santos
 
Comet - ReverseAjax com DWR - Resumo
Comet - ReverseAjax com DWR - ResumoComet - ReverseAjax com DWR - Resumo
Comet - ReverseAjax com DWR - ResumoHanderson Frota
 
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Fabiano Weimar
 
Aula04 Sistemas Distribuídos - Processos
Aula04 Sistemas Distribuídos - ProcessosAula04 Sistemas Distribuídos - Processos
Aula04 Sistemas Distribuídos - ProcessosMessias Batista
 
Performance e disponibilidade ‐ Um estudo de caso: website dos Correios
Performance e disponibilidade ‐ Um estudo de caso: website dos CorreiosPerformance e disponibilidade ‐ Um estudo de caso: website dos Correios
Performance e disponibilidade ‐ Um estudo de caso: website dos CorreiosAlex Hübner
 

Similar a Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conference 2015 (20)

Estudos Technocorp
Estudos TechnocorpEstudos Technocorp
Estudos Technocorp
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis Paulino
 
Apostilas - cliente servidor - aula 1 - fabiula
Apostilas - cliente servidor - aula 1 - fabiulaApostilas - cliente servidor - aula 1 - fabiula
Apostilas - cliente servidor - aula 1 - fabiula
 
Aula 1
Aula 1Aula 1
Aula 1
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSP
 
Aplicações web parte 1
Aplicações web parte 1Aplicações web parte 1
Aplicações web parte 1
 
Precisamos de um barco maior introdução ao dimensionamento de aplicações
Precisamos de um barco maior introdução ao dimensionamento de aplicaçõesPrecisamos de um barco maior introdução ao dimensionamento de aplicações
Precisamos de um barco maior introdução ao dimensionamento de aplicações
 
Criando Aplicações Serverless - ARC302 - Sao Paulo Summit
Criando Aplicações Serverless -  ARC302 - Sao Paulo SummitCriando Aplicações Serverless -  ARC302 - Sao Paulo Summit
Criando Aplicações Serverless - ARC302 - Sao Paulo Summit
 
Estratégias de migração para cloud
Estratégias de migração para cloudEstratégias de migração para cloud
Estratégias de migração para cloud
 
Aplicações web parte 2
Aplicações web parte 2Aplicações web parte 2
Aplicações web parte 2
 
Monolith - An epic journey
Monolith - An epic journeyMonolith - An epic journey
Monolith - An epic journey
 
Datacenter na nuvem
Datacenter na nuvemDatacenter na nuvem
Datacenter na nuvem
 
Redes de computador
Redes de computadorRedes de computador
Redes de computador
 
Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine Learning
 
Comet - ReverseAjax com DWR - Resumo
Comet - ReverseAjax com DWR - ResumoComet - ReverseAjax com DWR - Resumo
Comet - ReverseAjax com DWR - Resumo
 
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
 
Aula04 Sistemas Distribuídos - Processos
Aula04 Sistemas Distribuídos - ProcessosAula04 Sistemas Distribuídos - Processos
Aula04 Sistemas Distribuídos - Processos
 
JBoss Clustering
JBoss ClusteringJBoss Clustering
JBoss Clustering
 
TechEd_OFC305
TechEd_OFC305TechEd_OFC305
TechEd_OFC305
 
Performance e disponibilidade ‐ Um estudo de caso: website dos Correios
Performance e disponibilidade ‐ Um estudo de caso: website dos CorreiosPerformance e disponibilidade ‐ Um estudo de caso: website dos Correios
Performance e disponibilidade ‐ Um estudo de caso: website dos Correios
 

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

  • 1. Datasnap Avançado Respostas para um Sistema Robusto Kelver Merlotti
  • 2. 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: kmerlotti@gmail.com • Twitter: @kmerlotti • Facebook: http://fb.com/kmerlotti2
  • 3. Vamos falar sobre… • Segurança com Authentication; Authorization; e Transport Filters • Performance com Caching; Rest Filters; e • Responsidivade with Callbacks 3
  • 5. 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
  • 6. 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
  • 7. 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
  • 9. 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
  • 11.
  • 12. 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
  • 13. Transport Filter na prática 13
  • 14. 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
  • 16. Nada é mais rápido para processar do que o que não precisa ser processado! 16
  • 17. 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/017
  • 18. “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
  • 19. 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
  • 20. 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
  • 22. 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
  • 24.
  • 25. 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
  • 26. 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
  • 27. 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
  • 28. REST Request Filters na prática 28
  • 29. 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
  • 31. 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
  • 32. 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
  • 33. Legal! Como? • Usando um método de callback; ou • Usando um canal de callback! 33
  • 35. 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/xVUAisxqW0U35
  • 36. 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