Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Usando aipo para consulta de API externa síncrona em tempo real com Gevent


Vou tentar responder ao maior número de perguntas possível.

Isso pode (e deve) ser feito usando aipo?

sim você pode

Estou usando o django. Devo tentar usar o django-celery sobre o aipo simples?

Django tem um bom suporte para aipo e facilitaria muito a vida durante o desenvolvimento

Cada uma dessas tarefas pode gerar outras tarefas - como registrar o que acabou de acontecer ou outros tipos de ramificação. Isso é possível?

Você pode iniciar subtarefas de dentro de uma tarefa com ignore_result =true apenas para efeitos colaterais

As tarefas podem estar retornando os dados que obtêm - ou seja, potencialmente Kb de dados por meio de aipo (redis como subjacente neste caso) ou devem gravar no banco de dados e apenas passar ponteiros para esses dados?

Eu sugeriria colocar os resultados em db e, em seguida, passar o id ao redor faria seu corretor e trabalhadores felizes. Menos transferência de dados/decapagem etc.

Cada tarefa é principalmente vinculada a E/S e inicialmente usaria apenas o gevent do encadeamento da Web para distribuir as solicitações e pular todo o design de fila, mas acontece que ele seria reutilizado para um componente diferente. Tentar manter toda a viagem de ida e volta através do Qs em tempo real provavelmente exigirá muitos trabalhadores certificando-se de que as filas estejam quase vazias. Ou é? A execução do gevent workerpool ajudaria com isso?

Como o processo é vinculado a io, o gevent definitivamente ajudará aqui. No entanto, quanto a simultaneidade deve ser para gevent pool'd worker, é algo que também estou procurando por resposta.

Eu tenho que escrever tarefas específicas do gevent ou usar o pool do gevent lidará com a E/S de rede automaticamente?

Gevent faz o patch de macaco automaticamente quando você o usa na piscina. Mas as bibliotecas que você usa devem funcionar bem com o gevent. Caso contrário, se você estiver analisando alguns dados com simplejson (que está escrito em c), isso bloquearia outros greenlets gevent.

É possível atribuir prioridade a determinadas tarefas?

Você não pode atribuir prioridades específicas a determinadas tarefas, mas encaminhá-las para uma fila diferente e fazer com que essas filas sejam ouvidas por um número variável de trabalhadores. Quanto mais trabalhadores para uma fila específica, maior seria a prioridade dessas tarefas nessa fila.

Que tal mantê-los em ordem?

A cadeia é uma forma de manter a ordem. O acorde é uma boa maneira de resumir. O aipo cuida disso, então você não precisa se preocupar com isso. Mesmo usando gevent pool, ao final seria possível raciocinar sobre a ordem de execução das tarefas.

Devo pular o aipo e usar apenas o kombu?

Você pode, se o seu caso de uso não mudar para algo mais complexo ao longo do tempo e também se você estiver disposto a gerenciar seus processos através do celeryd + supervisord por conta própria. Além disso, se você não se importa com o monitoramento de tarefas que vem com ferramentas como aipo, flor, etc.

Parece que o aipo é mais voltado para "tarefas" que podem ser adiadas e não são sensíveis ao tempo.

O aipo também suporta tarefas agendadas. Se é isso que você quis dizer com essa afirmação.

Estou louco por tentar manter isso em tempo real?

Eu não acho. Contanto que seus consumidores sejam rápidos o suficiente, será tão bom quanto em tempo real.

Que outras tecnologias devo observar?

Com relação ao aipo, você deve escolher o armazenamento de resultados com sabedoria. Minha sugestão seria usar cassandra. É bom para dados em tempo real (tanto para gravação quanto para consulta). Você também pode usar redis ou mongodb. Eles vêm com seu próprio conjunto de problemas como armazenamento de resultados. Mas então um pequeno ajuste na configuração pode percorrer um longo caminho.

Se você quer dizer algo completamente diferente de aipo, então você pode olhar para asyncio (python3.5) e zeromq para conseguir o mesmo. Eu não posso comentar mais sobre isso embora.