{"id":1984,"date":"2025-06-18T09:30:00","date_gmt":"2025-06-18T09:30:00","guid":{"rendered":"https:\/\/mugnos-it.com\/?p=1984"},"modified":"2025-06-03T00:53:53","modified_gmt":"2025-06-03T00:53:53","slug":"concorrencia-nao-e-paralelismo-e-confundir-os-dois-sai-caro-%f0%9f%9a%a8%f0%9f%92%b8","status":"publish","type":"post","link":"https:\/\/mugnos-it.com\/pt\/concorrencia-nao-e-paralelismo-e-confundir-os-dois-sai-caro-%f0%9f%9a%a8%f0%9f%92%b8\/","title":{"rendered":"Concorr\u00eancia N\u00c3O \u00e9 Paralelismo! E confundir os dois sai caro.\ud83d\udea8\ud83d\udcb8"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"1984\" class=\"elementor elementor-1984\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-197753bb e-flex e-con-boxed e-con e-parent\" data-id=\"197753bb\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5c659212 elementor-widget elementor-widget-text-editor\" data-id=\"5c659212\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p><\/p>\n\n\n\n<p>Alguns dias atr\u00e1s fui puxado pra uma conversa curiosa: o time estava animado implementando <strong>autoscaling em pods consumidores de fila<\/strong>, querendo aumentar a vaz\u00e3o.<\/p>\n\n\n\n<p>Tudo certo at\u00e9 aqui, n\u00e9?<\/p>\n\n\n\n<p>Mas a\u00ed veio a pergunta:<\/p>\n\n\n\n<p>\u201cPor que estamos subindo mais pods, se nem dentro de <strong>um \u00fanico pod<\/strong> estamos aproveitando bem os recursos?\u201d<\/p>\n\n\n\n<p>Sil\u00eancio.<\/p>\n\n\n\n<p>E \u00e9 a\u00ed que mora o problema. N\u00e3o \u00e9 porque a infraestrutura \u00e9 escal\u00e1vel que voc\u00ea precisa sair fazendo \u201cLet it Go\u201d com os pods \u2014 e deixar a conta (de CPU, mem\u00f3ria e caos) pra outro resolver.<\/p>\n\n\n\n<p>Hoje, bora falar de um erro comum: <strong>confundir concorr\u00eancia com paralelismo<\/strong>.<\/p>\n\n\n\n<p>Spoiler: n\u00e3o s\u00e3o a mesma coisa. E a diferen\u00e7a entre eles pode decidir se seu sistema <strong>escala bem<\/strong> ou <strong>s\u00f3 queima recurso<\/strong>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Concorr\u00eancia \u2260 Paralelismo<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Concorr\u00eancia<\/h3>\n\n\n\n<p>Concorr\u00eancia \u00e9 sobre <strong>lidar com v\u00e1rias tarefas ao mesmo tempo<\/strong>, <strong>mas n\u00e3o necessariamente execut\u00e1-las simultaneamente<\/strong>.<\/p>\n\n\n\n<p>\u00c9 como se um \u00fanico core estivesse resolvendo v\u00e1rias coisas ao mesmo tempo, pulando de uma pra outra quando encontra espera (tipo chamadas de I\/O, acesso a banco, APIs externas etc).<\/p>\n\n\n\n<p>Voc\u00ea ganha desempenho <strong>n\u00e3o por fazer tudo ao mesmo tempo<\/strong>, mas por <strong>n\u00e3o ficar parado esperando<\/strong>.<\/p>\n\n\n\n<p><strong>Exemplo pr\u00e1tico:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Um worker que consome uma fila, faz uma requisi\u00e7\u00e3o a uma API e\u2026 espera. \u2192 Nesse tempo, ele poderia estar processando outra tarefa. \u2192 Solu\u00e7\u00e3o: aplicar concorr\u00eancia, como goroutines (Go), threads leves (Java), async\/await (Node, Python).<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Paralelismo<\/h3>\n\n\n\n<p>J\u00e1 o paralelismo \u00e9 quando voc\u00ea tem <strong>v\u00e1rios n\u00facleos (cores)<\/strong> processando <strong>coisas diferentes ao mesmo tempo<\/strong>, de verdade.<\/p>\n\n\n\n<p>Ideal pra tarefas pesadas, como <strong>transforma\u00e7\u00e3o de dados<\/strong>, <strong>processamento em lote<\/strong>, <strong>machine learning<\/strong>, etc.<\/p>\n\n\n\n<p><strong>Exemplo pr\u00e1tico:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Processar 1 milh\u00e3o de registros com Spark, distribuindo o trabalho em v\u00e1rios n\u00f3s ao mesmo tempo.<\/li>\n<\/ul>\n\n\n\n<p>Mas cuidado: <strong>paralelismo cego com I\/O intenso pode ser ineficiente<\/strong>.<\/p>\n\n\n\n<p>Voc\u00ea cria um monte de worker\u2026 que ficam parados esperando resposta da rede.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quando usar cada um?<\/h2>\n\n\n\n<p><strong>Use concorr\u00eancia quando\u2026<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Seu c\u00f3digo depende de chamadas externas (APIs, banco de dados, sistemas legados)<\/li>\n\n\n\n<li>Voc\u00ea quer melhor aproveitamento de um \u00fanico recurso (ex: um pod)<\/li>\n<\/ul>\n\n\n\n<p><strong>Use paralelismo quando\u2026<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Voc\u00ea est\u00e1 lidando com tarefas <strong>CPU-bound<\/strong><\/li>\n\n\n\n<li>Precisa escalar processamento real, e n\u00e3o s\u00f3 orquestra\u00e7\u00e3o<\/li>\n<\/ul>\n\n\n\n<p>Apesar de eu explicar os dois separadamente, a utiliza\u00e7\u00e3o de um n\u00e3o inviabiliza o outro! na verdade voc\u00ea precisa usar os dois, mas a forma de implementa\u00e7\u00e3o de cada um \u00e9 diferente.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">E os riscos?<\/h2>\n\n\n\n<p><strong>Concorr\u00eancia sem controle<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ficar subindo muita concorr\u00eancia, faz com que ela fique trocando o contexto entre elas(Context switching), e a troca de contexto de forma exagerada pode gerar overhead<\/li>\n\n\n\n<li>Pode explodir em <em>race conditions<\/em>, <em>deadlocks<\/em> e travar tudo (por isso voc\u00ea precisa ser cuidadoso e tratar isso atrav\u00e9s de mutex e lockers)<\/li>\n<\/ul>\n\n\n\n<p><strong>Paralelismo mal dimensionado<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Criar pods demais, sem avaliar o uso real<\/li>\n\n\n\n<li>Aumentar o n\u00famero de threads sem controle (e o hardware \u00e9 finito, lembra?)<\/li>\n\n\n\n<li>Escalar sem aplicar <em>rate limit<\/em> \u2192 desastre anunciado<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>A diferen\u00e7a entre concorr\u00eancia e paralelismo pode parecer sutil, mas ignor\u00e1-la pode custar caro \u2014 em performance, em dinheiro e em complexidade desnecess\u00e1ria.<\/p>\n\n\n\n<p>A verdade \u00e9 que tem muita arquitetura sendo decidida no impulso. Solu\u00e7\u00f5es s\u00e3o vendidas como indispens\u00e1veis, o hype toma conta\u2026 e de repente estamos pagando caro por infraestrutura que nem traz ganho real pro neg\u00f3cio.<\/p>\n\n\n\n<p>Na <strong>Comunidade Arquitetura Descomplicada<\/strong>, a gente debate justamente isso:<\/p>\n\n\n\n<p><strong>como fazer escolhas t\u00e9cnicas com inten\u00e7\u00e3o, clareza e prop\u00f3sito.<\/strong><\/p>\n\n\n\n<p>Se voc\u00ea quer sair do modo autom\u00e1tico e come\u00e7ar a construir <strong>sistemas modernos, resilientes e eficientes de verdade<\/strong>, vem conhecer a CAD.<\/p>\n\n\n\n<p>\ud83d\udc49 Na CAD \u00e9 onde a arquitetura deixa de ser buzzword.<\/p>\n\n\n\n<p><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7c7c271 e-flex e-con-boxed e-con e-parent\" data-id=\"7c7c271\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Alguns dias atr\u00e1s fui puxado pra uma conversa curiosa: o time estava animado implementando autoscaling em pods consumidores de fila, querendo aumentar a vaz\u00e3o. Tudo certo at\u00e9 aqui, n\u00e9? Mas a\u00ed veio a pergunta: \u201cPor que estamos subindo mais pods, se nem dentro de um \u00fanico pod estamos aproveitando bem os recursos?\u201d Sil\u00eancio. E \u00e9 [&hellip;]<\/p>","protected":false},"author":3,"featured_media":1985,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1984","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/05\/19-newsletter.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/1984","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/comments?post=1984"}],"version-history":[{"count":4,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/1984\/revisions"}],"predecessor-version":[{"id":2070,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/1984\/revisions\/2070"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/media\/1985"}],"wp:attachment":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/media?parent=1984"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/categories?post=1984"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/tags?post=1984"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}