Usando Amazon SQSВ¶
Instalação
Para o suporte do Amazon SQS, você precisa instalar a biblioteca boto usando pip:
Configuração
Você precisa especificar SQS no URL do corretor:
onde o formato da URL é:
você deve se lembrar de incluir o & # 8220; & # 64; & # 8221; no fim .
As credenciais de login também podem ser definidas usando as variáveis de ambiente AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY, nesse caso, o URL do corretor só pode ser sqs: //.
Se você estiver usando as funções IAM em instâncias, você pode configurar o BROKER_URL para: sqs: // e o kombu tentará recuperar tokens de acesso dos metadados da instância.
Se você especificar as credenciais da AWS no URL do corretor, lembre-se de que a chave de acesso secreto pode conter caracteres inseguros que precisam ser codificados em URL.
Região
A região padrão é us-east-1, mas você pode selecionar outra região configurando a configuração broker_transport_options:
Uma visão geral das regiões do Amazon Web Services pode ser encontrada aqui:
Tempo limite de visibilidade¶¶
O tempo limite de visibilidade define o número de segundos para aguardar que o trabalhador confirme a tarefa antes que a mensagem seja redigitada para outro trabalhador. Veja também as ressalvas abaixo.
Esta opção é definida através da configuração broker_transport_options:
O tempo limite de visibilidade padrão é de 30 segundos.
Intervalo de Votação
O intervalo de pesquisa determina o número de segundos para dormir entre as pesquisas erradas. Esse valor pode ser um int ou um flutuador. Por padrão, o valor é de um segundo: isso significa que o trabalhador dormirá por um segundo quando não houver mais mensagens para ler.
Você deve notar que a pesquisa mais freqüente também é mais cara, então aumentar o intervalo de votação pode economizar dinheiro.
O intervalo de pesquisa pode ser definido através da configuração broker_transport_options:
Intervalos de polling muito freqüentes podem causar loops ocupados, resultando em um trabalhador usando muito tempo de CPU. Se você precisar de uma precisão de sub-milissegundo, considere usar outro transporte, como RabbitMQ & lt; broker-amqp & gt; , ou Redis & lt; broker-redis & gt; .
Prefix de Fila¶
Por padrão, o Celery ganhou & # 8217; t atribuir qualquer prefixo aos nomes das filas. Se você tiver outros serviços usando SQS, você pode configurá-lo, usando a configuração broker_transport_options:
Se uma tarefa não for reconhecida dentro do visibility_timeout, a tarefa será redelivered para outro trabalhador e executada.
Isso causa problemas com as tarefas de ETA / contagem regressiva / repetição, onde o tempo de execução excede o tempo limite de visibilidade; na verdade, se isso acontecer, ele será executado novamente, e novamente em um loop.
Então, você precisa aumentar o tempo limite de visibilidade para coincidir com o tempo da ETA mais longa que você planeja usar.
Observe que o Aipo redeliverá mensagens no desligamento do trabalhador, então, ter um longo período de tempo de visibilidade só atrasará a entrega da & # 8216; perdida & # 8217; tarefas em caso de falha de energia ou trabalhadores com extinção forçada.
Tarefas periódicas não serão afetadas pelo tempo de espera de visibilidade, pois é um conceito separado da ETA / contagem regressiva.
O tempo limite de visibilidade máximo suportado pela AWS a partir desta escrita é de 12 horas (43200 segundos):
O SQS ainda não suporta comandos de controle remoto do trabalhador.
SQS não tem eventos de suporte, e não pode ser usado com eventos de aipo, celerymon ou o monitor Django Admin.
Múltiplos produtos na família Amazon Web Services podem ser um bom candidato para armazenar ou publicar resultados com, mas não existe nenhum resultado desse resultado incluído neste momento.
Não use o backend do resultado amqp com o SQS.
Ele criará uma fila para cada tarefa e as filas não serão coletadas. Isso poderia custar-lhe dinheiro que seria melhor gasto, contribuindo com um backend da loja de resultados AWS de volta ao Celery :)
Celery Redis Sentinel¶
Broker de aipo e implementação de backend de resultados para a Redis Sentinel.
A Redis é uma loja de dados de valores-chave de memória muito incrível. Estar na memória faz com que seja rápido, no entanto, a um custo de não-persistência. Em aplicativos de negócios críticos (você sabe, o que faz dinheiro da empresa) que torna a implementação de redis autônomo não prática. Este é o lugar onde a Redis Sentinel entra. Fornece escalabilidade e alta disponibilidade para Redis 2.X (Redis 3.X vem com clustering nativo diferente de Sentinel). Como resultado, a Redis se torna uma solução viável para resolver algumas das necessidades do negócio. Como você pode imaginar a partir do título do projeto, um caso de uso está usando o Redis Sentinel com aipo. Infelizmente, o aipo não suporta Redis Sentinel por padrão, portanto, esta biblioteca, que visa fornecer suporte não oficial da Redis Sentinel, tanto como corretor de aipo como backend de resultados.
Instalando¶
A instalação é super fácil com pip:
Usar esta biblioteca é bastante simples. Tudo o que você precisa fazer é configurar o aipo para usar o Redis Sentinel para o backend dos corretores e / ou dos resultados. Isso é feito com algumas configurações:
Algumas notas sobre a configuração:
observe o uso do esquema redis-sentinela dentro do URL para corretor e backend de resultados. Para usar esse esquema, que não é enviado com o aipo, onde você cria seu aplicativo de aipo, você deve primeiro se inscrever no suporte para sentinelas:
O nome do host e a porta são ignorados dentro do URL atual. O Sentinel usa a configuração de sentinelas de opções de transporte para criar um Sentinel () em vez de URL de configuração.
Agendamento durante o failover¶
Algumas considerações ao usar o Redis Sentinel como corretor de aipo. Enquanto o failover está em andamento, nenhuma tarefa pode ser agendada. Tentando agendar uma tarefa, será aumentar Timeout ou ConnectionError. Isso ocorre porque outros nós de sentinela dentro do cluster, dependendo da configuração, têm um tempo limite até eleger um novo mestre. Durante esse tempo, tentar agendar uma tarefa tentará armazená-la agora no nó mestre inválido daí a exceção. Se isso for inaceitável dentro do seu aplicativo, esta biblioteca vem com um pequeno invólucro que permite desencadear tarefas que bloquearão o agendamento até que o novo mestre seja eleito:
Alternativamente, você pode usar uma subclasse de tarefa de apio abstrata fornecida que forneça o mesmo comportamento de reintentamento na própria definição de tarefa:
Este utilitário foi criado nas tecnologias dealertrack (dealertrack GitHub) para uso interno, por isso, agradeço a dealertrack por permitir contribuir com a utilidade para a comunidade open source.
Development Lead¶
Miroslav Shubernetskiy - https: // github / miki725.
Colaboradores¶
Andrey Kostakov - https: // github / AyumuKasuga.
Mestre (ainda não em PyPI) ¶
0,3 (2018-05-03) ¶
Novo: adição de ShortLivedStrictRedis e ShortLivedSentinel. Ambos usam conexões de curta duração que se desconectam dos redis assim que a consulta para redis estiver completa. Corrigido: todas as conexões sentinelas agora são criadas via ShortLivedSentinel. Isso corrige um problema quando a sentinela atingisse seu limite máximo de conexões, pois todos os trabalhadores de aipo estarão sempre conectados a sentinelas. Isso não é necessário, uma vez que o sentinela é consultado muito raramente para os detalhes atuais da conexão mestre. Além disso, isso é útil quando o Redis Sentinel é usado por trás de um firewall, já que a sentinela não perceberia quando o firewall fecharia as conexões e, assim, não as liberaria.
0,2 (2018-01-14) ¶
Novo: EnsuredRedisTask adicionado, que permite garantir que as tarefas sejam agendadas através de uma classe de tarefa básica abstrata na definição da tarefa e, em seguida, usando explicitamente secure_redis_call ao chamar a tarefa:
0.1 (2018-01-13) ¶
Primeiro lançamento.
A Licença MIT (MIT)
Direitos autorais © 2018-2018, dealertrack technologies.
&cópia de; Copyright 2018, tecnologias de comerciante. Revisão f395abd9.
Usando Redis¶¶
Instalação
Para o suporte da Redis, você precisa instalar dependências adicionais. Você pode instalar o apio e essas dependências de uma só vez usando o pacote de aipo [redis]:
Configuração
A configuração é fácil, basta configurar a localização do seu banco de dados Redis:
Onde o URL está no formato de:
todos os campos após o esquema são opcionais e serão padrão para localhost na porta 6379, usando o banco de dados 0.
Se uma conexão de soquete Unix deve ser usada, o URL precisa estar no formato:
Especificar um número de banco de dados diferente ao usar um soquete Unix é possível adicionando o parâmetro virtual_host ao URL:
Também é fácil conectar-se diretamente a uma lista do Redis Sentinel:
Tempo limite de visibilidade¶¶
O tempo limite de visibilidade define o número de segundos para aguardar que o trabalhador confirme a tarefa antes que a mensagem seja redigitada para outro trabalhador. Certifique-se de ver as advertências abaixo.
Esta opção é definida através da configuração broker_transport_options:
O tempo limite de visibilidade padrão para Redis é de 1 hora.
Se você também deseja armazenar o estado e retornar valores de tarefas em Redis, você deve configurar essas configurações:
Para obter uma lista completa das opções suportadas pelo backend do resultado Redis, consulte Configurações do backend do Redis.
Note que a sentinela não é um suporte suportado.
Prefixo Fanout
As mensagens de difusão serão vistas por todos os hosts virtuais por padrão.
Você deve configurar uma opção de transporte para prefixar as mensagens para que elas só sejam recebidas pelo host virtual ativo:
Observe que você não pode se comunicar com os trabalhadores que executam versões antigas ou trabalhadores que não têm essa configuração habilitada.
Esta configuração será o padrão no futuro, então é melhor migrar mais cedo ou mais tarde.
Padrões Fanout
Os funcionários receberão todos os eventos relacionados à tarefa por padrão.
Para evitar isso, você deve definir a opção fanout_patterns fanout para que os trabalhadores só possam se inscrever em eventos relacionados ao trabalhador:
Observe que essa alteração é incompatível para trás, de modo que todos os trabalhadores no cluster devem ter essa opção habilitada, ou então eles não podem se comunicar.
Esta opção será ativada por padrão no futuro.
Tempo limite de visibilidade
Se uma tarefa não for reconhecida dentro do tempo limite de visibilidade, a tarefa será redelivered para outro trabalhador e executada.
Isso causa problemas com as tarefas de ETA / contagem regressiva / repetição, onde o tempo de execução excede o tempo limite de visibilidade; na verdade, se isso acontecer, ele será executado novamente, e novamente em um loop.
Então, você precisa aumentar o tempo limite de visibilidade para coincidir com o tempo da ETA mais longa que você planeja usar.
Observe que o Aipo redeliverá mensagens no desligamento do trabalhador, então, ter um longo período de tempo de visibilidade só atrasará a entrega da & # 8216; perdida & # 8217; tarefas em caso de falha de energia ou trabalhadores com extinção forçada.
Tarefas periódicas não serão afetadas pelo tempo limite de visibilidade, pois este é um conceito separado da ETA / contagem decrescente.
Você pode aumentar esse tempo limite configurando uma opção de transporte com o mesmo nome:
O valor deve ser um int que descreve o número de segundos.
Evacuação principal
Redis pode expulsar chaves do banco de dados em algumas situações.
Se você tiver um erro como:
então você pode querer configurar o redis-server para não expulsar as chaves configurando o parâmetro de tempo limite para 0 no arquivo de configuração redis.
Aipo multiplicando tarefas indesejadas # 2481.
Austriker comentou 3 de fevereiro de 2018.
Estou tendo um problema com o aipo. Ele continua duplicando as tarefas com o tempo. No final, posso terminar com mais de 20 cópias de tarefas antes da data de vencimento.
Eu sei que não é o aplicativo django aquela ordem (apply_sync) a tarefa porque eu adicionei um check-up ao banco de dados para verificar se a tarefa foi criada pelo aplicativo.
Extrair dos logs:
A própria tarefa:
Aqui estão as minhas configurações:
O trabalhador está configurado como:
Não entendo de onde esse problema vem?
fatihsucu comentou 16 de abril de 2018.
Seu corretor é redis e sua configuração visibility_timeout é 3600, o que significa 1 hora. Ele copiará sua tarefa 24 vezes de acordo com esse eta (24 horas). O trabalhador irá copiar sua tarefa uma da outra a cada hora. Quando o tempo eta for, ele multiplica suas tarefas.
Por sinal, se você definir seu tempo de visibilidade igual ao seu eta, isso não funciona bem. Eu tentei isso também. Redis causa isso e eu começo a usar rabbitmq em vez de redis. Minha sugestão é usar amqp como corretor e definir seu visibility_timeout maior do que seu eta.
Austriker comentou 16 de abril de 2018.
Sim, eu fiz o mesmo.
As tarefas agendadas estão sendo duplicadas # 215.
perguntei comentado 11 de dezembro de 2018.
Sim, você precisa aumentar o tempo limite de visibilidade:
Especialmente tome cuidado para garantir que todos os consumidores que você tenha estão usando a mesma configuração, pois qualquer consumidor de mensagem redis kombu irá participar na restauração das mensagens.
Então, se você tiver uma instância de flor, então começando com a flor de aipo - b redis: // em vez da versão configurada: aipo - Uma flor proj, significa que a flor irá restaurar as mensagens na taxa padrão.
Isso foi referenciado em 29 de julho de 2018.
Duplicar tarefas de aipo / django-aipo # 453.
Abra a pesquisa do site Hluttaw pelo município MP, pelo Comitê, retornando resultados duplicados Sinar / popit_ng # 236.
pztrick comentou 21 de junho de 2017.
Oi @ask: o que você acha, pelo menos, lançar uma exceção ao invocar apply_async (.) Ou tentar novamente (.) Se 1) a ET / countdown fornecida excede o tempo limite de visibilidade e 2) o corretor é Redis?
(Assim, pelo menos, os desenvolvedores como eu conseguiriam esse erro em tempo de execução ao desenvolver aplicativos. ☺)
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.
Redis backend e socket_timeout padrão # 1221.
msgre comentou Mar 4, 2018.
Eu uso Redis como Celend Backend em instâncias AWS EC2. Eu tenho várias máquinas lá - em primeiro lugar é o webapp, em segundos trabalhadores de apio, no terceiro corretor de Redis. Depois de algum tempo (1-2 dias), meus trabalhadores de repente pararam de processar tarefas. Eu investiguei esta situação e acho que esse problema está no código Celery, exatamente nesta linha: https: //github/celery/celery/blob/master/celery/backends/redis. py#L109.
Parece que às vezes o AWS deixa a conexão da rede e a conexão do soquete morre. Como não há nenhum argumento socket_timeout no construtor ConnectionPool, nenhuma exceção ocorre e meus funcionários esperam até eu reiniciá-los (meus funcionários funcionam como processos de supervisor).
Eu modifiquei o código de aipo na linha 109, então agora eu tenho o socket_timeout = 10 e não houve problema com trabalhadores pendurados por mais de 3 semanas.
Você poderia adicionar alguma variável de configurações para substituir o ConnectionPool socket_timeout por padrão, por favor?
pergunte adicionou uma confirmação ao aipo / kombu que referenciou esta questão 4 de março de 2018.
perguntei comentado Mar 4, 2018.
Com isso você pode definir:
Talvez também haja um padrão razoável aqui.
msgre comentou Mar 4, 2018.
pergunte adicionou um compromisso com o aipo / kombu que referenciou esta questão 12 de março de 2018.
msgre comentou Mar 14, 2018.
Olá pergunte, eu tenho uma pequena pergunta sobre este problema - se eu uso o Celery no Django com a ajuda do aplicativo djcelery, eu deveria simplesmente colocar BROKER_TRANSPORT_OPTIONS no arquivo settings. py? Desculpe-me pela pergunta estúpida, mas não encontrei nenhuma referência nos documentos do Celery sobre BROKER_TRANSPORT_OPTIONS, e não sei exatamente como celery, kombu e djcelery trabalham juntos. Obrigado!
A tarefa trava ao postar o resultado usando o backend redis # 2741.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.
Комментариев нет:
Отправить комментарий