{"id":6826,"date":"2020-06-30T16:54:04","date_gmt":"2020-06-30T16:54:04","guid":{"rendered":"https:\/\/cheesecakelabs.com\/blog\/blog\/asynchronous-task-queue-django-celery-aws-sqs\/"},"modified":"2022-07-01T18:23:32","modified_gmt":"2022-07-01T18:23:32","slug":"fila-tarefas-assincronas-django-celery-aws-sqs","status":"publish","type":"post","link":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/","title":{"rendered":"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS"},"content":{"rendered":"<p>Ao lidar com funcionalidades com maior tempo de execu\u00e7\u00e3o e que podem ter um grande impacto no desempenho de uma aplica\u00e7\u00e3o web, voc\u00ea pode enfrentar a necessidade de execut\u00e1-las de forma ass\u00edncrona (agendadas ou n\u00e3o).<br \/>\n<!--more--><br \/>\nEssas tarefas ass\u00edncronas executadas em segundo plano podem n\u00e3o apenas melhorar drasticamente a escalabilidade da aplica\u00e7\u00e3o por mover as opera\u00e7\u00f5es de alto consumo para o segundo plano, mas tamb\u00e9m melhorar a usabilidade da funcionalidade em si. Depois de espalhado em diferentes componentes, cada um com sua pr\u00f3pria responsabilidade, seu c\u00f3digo ir\u00e1 parecer mais limpo e isolado, consequentemente melhorando a sua manuten\u00e7\u00e3o.<\/p>\n<p>Este artigo apresenta alguns t\u00f3picos relacionados a uma arquitetura pr\u00e9-constru\u00edda usando Django, Celery, Docker e AWS SQS. A base de c\u00f3digo est\u00e1 <a href=\"https:\/\/github.com\/rodolfolottin\/django-sqs-celery-template\">dispon\u00edvel no Github<\/a> e voc\u00ea pode facilmente seguir as etapas do README para ter a aplica\u00e7\u00e3o funcionando sem esfor\u00e7o.<\/p>\n<p>A se\u00e7\u00e3o a seguir traz uma breve vis\u00e3o geral dos componentes usados para construir a arquitetura.<\/p>\n<p><span style=\"font-weight: 400;\">&nbsp;<\/span><\/p>\n<h2>Descri\u00e7\u00e3o dos componentes<\/h2>\n<h3>Agente de mensagens<\/h3>\n<p><a href=\"https:\/\/www.cloudamqp.com\/blog\/2020-04-03-why-use-rabbitmq-in-a-microservice-architecture.html\"><img decoding=\"async\" class=\" wp-image-6758 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/message-queue-and-rabbitmq-1.png\" alt=\"\" width=\"668\" height=\"293\" srcset=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/message-queue-and-rabbitmq-1.png 1844w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/message-queue-and-rabbitmq-1-768x337.png 768w\" sizes=\"(max-width: 668px) 100vw, 668px\" \/><\/a><\/p>\n<p style=\"text-align: center;\">Message broker usage<\/p>\n<p><strong>O que \u00e9 um agente de mensagens?<\/strong> Nossa sempre amig\u00e1vel Wikipedia diz que: ele intermedia a comunica\u00e7\u00e3o entre os aplicativos, minimizando a consci\u00eancia m\u00fatua que os aplicativos devem ter uns dos outros para poder trocar mensagens, implementando efetivamente o desacoplamento. (2020)<\/p>\n<p>Ou seja, \u00e9 uma camada intermedi\u00e1ria na qual as aplica\u00e7\u00f5es podem se comunicar &#8211; ler e\/ou escrever mensagens &#8211; e, com isso, possibilita a constru\u00e7\u00e3o de duas aplica\u00e7\u00f5es desacopladas que n\u00e3o dependem uma da outra.<\/p>\n<p>&nbsp;<\/p>\n<h3>Amazon SQS<\/h3>\n<p><img decoding=\"async\" class=\"size-full wp-image-7421 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/aws-sqs-ckl.png\" alt=\"\" width=\"768\" height=\"339\"><\/p>\n<p style=\"text-align: center;\">Amazon SQS queue messaging flow<\/p>\n<p><strong>O que \u00e9 AWS SQS?<\/strong> \u201cO Amazon Simple Queue Service (SQS) \u00e9 um servi\u00e7o de enfileiramento de mensagens totalmente gerenciado que permite desacoplar e dimensionar microsservi\u00e7os, sistemas distribu\u00eddos e aplicativos sem servidor. [\u2026] Usando o SQS, voc\u00ea pode enviar, armazenar e receber mensagens entre componentes de software em qualquer volume, sem perder mensagens ou exigir que outros servi\u00e7os estejam dispon\u00edveis. \u201d (Amazon, 2020)<\/p>\n<p>Existem algumas alternativas para SQS, como Kafka, Redis ou RabbitMQ e todas elas podem ser facilmente configuradas na Amazon usando ElasticCache ou AmazonMQ. Al\u00e9m disso, voc\u00ea tem a op\u00e7\u00e3o de implementar seu pr\u00f3prio agente de mensagens em inst\u00e2ncias do EC2, o que pode ser mais barato dependendo do n\u00famero de mensagens. Por\u00e9m voc\u00ea tamb\u00e9m deve considerar o tempo e o esfor\u00e7o necess\u00e1rios para configur\u00e1-lo no e o esfor\u00e7o extra caso decida us\u00e1-lo com o Auto Scaling habilitado.<\/p>\n<p>O que vejo como o principal benef\u00edcio de usar SQS \u00e9 que ele \u00e9 totalmente gerenciado pela AWS e voc\u00ea paga sob demanda. Se os requisitos de sua aplica\u00e7\u00e3o ou funcionalidade est\u00e3o de acordo com o uso de SQS, \u00e9 muito simples de configur\u00e1-lo e us\u00e1-lo.<\/p>\n<p>&nbsp;<\/p>\n<h3>Celery<\/h3>\n<p><a href=\"https:\/\/docs.celeryproject.org\/en\/stable\/getting-started\/introduction.html\"><img decoding=\"async\" class=\" wp-image-6760 aligncenter\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/celery_512.png\" alt=\"\" width=\"185\" height=\"185\" srcset=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/celery_512.png 512w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/celery_512-300x300.png 300w\" sizes=\"(max-width: 185px) 100vw, 185px\" \/><\/a><\/p>\n<p style=\"text-align: center;\">Celery library logo<\/p>\n<p><strong>O que \u00e9 o Celery?<\/strong> \u201cCelery \u00e9 um gerenciador de fila de tarefas\/trabalhos ass\u00edncronas baseado na passagem de mensagens distribu\u00eddas. Ele est\u00e1 focado na opera\u00e7\u00e3o em tempo real, mas tamb\u00e9m oferece suporte para agendamentos. [\u2026] As tarefas podem ser executadas de forma ass\u00edncrona (em segundo plano) ou de forma s\u00edncrona (esperar at\u00e9 que estejam prontas). \u201d (Celery, 2020)<\/p>\n<p>Essencialmente, o Celery \u00e9 usado para coordenar e executar tarefas distribu\u00eddas do Python. Ele permite a possibilidade de mover uma execu\u00e7\u00e3o de c\u00f3digo espec\u00edfico para fora do ciclo de requisi\u00e7\u00e3o-resposta HTTP. Dessa forma, seu servidor pode responder o mais r\u00e1pido poss\u00edvel a uma requisi\u00e7\u00e3o espec\u00edfica, pois gera uma tarefa ass\u00edncrona para um outro processo para executar a parte espec\u00edfica de c\u00f3digo, o que passa a melhorar o tempo de resposta do servidor. Al\u00e9m disso, com o Celery voc\u00ea tem a op\u00e7\u00e3o de executar tarefas em segundo plano previamente agendadas.<\/p>\n<h2><b>Juntando tudo isso<\/b><\/h2>\n<p>Para colocar todos na mesma p\u00e1gina: AWS SQS \u00e9 o agente de mensagens escolhido aqui e Celery \u00e9 o componente respons\u00e1vel por orquestrar &#8211; consumir, ler e gravar &#8211; a fila de mensagens. Como o Celery \u00e9 uma biblioteca, ele precisa ser configurado em cima do Django.<\/p>\n<p><i>Observa\u00e7\u00e3o: o c\u00f3digo-fonte usado nesta postagem do blog <a href=\"https:\/\/github.com\/rodolfolottin\/django-sqs-celery-template\">est\u00e1 dispon\u00edvel no GitHub<\/a>. Ele assume as seguintes pastas\/estrutura de aplicativo:<\/i><\/p>\n<pre class=\"language-swift\"><code class=\"language-swift\"> \n.\n\u2514\u2500\u2500 src\n    \u251c\u2500\u2500 app\n    \u2502   \u251c\u2500\u2500 __init__.py\n    \u2502   \u251c\u2500\u2500 settings.py\n    \u2502   \u251c\u2500\u2500 urls.py\n    \u2502   \u2514\u2500\u2500 wsgi.py\n    \u251c\u2500\u2500 manage.py\n    [\u2026]\n<\/code><\/pre>\n<p>O Docker n\u00e3o \u00e9 necess\u00e1rio para o sistema funcionar, mas torna muito mais f\u00e1cil reproduzir a arquitetura final do sistema localmente e tamb\u00e9m serve como um guia ao configurar a arquitetura do sistema em um ambiente de servi\u00e7o de computa\u00e7\u00e3o em nuvem.<\/p>\n<p>No arquivo docker-compose abaixo, existem 5 servi\u00e7os configurados:<\/p>\n<pre class=\"language-swift\"><code class=\"language-swift\"> \nversion: \"3\"\nservices:\n  web:\n    build: .\n    volumes:\n      - .:\/usr\/src\/app\n    ports:\n      - 8000:8000\n    environment:\n      ENV: development\n    depends_on:\n      - db\n      - sqs\n\n  worker:\n    build: .\n    volumes:\n      - .:\/usr\/src\/app\n    command: bash -c \"cd src\/ &amp;&amp; celery -A app worker --loglevel=debug\"\n    depends_on:\n      - web\n      - sqs\n\n  beat:\n    build: .\n    volumes:\n      - .:\/usr\/src\/app\n    command: bash -c \"cd src\/ &amp;&amp; celery -A app beat --loglevel=debug\" \n    depends_on:\n      - web \n      - sqs \n\n  db:\n    image: postgres:12\n    ports:\n      - 5432:5432\n    volumes:\n      - .\/docker\/db\/pgdata:\/var\/lib\/postgresql\/data\n    environment:\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: postgres\n      POSTGRES_DB: app\n\n  sqs:\n    image: roribio16\/alpine-sqs\n    ports:\n      - 9324:9324\n      - 9325:9325\n    volumes:\n      - .\/config\/elasticmq.conf:\/opt\/config\/elasticmq.conf\n<\/code><\/pre>\n<p>Aqui est\u00e1 o resumo do arquivo docker-compose:<\/p>\n<ul>\n<li><em><strong>web:<\/strong> <\/em>\u00e9 o cont\u00eainer de servi\u00e7o da web.<\/li>\n<li><em><strong>worker:<\/strong><\/em> \u00e9 um Celery worker que gera um processo supervisor\/pai que n\u00e3o processa nenhuma tarefa. Em vez disso, ele gera processos filhos para executar as tarefas reais dispon\u00edveis.<\/li>\n<li><em><strong>beat:<\/strong><\/em> \u00e9 um agendador de Celery que gera periodicamente tarefas que s\u00e3o executadas pelos workers dispon\u00edveis.<\/li>\n<li><em><strong>db:<\/strong><\/em> cont\u00eainer de banco de dados postgres.<\/li>\n<li><em><strong>sqs:<\/strong><\/em> \u00e9 uma implementa\u00e7\u00e3o Java em cont\u00eainer do Amazon Queue Service que usaremos para imitar o comportamento do AWS SQS. A porta 9324 est\u00e1 dispon\u00edvel para usar o servi\u00e7o de fila e a 9325 est\u00e1 dispon\u00edvel para acessar a interface da web.<\/li>\n<\/ul>\n<p>Basicamente, o servi\u00e7o de cont\u00eainer <em>worker<\/em> \u00e9 respons\u00e1vel por pesquisar e executar as mensagens dispon\u00edveis nas filas e o servi\u00e7o de cont\u00eainer beat \u00e9 respons\u00e1vel por gerar tarefas peri\u00f3dicas a serem executadas pelos workers. Ao trabalhar com tarefas peri\u00f3dicas, existem algumas configura\u00e7\u00f5es poss\u00edveis. Voc\u00ea pode<a href=\"https:\/\/docs.celeryproject.org\/en\/stable\/userguide\/periodic-tasks.html#crontab-schedules\"> verificar alguns exemplos nesta p\u00e1gina<\/a>.<\/p>\n<p>A se\u00e7\u00e3o de c\u00f3digo a seguir \u00e9 o arquivo config\/elasticmq.conf e \u00e9 usado apenas para a execu\u00e7\u00e3o local. Ele configura o endere\u00e7o node para o cont\u00eainer sqs. Como o Celery por padr\u00e3o cria e usa uma fila chamada \u201ccelery\u201d, n\u00e3o precisamos criar uma nova fila, a menos que seja necess\u00e1rio.<\/p>\n<pre class=\"language-swift\"><code class=\"language-swift\">\ninclude classpath(\"application.conf\")\n\nnode-address {\n   protocol = http\n   host = \"*\"\n   port = 9324\n   context-path = \"\"\n}\n\nrest-sqs {\n   enabled = true\n   bind-port = 9324\n   bind-hostname = \"0.0.0.0\"\n   \/\/ Possible values: relaxed, strict\n   sqs-limits = strict\n}\n<\/code><\/pre>\n<p>Este \u00e9 um exemplo do que deve ser o seu arquivo app\/celery.py. Voc\u00ea pode encontrar facilmente o significado de cada chave de configura\u00e7\u00e3o no site do Celery. O principal \u00e9 o BROKER_URL, que \u00e9 o endere\u00e7o do agente ao qual o Celery se conectar\u00e1. O valor da vari\u00e1vel BROKER_URL \u00e9 codificado apenas para fins de ilustra\u00e7\u00e3o. Os valores de usu\u00e1rio e senha s\u00e3o valores fict\u00edcios, pois n\u00e3o s\u00e3o configurados no servi\u00e7o sqs do cont\u00eainer docker.<\/p>\n<pre class=\"language-swift\"><code class=\"language-swift\">\nimport os\n\nfrom celery import Celery\nfrom celery.schedules import crontab\nfrom django.conf import settings\n\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"app.settings\")\n\napp = Celery(\"app\")\n\nCELERY_CONFIG = {\n    \"CELERY_TASK_SERIALIZER\": \"json\",\n    \"CELERY_ACCEPT_CONTENT\": [\"json\"],\n    \"CELERY_RESULT_SERIALIZER\": \"json\",\n    \"CELERY_RESULT_BACKEND\": None,\n    \"CELERY_TIMEZONE\": \"America\/Sao_Paulo\",\n    \"CELERY_ENABLE_UTC\": True,\n    \"CELERY_ENABLE_REMOTE_CONTROL\": False,\n}\n\nBROKER_URL = \"sqs:\/\/user:password@sqs:9324\/\",\n\nCELERY_CONFIG.update(\n    **{\n        \"BROKER_URL\": BROKER_URL,\n        \"BROKER_TRANSPORT\": \"sqs\",\n        \"BROKER_TRANSPORT_OPTIONS\": {\n            \"region\": \"us-west-2\",\n            \"visibility_timeout\": 3600,\n            \"polling_interval\": 60,\n        },\n    }\n)\n\napp.conf.update(**CELERY_CONFIG)\napp.autodiscover_tasks(packages={\"payment.tasks\"}))\n<\/code><\/pre>\n<p>O c\u00f3digo a seguir \u00e9 uma fun\u00e7\u00e3o de tarefa fict\u00edcia. A aplica\u00e7\u00e3o j\u00e1 sabe que se trata de um trabalho ass\u00edncrono apenas usando o decorador @task importado do Celery. Basicamente, o decorador envolve a fun\u00e7\u00e3o e retorna uma inst\u00e2ncia da classe de tarefa com alguns m\u00e9todos implementados.<\/p>\n<pre class=\"language-swift\"><code class=\"language-swift\">\nfrom celery import task\n\nfrom payment.models import Payment\n\n@task\ndef capture_payment(pk):\n    payment = Payment.objects.get(pk=pk)\n    print(f\"Capture payment: {payment}\")\n<\/code><\/pre>\n<p>A se\u00e7\u00e3o a seguir \u00e9 um exemplo de seu uso.<\/p>\n<pre class=\"language-swift\"><code class=\"language-swift\">\nfrom payment.models import Payment\n\npayment = Payment.objects.first()\ncapture_payment.delay(pk=payment.pk)\n<\/code><\/pre>\n<p>Ao cham\u00e1-lo com o m\u00e9todo de delay, uma inst\u00e2ncia de AsyncResult ser\u00e1 gerada e o worker executar\u00e1 a tarefa de mensagem assim que estiver dispon\u00edvel na fila.<\/p>\n<h2>Resumo<\/h2>\n<p>Neste artigo, eu apresentei a voc\u00ea os principais conceitos por tr\u00e1s da arquitetura proposta e tamb\u00e9m esclare\u00e7o o que considero importante saber sobre isso. Com a <a href=\"https:\/\/github.com\/rodolfolottin\/django-sqs-celery-template\">base de c\u00f3digo dispon\u00edvel no GitHub<\/a>, voc\u00ea pode facilmente ter um aplicativo Docker em cont\u00eainer que implementa um sistema de enfileiramento de tarefas usando Celery em cima do Django para fins de desenvolvimento local. Portanto, para implant\u00e1-lo, voc\u00ea precisa criar os respectivos servi\u00e7os na AWS.<\/p>\n<h2>Limita\u00e7\u00f5es conhecidas<\/h2>\n<p>Recentemente, encontramos uma limita\u00e7\u00e3o ao usar o AWS SQS: o tempo limite de visibilidade, que \u00e9 um per\u00edodo de tempo em que o Amazon SQS impede que outros consumidores recebam e processem as mensagens. Em um de nossos projetos, uma tarefa teria a possibilidade de ser agendada para execu\u00e7\u00e3o em apenas 2 semanas a partir de agora, mas como o tempo m\u00e1ximo de visibilidade de uma mensagem \u00e9 de 12 horas, n\u00e3o \u00e9 poss\u00edvel realiz\u00e1-la usando SQS.<\/p>\n<h2><\/h2>\n<h2><b>Refer\u00eancias<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Wikipedia.com, Message Broker. Available in: &lt;<\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Message_broker\"><span style=\"font-weight: 400;\">https:\/\/en.wikipedia.org\/wiki\/Message_broker<\/span><\/a><span style=\"font-weight: 400;\">&gt;. Access in: June 24th, 2020.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Docs.aws.amazon.com, What is Amazon Simple Queue Service?. Available in: &lt;<\/span><a href=\"https:\/\/docs.aws.amazon.com\/AWSSimpleQueueService\/latest\/SQSDeveloperGuide\/welcome.html\"><span style=\"font-weight: 400;\">https:\/\/docs.aws.amazon.com\/AWSSimpleQueueService\/latest\/SQSDeveloperGuide\/welcome.html<\/span><\/a><span style=\"font-weight: 400;\">&gt;. Access in: June 24th, 2020.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Celeryproject, <\/span><span style=\"font-weight: 400;\">Celery &#8211; Distributed Task Queue. Available in: &lt;<\/span><a href=\"https:\/\/docs.celeryproject.org\/en\/stable\/\"><span style=\"font-weight: 400;\">https:\/\/docs.celeryproject.org\/en\/stable\/<\/span><\/a><span style=\"font-weight: 400;\">&gt;. Access in: June 24th, 2020.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ao lidar com funcionalidades com maior tempo de execu\u00e7\u00e3o e que podem ter um grande impacto no desempenho de uma aplica\u00e7\u00e3o web, voc\u00ea pode enfrentar a necessidade de execut\u00e1-las de forma ass\u00edncrona (agendadas ou n\u00e3o).<\/p>\n","protected":false},"author":65,"featured_media":6751,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[471],"tags":[1155],"class_list":["post-6826","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engenharia","tag-tag-django-br"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS<\/title>\n<meta name=\"description\" content=\"Essas tarefas ass\u00edncronas executadas em segundo plano podem melhorar a escalabilidade da aplica\u00e7\u00e3o e a usabilidade da funcionalidade.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS\" \/>\n<meta property=\"og:description\" content=\"Essas tarefas ass\u00edncronas executadas em segundo plano podem melhorar a escalabilidade da aplica\u00e7\u00e3o e a usabilidade da funcionalidade.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/\" \/>\n<meta property=\"og:site_name\" content=\"Cheesecake Labs\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cheesecakelabs\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-30T16:54:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-07-01T18:23:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Cheesecake Labs\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:site\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/\"},\"author\":{\"name\":\"Rodolfo Lottin\"},\"headline\":\"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS\",\"datePublished\":\"2020-06-30T16:54:04+00:00\",\"dateModified\":\"2022-07-01T18:23:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/\"},\"wordCount\":1427,\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png\",\"keywords\":[\"Django\"],\"articleSection\":[\"Engenharia\"],\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/\",\"name\":\"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png\",\"datePublished\":\"2020-06-30T16:54:04+00:00\",\"dateModified\":\"2022-07-01T18:23:32+00:00\",\"author\":{\"@type\":\"person\",\"name\":\"Rodolfo Lottin\"},\"description\":\"Essas tarefas ass\u00edncronas executadas em segundo plano podem melhorar a escalabilidade da aplica\u00e7\u00e3o e a usabilidade da funcionalidade.\",\"breadcrumb\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#primaryimage\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png\",\"width\":1800,\"height\":720,\"caption\":\"asynchronous task queue\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cheesecakelabs.com\/blog\/br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#website\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/br\/\",\"name\":\"Cheesecake Labs\",\"description\":\"Empresa de desenvolvimento e design de aplicativos mobile &amp; web que est\u00e1 reinventando o desenvolvimento de produtos com times remotos. N\u00f3s desenvolvemos aplicativos iOS, Android e aplica\u00e7\u00f5es Web com as melhores empresas dos EUA, do Brasil e do mundo.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cheesecakelabs.com\/blog\/br\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"name\":\"Rodolfo Lottin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/image\/\",\"url\":false,\"contentUrl\":false,\"caption\":\"Rodolfo Lottin\"},\"description\":\"10 years of experience in Marketing and Sales in the Technology sector. My main purpose is help, support and structure efficient operations and also develop independent and multidisciplinary teams.\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/br\/\/autor\/rodolfo-3\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS","description":"Essas tarefas ass\u00edncronas executadas em segundo plano podem melhorar a escalabilidade da aplica\u00e7\u00e3o e a usabilidade da funcionalidade.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/","og_locale":"pt_BR","og_type":"article","og_title":"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS","og_description":"Essas tarefas ass\u00edncronas executadas em segundo plano podem melhorar a escalabilidade da aplica\u00e7\u00e3o e a usabilidade da funcionalidade.","og_url":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/","og_site_name":"Cheesecake Labs","article_publisher":"https:\/\/www.facebook.com\/cheesecakelabs","article_published_time":"2020-06-30T16:54:04+00:00","article_modified_time":"2022-07-01T18:23:32+00:00","og_image":[{"width":1800,"height":720,"url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png","type":"image\/png"}],"author":"Cheesecake Labs","twitter_card":"summary_large_image","twitter_creator":"@cheesecakelabs","twitter_site":"@cheesecakelabs","twitter_misc":{"Escrito por":null,"Est. tempo de leitura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#article","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/"},"author":{"name":"Rodolfo Lottin"},"headline":"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS","datePublished":"2020-06-30T16:54:04+00:00","dateModified":"2022-07-01T18:23:32+00:00","mainEntityOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/"},"wordCount":1427,"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png","keywords":["Django"],"articleSection":["Engenharia"],"inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/","url":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/","name":"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#primaryimage"},"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png","datePublished":"2020-06-30T16:54:04+00:00","dateModified":"2022-07-01T18:23:32+00:00","author":{"@type":"person","name":"Rodolfo Lottin"},"description":"Essas tarefas ass\u00edncronas executadas em segundo plano podem melhorar a escalabilidade da aplica\u00e7\u00e3o e a usabilidade da funcionalidade.","breadcrumb":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#primaryimage","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2020\/06\/Job_Queueing_System_Django_Docker_Celery_AWS_SQS.png","width":1800,"height":720,"caption":"asynchronous task queue"},{"@type":"BreadcrumbList","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/fila-tarefas-assincronas-django-celery-aws-sqs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cheesecakelabs.com\/blog\/br\/"},{"@type":"ListItem","position":2,"name":"Fila para tarefas ass\u00edncronas com Django, Celery e AWS SQS"}]},{"@type":"WebSite","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#website","url":"https:\/\/cheesecakelabs.com\/blog\/br\/","name":"Cheesecake Labs","description":"Empresa de desenvolvimento e design de aplicativos mobile &amp; web que est\u00e1 reinventando o desenvolvimento de produtos com times remotos. N\u00f3s desenvolvemos aplicativos iOS, Android e aplica\u00e7\u00f5es Web com as melhores empresas dos EUA, do Brasil e do mundo.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cheesecakelabs.com\/blog\/br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","name":"Rodolfo Lottin","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/image\/","url":false,"contentUrl":false,"caption":"Rodolfo Lottin"},"description":"10 years of experience in Marketing and Sales in the Technology sector. My main purpose is help, support and structure efficient operations and also develop independent and multidisciplinary teams.","url":"https:\/\/cheesecakelabs.com\/blog\/br\/\/autor\/rodolfo-3\/"}]}},"_links":{"self":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts\/6826","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/comments?post=6826"}],"version-history":[{"count":1,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts\/6826\/revisions"}],"predecessor-version":[{"id":10460,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts\/6826\/revisions\/10460"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/media\/6751"}],"wp:attachment":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/media?parent=6826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/categories?post=6826"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/tags?post=6826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}