SlideShare uma empresa 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

Mais conteúdo relacionado

Mais procurados

Beneath the Linux Interrupt handling
Beneath the Linux Interrupt handlingBeneath the Linux Interrupt handling
Beneath the Linux Interrupt handlingBhoomil Chavda
 
HBase Consistency and Performance Improvements
HBase Consistency and Performance ImprovementsHBase Consistency and Performance Improvements
HBase Consistency and Performance ImprovementsDataWorks Summit
 
Understanding of Apache kafka metrics for monitoring
Understanding of Apache kafka metrics for monitoring Understanding of Apache kafka metrics for monitoring
Understanding of Apache kafka metrics for monitoring SANG WON PARK
 
Replicacion Postgresql
Replicacion PostgresqlReplicacion Postgresql
Replicacion Postgresqljockbrera
 
에너지 관리시스템 구축모델 및 합리적 운영방법 (ML)
에너지 관리시스템 구축모델 및 합리적 운영방법 (ML)에너지 관리시스템 구축모델 및 합리적 운영방법 (ML)
에너지 관리시스템 구축모델 및 합리적 운영방법 (ML)Hunter Shin
 
Enable DPDK and SR-IOV for containerized virtual network functions with zun
Enable DPDK and SR-IOV for containerized virtual network functions with zunEnable DPDK and SR-IOV for containerized virtual network functions with zun
Enable DPDK and SR-IOV for containerized virtual network functions with zunheut2008
 
FD.io VPP tap-inject with sample_plugins
FD.io VPP tap-inject with sample_pluginsFD.io VPP tap-inject with sample_plugins
FD.io VPP tap-inject with sample_pluginsNaoto MATSUMOTO
 
Scylla Summit 2022: The Future of Consensus in ScyllaDB 5.0 and Beyond
Scylla Summit 2022: The Future of Consensus in ScyllaDB 5.0 and BeyondScylla Summit 2022: The Future of Consensus in ScyllaDB 5.0 and Beyond
Scylla Summit 2022: The Future of Consensus in ScyllaDB 5.0 and BeyondScyllaDB
 
Power_780+(9179-MHD)표준제안서
Power_780+(9179-MHD)표준제안서Power_780+(9179-MHD)표준제안서
Power_780+(9179-MHD)표준제안서기한 김
 
Cassandra at Instagram (August 2013)
Cassandra at Instagram (August 2013)Cassandra at Instagram (August 2013)
Cassandra at Instagram (August 2013)Rick Branson
 
The ideal and reality of NVDIMM RAS
The ideal and reality of NVDIMM RASThe ideal and reality of NVDIMM RAS
The ideal and reality of NVDIMM RASYasunori Goto
 
HP Unix administration
HP Unix administrationHP Unix administration
HP Unix administrationHemnath R.
 
Apache Spark on K8S and HDFS Security with Ilan Flonenko
Apache Spark on K8S and HDFS Security with Ilan FlonenkoApache Spark on K8S and HDFS Security with Ilan Flonenko
Apache Spark on K8S and HDFS Security with Ilan FlonenkoDatabricks
 
Profiling your Applications using the Linux Perf Tools
Profiling your Applications using the Linux Perf ToolsProfiling your Applications using the Linux Perf Tools
Profiling your Applications using the Linux Perf ToolsemBO_Conference
 
What is new in MariaDB 10.6?
What is new in MariaDB 10.6?What is new in MariaDB 10.6?
What is new in MariaDB 10.6?Mydbops
 
How the Postgres Query Optimizer Works
How the Postgres Query Optimizer WorksHow the Postgres Query Optimizer Works
How the Postgres Query Optimizer WorksEDB
 
Tuning Apache Phoenix/HBase
Tuning Apache Phoenix/HBaseTuning Apache Phoenix/HBase
Tuning Apache Phoenix/HBaseAnil Gupta
 
How We Reduced Performance Tuning Time by Orders of Magnitude with Database O...
How We Reduced Performance Tuning Time by Orders of Magnitude with Database O...How We Reduced Performance Tuning Time by Orders of Magnitude with Database O...
How We Reduced Performance Tuning Time by Orders of Magnitude with Database O...ScyllaDB
 

Mais procurados (20)

Beneath the Linux Interrupt handling
Beneath the Linux Interrupt handlingBeneath the Linux Interrupt handling
Beneath the Linux Interrupt handling
 
HBase Consistency and Performance Improvements
HBase Consistency and Performance ImprovementsHBase Consistency and Performance Improvements
HBase Consistency and Performance Improvements
 
Understanding of Apache kafka metrics for monitoring
Understanding of Apache kafka metrics for monitoring Understanding of Apache kafka metrics for monitoring
Understanding of Apache kafka metrics for monitoring
 
Replicacion Postgresql
Replicacion PostgresqlReplicacion Postgresql
Replicacion Postgresql
 
에너지 관리시스템 구축모델 및 합리적 운영방법 (ML)
에너지 관리시스템 구축모델 및 합리적 운영방법 (ML)에너지 관리시스템 구축모델 및 합리적 운영방법 (ML)
에너지 관리시스템 구축모델 및 합리적 운영방법 (ML)
 
Enable DPDK and SR-IOV for containerized virtual network functions with zun
Enable DPDK and SR-IOV for containerized virtual network functions with zunEnable DPDK and SR-IOV for containerized virtual network functions with zun
Enable DPDK and SR-IOV for containerized virtual network functions with zun
 
FD.io VPP tap-inject with sample_plugins
FD.io VPP tap-inject with sample_pluginsFD.io VPP tap-inject with sample_plugins
FD.io VPP tap-inject with sample_plugins
 
Backup and Disaster Recovery in Hadoop
Backup and Disaster Recovery in Hadoop Backup and Disaster Recovery in Hadoop
Backup and Disaster Recovery in Hadoop
 
Scylla Summit 2022: The Future of Consensus in ScyllaDB 5.0 and Beyond
Scylla Summit 2022: The Future of Consensus in ScyllaDB 5.0 and BeyondScylla Summit 2022: The Future of Consensus in ScyllaDB 5.0 and Beyond
Scylla Summit 2022: The Future of Consensus in ScyllaDB 5.0 and Beyond
 
Power_780+(9179-MHD)표준제안서
Power_780+(9179-MHD)표준제안서Power_780+(9179-MHD)표준제안서
Power_780+(9179-MHD)표준제안서
 
Cassandra at Instagram (August 2013)
Cassandra at Instagram (August 2013)Cassandra at Instagram (August 2013)
Cassandra at Instagram (August 2013)
 
The ideal and reality of NVDIMM RAS
The ideal and reality of NVDIMM RASThe ideal and reality of NVDIMM RAS
The ideal and reality of NVDIMM RAS
 
HP Unix administration
HP Unix administrationHP Unix administration
HP Unix administration
 
Apache Spark on K8S and HDFS Security with Ilan Flonenko
Apache Spark on K8S and HDFS Security with Ilan FlonenkoApache Spark on K8S and HDFS Security with Ilan Flonenko
Apache Spark on K8S and HDFS Security with Ilan Flonenko
 
Profiling your Applications using the Linux Perf Tools
Profiling your Applications using the Linux Perf ToolsProfiling your Applications using the Linux Perf Tools
Profiling your Applications using the Linux Perf Tools
 
What is new in MariaDB 10.6?
What is new in MariaDB 10.6?What is new in MariaDB 10.6?
What is new in MariaDB 10.6?
 
How the Postgres Query Optimizer Works
How the Postgres Query Optimizer WorksHow the Postgres Query Optimizer Works
How the Postgres Query Optimizer Works
 
Tuning Apache Phoenix/HBase
Tuning Apache Phoenix/HBaseTuning Apache Phoenix/HBase
Tuning Apache Phoenix/HBase
 
Scalable webservice
Scalable webserviceScalable webservice
Scalable webservice
 
How We Reduced Performance Tuning Time by Orders of Magnitude with Database O...
How We Reduced Performance Tuning Time by Orders of Magnitude with Database O...How We Reduced Performance Tuning Time by Orders of Magnitude with Database O...
How We Reduced Performance Tuning Time by Orders of Magnitude with Database O...
 

Destaque

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
 

Destaque (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
 

Semelhante 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
 

Semelhante 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