Pergunta

Estou desenvolvendo software usando o Google App Engine.

Eu tenho algumas considerações sobre o projeto ideal sobre o seguinte problema: Eu preciso para criar e salvar instantâneos de algumas entidades em intervalos regulares

.

no mundo db relacional convencional, eu iria criar db empregos que inserir novos registros de resumo.

Por exemplo, um trabalho que inserir um registro para cada usuário ativo que conteria sua pontuação atual para a tabela de "userrank", digamos, a cada hora.

Eu gostaria de saber qual é o melhor método para conseguir isso em Google App Engine. Eu sei que há o serviço Cron, mas será que nos permitem executar tarefas que irá inserir / atualizar milhares de registros?

Foi útil?

Solução

Você considerou usando o api remota em vez disso? Desta forma, você poderia obter um shell para o seu armazenamento de dados e evitar os tempos de espera. A classe Mapper eles demonstram em que apontam é bastante útil e eu usei-o com sucesso para fazer operações em lote em ~ 1500 objetos.

Dito isso, cron deve funcionar bem também. Você tem um limite no tempo de cada pedido individual para que você não pode simplesmente mastigar através de todos eles de uma vez, mas você pode usar o redirecionamento de varrer tantos usuários quanto você quiser, processar um usuário de cada vez. Deve haver um exemplo disso na documentação em algum lugar se você precisar de ajuda com esta abordagem.

Outras dicas

Eu acho que você verá que snapshotting estado de cada usuário a cada hora não é algo que vai dimensionar bem, não importa o que o seu quadro. Um ambiente mais comum vai disfarçar isso, deixando você tem tarefas mais correndo, mas você ainda vai chegar ao ponto onde não é prático para tirar um instantâneo de dados de cada usuário, a cada hora.

A minha sugestão seria a seguinte: Adicionar um campo 'último instantâneo', e subclasse a função put () do seu modelo (supondo que você está usando Python, o mesmo é possível em Java, mas eu não sei a sintaxe ), de modo que sempre que você atualizar um registro, ele verifica se ele foi mais de uma hora desde o último snapshot, e em caso afirmativo, cria e grava um registro instantâneo.

A fim de evitar atualizações simultâneas, criando dois instantâneos idênticos, você vai querer dar os instantâneos um nome chave derivada a partir do momento em que o instantâneo foi tirado. Dessa forma, se duas atualizações simultâneas tentar escrever um instantâneo, um vai inofensivamente substituir o outro.

Para obter o instantâneo para uma determinada hora, simplesmente consulta para o instantâneo mais antigo mais recente do que o período solicitado. Como um bônus adicional, desde que os registros inativos não são snapshotted, você está economizando um monte de espaço, também.

Gostaria de usar uma combinação de Cron empregos e um looping url buscar método detalhado aqui: http: // stage.vambenepe.com/archives/549 . Desta forma, você pode pegar seus limites de tempo e começar um outro pedido.

Para resumir o artigo, o trabalho cron chama seu processo inicial, você pegar o erro de tempo limite e chamar o processo novamente, mascarado como uma segunda url. Você tem que ping entre os dois URLs para manter app engine de pensar que você está em um loop acidental. Você também precisa ter cuidado para que você não loop infinito. Certifique-se de que existe um estado final para o seu ciclo de atualização, uma vez que este iria colocá-lo sobre suas quotas muito rapidamente se ele nunca terminou.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top