Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

29

Click here to load reader

Transcript of Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

Page 1: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 2: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 3: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 4: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 5: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 6: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 7: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 8: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 9: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 10: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 11: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 12: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 13: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 14: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 15: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 16: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 17: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 18: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 19: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 20: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 21: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 22: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 23: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 24: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 25: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 26: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 27: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 28: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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

Page 29: Twisted Framework: desenvolver aplicações distribuídas nunca foi tão fácil

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