yeah, tudo assíncrono!
Publicado; janeiro 20, 2010 Arquivado em: programação, python, rede, sistema, telecom | Tags: asynchronous, comet, cyclone, driver, mongodb, python, redis, restmq, streaming api, tornado, twisted, twitter, txredisapi 5 ComentáriosUltimamente tem sido tudo assim, assíncro. O Nuswit já vai fazer aniversário de 1 ano, e vale lembrar que está em produção contínua, sem dar nenhuma manutenção.
Já estou mais que convencido que o caminho pros próximos anos dessa década não pode ser outro, ainda mais com o WebSocket no w3c.
Para contribuir com a interwebs, tenho mantido os seguintes projetos:
http://github.com/fiorix/cyclone
Um clone do Tornado, webserver assíncrono do FriendFeed, que desde o ano passado é do Facebook. Essa implementação, batizada de Cyclone, tem algumas diferenças:
- Core I/O baseado no Twisted
- Suporte nativo a XMLRPC
- Suporte a localização baseada no gettext – ao invés do CSV, original do Tornado
Com vários aplicativos de exemplos, todos os plug-ins do Tornado para autenticação no Google, Twitter, Facebook, OAuth, OpenID, etc…
O RestMQ (coisas do Gleicon, que ajudei a implementar) é baseado nele. A nova versão do Nuswit também será.
http://github.com/fiorix/twisted-twitter-stream
Uma API bem simples para acessar a Streaming API do Twitter. Provê suporte a todos os métodos publicados pela API.
Não depende do TwistedWeb, a implementação do HTTP 1.1 está inteira no código – na verdade, apenas o lado do client com suporte a Comet.
Permite criar sistemas como este.
http://github.com/fiorix/txredisapi
Um driver assíncrono pro Redis, também baseado no Twisted. O protocolo de comunicação já existia, mas era carente de algumas coisas, que implementei:
- Métodos de conexão com Auto-Reconnect
- Lazy Connections (para usar em web servers)
- Connection Pools
- Sharding baseado em Consistent Hashing (+Gleicon)
- Sharding com Connection Pools
Além de estável, é muito rápido! Também foi usado no RestMQ, e aparentemente, está se tornando popular. Hoje achei algumas referências enquanto procurava no Google.
http://github.com/fiorix/mongo-async-python-driver
Outro driver de banco de dados, pro MongoDB. O driver original para Python é síncrono, o que dificulta (embora não impossibilita) de usar em sistemas assíncronos, especialmente baseados no Twisted.
Boa parte da implementação é baseada no pymongo original, inclusive o codec de BSON (em C), formato binário usado pelo Mongo, baseado em JSON.
Provavelmente se tornará o driver assíncrono oficial do Mongo para Python+Twisted, e está em vias de se tornar estável – isso devido às várias mudanças na API, e implementação de vários recursos incluindo Lazy Connections, e Document Reference.
Também, já tem algumas pessoas de olho no GitHub, acompanhando o desenvolvimento.
Entre os vários dbs nosql (couch, redis, etc) o Mongo é um dos mais completos, com uma linguagem de query muito decente, entre os vários outros recursos nativos. O fato de usar mmap para acessar os dados também faz com que ele seja muito rápido.
http://github.com/fiorix/tornado
That page doesn’t exist!
O nome do repositório mudou para cyclone: http://github.com/fiorix/cyclone .
Fala Fiori,
Não sei se vc lembra de mim, mas foi seu aluno do curso de Redes de Computadores da Impacta (eu era da classe do Felipe Fag e o Style) ta lembrado ?
Sempre visito seu blog, tem um conteudo muito bom…..parabens por todos os seus trabalhos…com certeza vc é um cara que admiro no mundo de T.I.
Abração.
Fala Alexandre. Sou o cara do Filtrie, lá da Campus Party. Por acaso eu já havia lido alguns posts do seu blog antes da CP (monitoro posts sobre nosql/mongodb e descobri o blog assim), mas só hj quando fui te procurar no twitter me toquei que vc era vc :D
Já que o assunto do seu post é assync, duas outras boas ferramentas que tenho usado pra tornar web apps assync são (provavelmente vc já conheça):
– Gearman.org (job manager)
– nginx_http_push_module (http://github.com/slact/nginx_http_push_module), módulo pro nginx ideal pra uso em aplicaçoes COMET
Abs e sucesso.
Muito informativo esse post, porém estou com algumas dúvidas. Atualmente venho desenvolvendo um sistema de gestão para mutiplos usuários e cada acesso é realizado sobre um subdomínio.
Meu ambiente atual é o Django para tratar apenas as requisições POST ou GET, nada além disso. Passei a usar o MongoDb com o PyMongo+MongoEngine (ainda não sei é a melhor opçao) e para deployment Ngnix para arquivos estaticos (a user interface é baseada na biblioteca ExtJs) e o Apache com WSGI para controlar os processos Python….tudo isso funciona bem, mas realmente não sei a performance disso quando a aplicação começar a crescer vai me trazer problemas.
Com base no seu post, vc acha q a combinação Cyclone+Twisted+Mongo-Async-Driver eu teria um desempenho melhor no meu projeto? Além da facilidade de implementação+deployment…
Abraços,
Samir