Click here to load reader
Upload
pedro-arthur-duarte-jedi
View
494
Download
3
Embed Size (px)
Citation preview
Twisted FrameworkDesenvolver aplicacoes distribuıdas nunca foi tao facil
Pedro Arthur P. R. Duarte (JEdi)Msc. student in Computer Networks Management – UFRGS
Core Developer – HLBR Project
O Mote de nossa Palestra
IntroducaoTwisted, djabeisso?Building Blocks
Assincronismo, Eventos eCallbacksO Laco de eventosOla, mundo!
Protocolos e FabricasCriando protocolos
The Useless Protocol!
Fabricas, pra que te quero?Instanciando FabricasSobrecarregando fabricas
Instanciar ou Sobrecarregar?
Que venham os clientes!Programacao Assıncrona
Chamadas nao bloqueantesDeferreds
CallbackingErrbackingA formula magica dosDeferreds
E quem usa o Twisted?Alguns casos de sucesso
Aos FinalmentesPerguntas e Contatos
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Twisted, djabeisso?
I Framework Python para aplicacoes distribuıdas:
I Esqueca os detalhes de baixo nıvel!I Mas use-os se quiser :-)I Binarios disponıveis nos melhores gerenciadores de pacotes;I E os fontes em http://twistedmatrix.com;
I Orientacao a objetos e Padroes de Projeto levados a serio!
I Protocolos prontos para usar!
I HTTP, FTP, SSH, SMTP/IMAP, SSL, DNS, Netstring,SNMP, XMPP, dentre outros...
I Basta adicionar agua :-)
I Assıncrono, dirigido a eventos e baseado em callbacks;
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Assincronismo, eventos, callbacks? Cuma?
Nao nos chame. Pode deixar que nos chamamos voce!– Reversal Twıstica
I Para o Twisted, existem apenas eventos!
I Novas conexoes, dados recebidos, conexoes fechadas, erros detransmissao, etc, etc, etc;
I Callbacks tratam os eventos!
I connectionMade, dataReceived, connectionLost,connectionRefused, etc, etc, etc;
I E quando os eventos ocorrem?
I Nao se sabe... Sao completamente assıncronos... /o\I Porem, seguem regras bem definidas! \o/
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Contemplem, o laco de eventos!
I Cuida dos detalhes de I/O do sistema operacional,networking, temporizadores, threading, ...
I Na verdade, so nao faz chover!
Padrao ReactorA concurrent programming pattern for handling service requests deliveredconcurrently to a service handler by one or more inputs. The service handlerthen demultiplexes the incoming requests and dispatches them synchronouslyto the associated request handlers.
So pode haver um!– Highlander, 1 . . . n
I Separacao entre codigo de aplicacao e do reator:
I O reator nao tem nocao sobre a aplicacao;I As aplicacoes so conhecem as interfaces do reator;
I Reuso e Modularidade;
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Ola mundo, num modo Twisted de ser!
1 from t w i s t e d . i n t e r n e t import r e a c t o r
3 def h e l l o W o r l d ( ) :4 p r i n t ” H e l l o World ! ”
6 r e a c t o r . ca l lWhenRunning ( h e l l o W o r l d )7 r e a c t o r . ca l lWhenRunning ( r e a c t o r . s t o p )
9 r e a c t o r . run ( )
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
O nascimento de um novo protocolo
I Protocolos sao componentes independentes;
I Nao estao diretamente associados a protocolos de rede,transporte ou qualquer outra coisa;
I Nao conhecem portas, nem enderecos, nem nada!
I Implementacoes de twisted.internet.protocol.Protocol
I connectionMade(self)I dataReceived(self, data)I connectionLost(self, reason)
I ou filhas de pais ricos:
I twisted.protocols.basic.LineReceiverI twisted.protocols.basic.NetstringReceiverI twisted.protocols.ftp.FTPI twisted.web.http.HTTPChannel
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
O protocolo mais inutil do mundo
1 from t w i s t e d . i n t e r n e t . p r o t o c o l import P r o t o c o l
3 c l a s s U s e l e s s P r o t o c o l ( P r o t o c o l ) :4 def i n i t ( s e l f ) :5 ’ ’ ’My i n s t a n t i a t i o n phase ’ ’ ’6 pass
8 def connect ionMade ( s e l f ) :9 ’ ’ ’ Someone connected . Here goes i t ’ s QOTD ’ ’ ’
10 s e l f . t r a n s p o r t . w r i t e ( ”Welcome , d e a r u s e r !\ n” )
12 def d a t a R e c e i v e d ( s e l f , data ) :13 ’ ’ ’ User s ends me data ! We ’ l l e choes i t back ’ ’ ’14 s e l f . t r a n s p o r t . w r i t e ( data )
16 def c o n n e c t i o n L o s t ( s e l f , r e a s o n ) :17 ’ ’ ’ And , i t s gonne . . . ’ ’ ’18 p r i n t r e a s o n
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Fabricando servidores
Together we stand, divided we fall!– Hey you, Pink Floyd
I Sozinhos, protocolos nao sao nada!
I Eles precisam de fabricas:
I twisted.internet.protocol.Factory
Padrao Factory
Define an interface for creating an object, but let the subclasses decide whichclass to instantiate. The Factory method lets a class defer instantiation tosubclasses.
I E tambem precisam da atencao do laco de eventos!
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Revisitando nosso inutil protocolo
Abordagem 1: Instanciando uma Factory
1 from t w i s t e d . i n t e r n e t . p r o t o c o l import P r o t o c o l , F a c t o r y2 from t w i s t e d . i n t e r n e t import r e a c t o r
4 c l a s s U s e l e s s P r o t o c o l ( P r o t o c o l ) :5 ’ ’ ’ E v e r y t h i n g we ’ ve done b e f o r e ’ ’ ’
7 f a c t o r y = F a c t o r y ( )8 f a c t o r y . p r o t o c o l = U s e l e s s P r o t o c o l
10 r e a c t o r . l i s t e n T C P (10101 , f a c t o r y )11 r e a c t o r . run ( )
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Nosso inutil protocolo revisitado
Abordagem 2: Sobrecarregando uma Factory
1 from t w i s t e d . i n t e r n e t . p r o t o c o l import P r o t o c o l , F a c t o r y2 from t w i s t e d . i n t e r n e t import r e a c t o r
4 c l a s s U s e l e s s P r o t o c o l ( P r o t o c o l ) :5 ’ ’ ’ E v e r y t h i n g we ’ ve done b e f o r e ’ ’ ’
7 c l a s s U s e l e s s F a c t o r y ( F a c t o r y ) :8 p r o t o c o l = U s e l e s s P r o t o c o l
10 r e a c t o r . l i s t e n T C P (10101 , U s e l e s s F a c t o r y ( ) )11 r e a c t o r . run ( )
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Instanciar ou Sobrecarregar? Eis a questao
Quando...
Instanciar
Nao ha necessidade de persistirou compartilhar dados entre osdiversos clientes
Sobrecarregar
Ha a necessidade de persistir oucompartilhar dados entre osdiversos clientes
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Instanciar ou Sobrecarregar? Eis a questao
Quando...
Instanciar
Nao ha necessidade de persistirou compartilhar dados entre osdiversos clientes
Sobrecarregar
Ha a necessidade de persistir oucompartilhar dados entre osdiversos clientes
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Instanciar ou Sobrecarregar? Eis a questao
Quando...
Instanciar
Nao ha necessidade de persistirou compartilhar dados entre osdiversos clientes
Sobrecarregar
Ha a necessidade de persistir oucompartilhar dados entre osdiversos clientes
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Sem conversa mole! Queremos codigo!
Uma micro Honeypot
1 from t w i s t e d . i n t e r n e t . p r o t o c o l import P r o t o c o l , F a c t o r y2 from t w i s t e d . i n t e r n e t import r e a c t o r
4 c l a s s Gener icHoneyPot ( P r o t o c o l ) :5 def connect ionMade ( s e l f ) :6 p e e r = s e l f . t r a n s p o r t . getHost ( )7 p r i n t ’ {0} has c o n n e c t e d to {1} ({2} ) ’ . fo rmat (8 p e e r . host , s e l f . f a c t o r y . l s t P r t , p e e r . t y p e )9 i f s e l f . f a c t o r y . cmData i s not None :
10 s e l f . t r a n s p o r t . w r i t e ( s e l f . f a c t o r y . cmData )
12 def d a t a R e c e i v e d ( s e l f , data ) :13 i f s e l f . f a c t o r y . drData i s not None :14 s e l f . t r a n s p o r t . w r i t e ( s e l f . f a c t o r y . drData )15 s e l f . t r a n s p o r t . l o s e C o n n e c t i o n ( )
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Sem conversa mole! Queremos codigo!
Continuando nossa micro Honeypot
16 c l a s s HPFactory ( F a c t o r y ) :17 p r o t o c o l = Gener icHoneyPot18 def i n i t ( s e l f , p r o t o c o l D a t a ) :19 s e l f . l s t P r t = p r o t o c o l D a t a [ 0 ]20 s e l f . cmData = p r o t o c o l D a t a [ 1 ]21 s e l f . drData = p r o t o c o l D a t a [ 2 ]
23 p r o t o c o l s = [24 ( 2 2 , ”SSH−2.0−OpenSSH 5 . 5 p1 Debian−4\n” , ’ \x01\x08 ’ ) ,25 ( 8 0 , None , ’HTTP/ 1 . 1 404 Not Found\n ’ +26 ’ Content−Length : 0\n\n ’ ) ,27 ]
29 f o r p i n p r o t o c o l s :30 r e a c t o r . l i s t e n T C P ( p [ 0 ] , HPFactory ( p ) )31 r e a c t o r . run ( )
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
E clientes, eles existem no Twisted?
I Existem, claro... E continuam como implementacoes detwisted.internet.protocol.Protocol;
I Porem, nao precisam de fabricas, caso nao haja persistenciaentre as diversas instanciacoes (caso comum);
I twisted.internet.protocol.ClientCreator
I Quando precisam de fabricas, a classe a ser sobrecarregada etwisted.internet.protocol.ClientFactory
I startedConnectingI clientConnectionLostI clientConnectionFailed
Luke, I am your father!– Darth Vader (misquoted)
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Codigos, codigos, e mais codigos!
Um inocente scanner de rede
1 c l a s s S c a n n e r C l i e n t ( P r o t o c o l ) :2 def i n i t ( s e l f , p o r t ) :3 s e l f . t P o r t = p o r t
5 def connect ionMade ( s e l f ) :6 p r i n t ” Port {0} i s open ” . fo rmat ( s e l f . t P o r t )7 s e l f . t r a n s p o r t . l o s e C o n n e c t i o n ( )
9 def showAsClosed ( reason , t P o r t ) :10 p r i n t ” Port {0} i s c l o s e d ” . fo rmat ( t P o r t )
12 f o r p i n [ 21 , 22 , 23 , 25 , 80 , 110 , 443 ] :13 c = C l i e n t C r e a t o r ( r e a c t o r , S c a n n e r C l i e n t , p )14 d = c . connectTCP ( ”www. exemplo . com” , p )15 d . addErrback ( showAsClosed , p )
17 r e a c t o r . run ( )
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Assincronismo e Sistemas Distribuıdos
I Conexoes tratadas por processo paralelos;
I Diferentes instancias de um mesmo software tratam asdiferentes conexoes;
I O sistema operacional encarrega-se do escalonamento;
I Conexoes tratadas por fluxos de execucao paralelos (threads);
I Diferentes fluxo de execucao de um mesmo processo tratam asdiferentes conexoes;
I O framework de desenvolvimento encarrega-se doescalonamento;
I Chamadas nao bloqueantes;
I Um unico fluxo de execucao trata todas as conexoes atraves defuncoes que nao atrapalham a execucao do processo;
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Nao devemos bloquear!
I Os metodos (callbacks) dos protocolos nao devem bloquear ofluxo de execucao enquanto aguardam por dados;
I Consultas SQL em SGBDs, leituras em descritores de arquivos,autenticacao em servidores de diretorios, etc.
I Os metodos (callbacks) dos protocolos devem ser tao simplesquanto possıvel. Complexidade e feia e nociva!
I Maquinas de estado sao mais que bem vindas!I Lacos O(nk ), onde k ≥ 2, nem pensar! (vide proximo item)
I Metodos inerentemente complexos ou computacionalmenteintensivos tambem nao devem bloquear.
E fica a pergunta: mas como?
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
A resposta: deferreds!
Eu vou executar, mas nao vou retornar agora!– Deferreds da Silva
I Deferreds sao a promessa de algum metodo ou funcaoretornara dados, mas nao bloquearao enquanto os provisiona;
I Sem garantir quando esses dados estarao disponıvel;
I Executam callbacks quando os dados estao disponıveis ouerrbacks quando algum erro ocorre.
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Deferring, ou postergando resultados
I Instancias ou sobrecargas de t.i.defer.Deferred
I addCallbackI addErrbackI addCallbacksI addBoth
I Quando sobrecarregar?
I Quando algum motivo obscuro obrigar-lhe a alterar ocomportamento dos metodos do Deferred; ou
I Por elegancia, talvez;I Ou seja, quase nunca...
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Instanciando Deferreds
Deferred, otima maneira de complicar um simples Hello World!
1 from t w i s t e d . i n t e r n e t . d e f e r import D e f e r r e d2 from t w i s t e d . i n t e r n e t import r e a c t o r
4 def h e l l o D e f e r r e d ( ) :5 d = D e f e r r e d ( )6 r e a c t o r . ca l lWhenRunning ( d . c a l l b a c k , ”Hi , t h e r e ! ” )7 re tu rn d
9 def p r i n t I t ( r e s u l t ) :10 p r i n t r e s u l t11 r e a c t o r . s t o p ( )
13 d = h e l l o D e f e r r e d ( )14 d . a d d C a l l b a c k ( p r i n t I t )
16 r e a c t o r . run ( )
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Sobrecarregando Deferreds
Criancas, pela gloria de Dada, nao facam isso em casa!
1 from t w i s t e d . i n t e r n e t . d e f e r import D e f e r r e d2 from t w i s t e d . i n t e r n e t import r e a c t o r
4 c l a s s H e l l o D e f e r ( D e f e r r e d ) :5 def i n i t ( s e l f ) :6 D e f e r r e d . i n i t ( s e l f )
8 def a d d C a l l b a c k ( s e l f , c a l l b a c k ) :9 D e f e r r e d . a d d C a l l b a c k ( s e l f , c a l l b a c k )
10 r e a c t o r . ca l lWhenRunning ( s e l f . c a l l b a c k , ” Hi ! ” )
12 def p r i n t I t ( r e s u l t ) :13 p r i n t r e s u l t14 r e a c t o r . s t o p ( )
16 H e l l o D e f e r ( ) . a d d C a l l b a c k ( p r i n t I t )17 r e a c t o r . run ( )
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Errbacking, ou sinalizando erros
Terminando de entender nossa Honeypot
9 def showAsClosed ( reason , t P o r t ) :10 p r i n t ” Port {0} i s c l o s e d ” . fo rmat ( t P o r t )
12 f o r p i n [ 21 , 22 , 23 , 25 , 80 , 110 , 443 ] :13 c = C l i e n t C r e a t o r ( r e a c t o r , S c a n n e r C l i e n t , p )14 d = c . connectTCP ( ”www. exemplo . com” , p )15 d . addErrback ( showAsClosed , p )
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Deferreds, formula magica
Como postegar o resultado de qualquer chamada!
1 def B l o c k i n g F u n c t i o n ( d ) :2 r = doTheJob ( )3 d . c a l l b a c k ( r )
5 def D e f e r r e d F u n c t i o n ( ) :6 d = D e f e r r e d ( )7 r e a c t o r . c a l l F r o m T h r e a d ( B l o c k i n g F u n c t i o n , d )8 re tu rn d
10 # Then , c a l l i t wh i thout g e t t i n g b l ocked \o/11 D e f e r r e d F u n c t i o n ( ) . a d d C a l l b a c k ( myCal lback )
ps: essa e uma solucao n00b; use t.i.threads.deferToThread
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Nao e apenas outro framework
Esse slide tinha por objetivo apresentar casos de sucesso doTwisted. Ele foi removido devido ao copyright das marcasapresentadas. As informacoes aqui disponıveis podem serencontradas em
http://twistedmatrix.com/trac/wiki/SuccessStories
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
Onde consigo ajuda?
I http://twistedmatrix.com/documentsI Lista de discussaoI Wiki
I Twisted Networking Programming Essentials (Livro)Por Abe Fettig, O’Reilly
I Network programming for the rest of us (Artigo)Por Lefkowitz & Shtull-Trauring, USENIX 2003
I Twisted IntroductionPor Deve Peticolas, http://krondo.com/
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN
That’s all folks...
Crıticas ou Questionamentos?
E-Mail: [email protected]@inf.ufrgs.br
Identi.ca: @PEdrArthur↪→ Tambem no Twitter
Web: http://pedroarthur.com.br (off-line)http://blog.pedroarthur.com.br (off-line)
Pedro Arthur P. R. Duarte (JEdi) Twisted Framework 5 de Novembro de 2010, Natal/RN