Canal quente e Canal frio

João Victor
Android Dev BR
Published in
4 min readMar 18, 2021

Então chega um ponto que você não sabe mais a diferença de canais, com tantas opções disponíveis atualmente em linguagens modernas, eu não te julgaria!

Hoje, irei ajudar entender melhor a diferença desses dois conceitos de canais mas, primeiro vamos entender o conceito do Canal, que o nome por si só já nos explica bastante.

Este artigo baseia-se na linguagem Kotlin, então caso você não tenha nenhuma experiência com ela, eu recomendo passar por seus princípios básicos antes de vermos como usá-la com Canais.

Também passaremos por algumas features como Coroutines, Flow e Channel e se você ainda não teve contato com elas, recomendo dar uma olhada para ver um pouco mais de suas implementações.

O conceito de Canal é muito simples, tão quanto a imagem acima. Todo canal tem dois conceitos por trás, separados por responsabilidades, um Produtor e um ou vários Consumidores. O produtor tem um único papel, emitir novos valores, enquanto os consumidores os coletam em seguida. A ideia é, que o consumidor não saiba nada sobre o produtor e o produtor também não o conheça seus consumidores.

O Canal vai muito além desse simples conceito, tendo várias praticas diferentes para cada caso de uso, porém, vamos deixar isso para um próximo artigo.

Um exemplo do mundo real para ajudar a entender o Canal

Vamos usar uma analogia bastante comum no nosso dia a dia. A televisão e seus canais, como sabemos, existem vários canais de TV(Produtores) e para cada um existem várias pessoas consumindo(Consumidores) em sua própria TV o mesmo conteúdo.

Canal quente (Hot Channel) e Canal Frio (Cold Channel) ?

Vamos voltar ao mundo real como exemplo, podemos dizer que um canal frio é quando você tem apenas um assinante.

O canal frio seria como o Netflix, que podemos assistir Séries e Filmes independente, podemos pausar, voltar e finalizar esse processo a qualquer momento, e outros usuários também podem fazer o mesmo processo independente e único.

E o canal quente seria como uma canal de televisão, onde existe um produtor que irá gerar um único valor para todos consumidores assistirem ao mesmo tempo. E independente de alguém consumindo ele será transmitido de toda maneira!

Saindo da teoria vamos olhar um exemplo bem comum de um canal frio

Com Kotlin temos uma feature bem interessante chamada Flow e sua arquitetura foi desenvolvida com um padrão de um fluxo frio.

Nesse simples exemplo podemos ver que coletamos a mesma Stream duas vezes seguidas, e para cada uma terá os mesmos valores, independente se outra pessoa já coletou ou não. Com canal frio, o fluxo é congelado e ele só inicia quando tem um assinante real, caso contrario o fluxo ficara congelado, porque o fluxo é “interno” para cada coleta.

Vamos ver o resultado do código acima.

Como ele é frio, cada alteração que fizer antes de coletar refletirá somente para aquele fluxo.

Como vimos acima, podemos manipular o flow antes mesmo de coletar. E cada coletor terá seu único fluxo.

Repare no resultado

Agora que sabemos que um fluxo frio é iniciado assim que tem seu assinante, podemos imaginar como seria o fluxo quente.

O Kotlin nos oferece também outra feature chamada Channel onde podemos falar que ela desenvolvida para ser um Canal de fluxo quente.

Nesse cenário como o fluxo é quente, ele não precisa de assinante para poder iniciar, podemos assim ter vários consumidores em paralelo. Vimos também que podemos ter dois consumidores para um único produtor e cada um consume de uma única fonte de confiança, diferente do frio que cada um tem sua fonte.

Vamos ver o resultado também ?

Como podemos ver, cada consumidor teve seu valor recebido. Podemos ver também que o canal existe independente de consumidores, então não precisamos assinar para poder produzir valores. O fluxo existe por fora e não está ligado diretamente ao consumidor.

Como podemos ver no exemplo acima, nossos coletores recebem em fila cada emissão. Mas também podemos ter um canal que os coletores recebam o mesmo valor, podemos controlar o número de assinaturas, a quantidade de emissões e muito mais.

Acho que já podemos parar por aqui e dar continuidade no próximo episódio para não confundir vocês. No próximo vamos abordar algumas outras diferenças, prós e contras de cada tipo de Canal.

Spoiler, vamos falar um pouco sobre o Flow, Channel, SharedFlow, StateFlow e muito mais.

Então espero vocês lá !!

--

--