Tecnologia

Arquitetura Geral
A arquitetura da plataforma Discord distribui-se em vários blocos, sendo possível caracterizá-la como um sistema distribuído. Desta forma, é mais fácil a implementação de redundância, flexibilidade e escalabilidade do sistema em si. Desta forma, por exemplo, problemas como situações de avaria ou tráfego lento podem ser otimizados direcionando a conexão do utilizador para um servidor com melhores condições. Sistemas deste tipo também se caracterizam por uma grande abstração na sua implementação e, por essa razão, uma fácil reutilização dos seus serviços em diferentes situações.
O modelo utilizado é baseado numa arquitetura tradicional de server-client. Desta forma, canais podem funcionar com um elevado número de participantes simultâneos sem causar um grande custo na transmissão do áudio, por exemplo, do canal, algo que com arquiteturas peer-to-peer não seria possível com o indefinido crescimento do número de participantes. O Discord aproveita este modelo arquitetónico para implementar uma camada de segurança usada para proteger os utilizadores de ataques tanto como os seus IPs pessoais.

Fig. 2: Arquitetura Server-Client.

Na sua construção, para diferentes sistemas operativos, o Discord apresenta aplicações semelhantes, tirando partido das vantagens do uso de WebRTC e da reutilização de código em sistemas distribuídos. Porém, a plataforma revela algumas diferenças de performance de certas features entre as versões de browser ou aplicação. Estas diferenças, mesmo que alterando o nível de recolha de dados do sistema, não são substanciais para um mau funcionamento da plataforma em nenhum dos casos, visto que o mesmo, estando distribuído, funciona de forma independente da camada de aplicação.
Desta forma, O Discord consegue suportar comunidades com muitos participantes como as de Fortnite ou de Minecraft que albergam mais de 800 mil utilizadores cada. A plataforma também consegue lidar com números elevados de pessoas em chamada por voz simultaneamente, sendo que, em 2018, este número já terá atingido os 2.5 milhões.

Streaming de Dados
Oferecendo o Discord dois principais canais de comunicação, texto e voz, o último mostra-se mais interessante dentro do contexto da partilha de dados. Nestes canais, as comunicações podem ocorrer não só por via de áudio, onde os utilizadores falam entre si, mas também via vídeo, onde os utilizadores interagem em tempo real por vídeo ou partilham as telas dos seus dispositivos com os outros participantes da chamada. Desta forma, a infraestrutura tem de estar bem estruturada para suportar grandes quantidades de dados.
Para que os canais de voz funcionem da melhor forma possível, o Discord distribui os canais em servidores que são selecionados pelo Discord Guilds server. Esta entidade escolhe servidores para associar à sua guild, conjuntos de utilizadores e canais, selecionando os menos utilizados recentemente.
Desta forma, depois de selecionado, o utilizador pode comunicar com o servidor associado por  mensagens UDP e assim comunicar com os restantes participantes da chamada. Em situação de falha do servidor, o mesmo receberá ordem para reiniciar ou, se o mesmo se tornar completamente indisponível, é selecionado outro servidor dentro da mesma guild. Caso haja uma mudança da região onde o canal está a ser hospedado pelo utilizador, o mesmo procedimento acontece, sendo escolhido um servidor nessa mesma região.Desta forma, o sistema pode ser facilmente distribuído tornando se escalável, o que é favorável a um rápido crescimento como o do Discord. Assim, distribuído por 13 regiões, o Discord suporta mais de 850 servidores dedicados para canais de voz que conseguem hospedar mais de 2.5 milhões de utilizadores em simultâneo com uma boa ligação entre eles.

Armazenamento de Dados
Inicialmente, o Discord começou por armazenar os dados dos seus utilizadores e as suas mensagens numa base de dados baseada em MongoDB. Posteriormente, visto que o serviço de armazenamento de dados usado começou a dar problemas de latência, a plataforma migrou para uma infraestrutura em Cassandra que oferecia um bom serviço em termos de escalabilidade, manutenção, entre outros. Cassandra também oferecia um melhor modelo de gestão de dados, aproveitando as propriedades de uma base de dados não relacional em favor do sistema. Desta forma, o Discord suporta e armazena, atualmente, mais de 500 mil mensagens por dia.

Codificação de Áudio
O Discord apresenta uma grande compatibilidade para exibir ficheiros áudio, sendo possível reproduzir dentro do ambiente da plataforma diversos tipos de ficheiros, tais como MP3, WAV, OGG, entre outros. Porém, para comunicações em chamada, para além dos seus mecanismos de limpeza de ruído, o codec usado pela plataforma é o Opus.
O Opus é um codec de áudio lossy lançado em 2012 que atualmente é usado em diversos serviços de VoIP. Caracterizado por ter sido desenhado para chamadas de voz com boa qualidade sonora e com baixa latência, este é utilizado também em streaming pela internet e por plataformas baseadas em WebRTC como o Discord. Para além do Discord, o Whatsapp e a Playstation são exemplos de outros utilizadores deste codec. O Opus é também caracterizado por ser Open-Source, significando que não requer custos adicionais pelo seu uso.

Fig. 3: Comparação da qualidade de audio em função da bitrate entre diversos codecs.

Fig. 4: Comparação da latência em função da bitrate entre diversos codecs.

Em comparação com outros codecs, o Opus demonstra ser uma das melhores soluções na codificação de áudio quando tem em conta a qualidade (Fig. 3) e a latência (Fig. 4) em função da bitrate a utilizar. Demonstra também que disponibiliza uma grande versatilidade quanto a ligação sobre a internet, oferecendo serviços para bitrates tanto constantes como para variáveis a partir dos 6 kb/s, tendo normalmente um delay à volta de 20 ms. Disponibiliza também 5 sampling rates desde 8 kHz (narrowband) a 48kHz (fullband).
Em termos de arquitetura, o sistema é baseado numa combinação entre 2 codecs de áudio: CELT, usado para codificar áudio de qualidade quando é necessária uma baixa latência, e SILK, usado para codificação de voz. Esta combinação tem como objetivo tirar partido do melhor dos mundos: minimizar o tamanho das packages em bitrates baixos garantindo uma possível recuperação das mesmas, melhor filtramento de áudio, mais frame sizes disponíveis, entre outros. Com esta arquitetura, o Opus consegue funcionar em 3 modos diferentes, fala, híbrido ou CELT, garantindo uma fácil e transparente transição entre eles, não só como um boa adaptabilidade à situação onde está a ser utilizado.

Fig. 5: Esquema de funcionamento do Opus.

Codificação de Vídeo
Tal como acontece em áudio, o Discord tem uma boa compatibilidade em geral com os mais usados formatos de vídeo, tais como MP4 ou WMV, reproduzindo-se diretamente dentro da plataforma. Links externos de conteúdo de vídeo provenientes de plataformas como o Youtube ou o Twitter, também podem ser pré-visualizados diretamente dentro do Discord. Durante uma chamada de vídeo, a imagem transmitida entre participantes é codificada utilizando o codec H.264.
H.264, lançado em 2004, é um codec lossy de vídeo desenvolvido entre a ISO/IEC e a ITU-T, também conhecido como AVC (Advanced Video Coding), que acabou por revolucionar a codificação de vídeo na altura em termos de eficiência. Empresas como a Apple, a Microsoft e a Adobe adotaram este tipo de tecnologia logo na altura, ajudando a que a mesma se distinguisse e se lançasse no mercado. Entretanto, novas versões deste codec já foram criadas (H.265 e H.266), mas, por motivos que envolvem licenciamentos e patentes, os mesmos não vingaram como o H.264 que continua a ser muito utilizado atualmente.
Este codec baseia a sua codificação de vídeo dividindo a imagem em macroblocos, tal como versões anteriores do mesmo. Estes são codificados temporalmente com a intenção de explorar redundâncias temporais em vídeo. Para alcançar tal objetivo, o codec utiliza mecanismos tais como o deslocamento de blocos em função do movimento ou vetores de movimento para prever futuras frames. Estes parâmetros são deliberados dentro de um alcance escolhido dependente da necessidade na situação. Além disso,o codec usa uma técnica de codificação onde frames criam interdependências com objetivo de diminuir a bitrate necessária para transmissão. Desta forma, o codificador transforma vídeo lossless em frames do tipo Intra (I), a frame original, Predicted (P), uma frame prevista em função segundo uma frame do tipo I e P anterior, e Bidirectionally predicted (B), uma frame prevista bidirecionalmente em função das frames à sua volta, formando GOPs caracterizados por formarem padrões. Desta forma, é possível o acesso aleatório dentro da sequência de vídeo por um utilizador que entre em chamada em qualquer momento. Além disso, o H.264 também possui mecanismos de quantização para aproveitar-se de possíveis irrelevâncias dentro do vídeo, tanto como mecanismos para combater o efeito de bloco nas frames.

Fig. 6: Arquitetura do Encoder H.264.

Depois de codificado, as imagens de vídeo são retidas dentro de um buffer antes de serem transmitidas para o descodificador. Este, permite que seja implementado um atraso suficiente para que, quando transmitido, o vídeo seja reproduzido de forma fluída e sem falhas. Este atraso pode ser muito benéfico em algumas situações, protegendo o sistema de frames mais pesados. Aí, o buffer acumula informação para ser posteriormente transmitida até um certo limite em que não tem capacidade de armazenar mais, dando overflow. Porém, quando muito elevado, pode levar a que o vídeo seja perceptivelmente atrasado podendo levar a problemas na comunicação entre utilizadores.

Armazenamento de Dados
Inicialmente, o Discord começou por armazenar os dados dos seus utilizadores e as suas mensagens numa base de dados baseada em MongoDB. Posteriormente, visto que o serviço de armazenamento de dados usado começou a dar problemas de latência, a plataforma migrou para uma infraestrutura em Cassandra que oferecia um bom serviço em termos de escalabilidade, manutenção, entre outros. Cassandra também oferecia um melhor modelo de gestão de dados, aproveitando as propriedades de uma base de dados não relacional em favor do sistema. Desta forma, o Discord suporta e armazena, atualmente, mais de 500 mil mensagens por dia.

Expansões do Serviço
Como consequência da sua arquitetura distribuída, o Discord torna-se numa plataforma facilmente extensível, não só internamente como além fronteiras. Esta funcionalidade leva a que os seus utilizadores sejam criativos, não só dando inúmeras possibilidades de personalização dos seus servidores como de criação de ferramentas que poderão melhorar a experiência de outros utilizadores. Neste campo, destacam-se duas extensões: os Bots e os Plugins.
Dentro da plataforma, Bots funcionam como utilizadores dentro dos servidores. Normalmente, são usados para obter novas funcionalidades ou informações vindas de fontes externas ao Discord. Os Bots mais usados na aplicação abordam tarefas variadas, tais como música, funcionando como um rádio dentro do canal de voz, jogos de Role Play, usando comando dentro dos canais de texto, exposição de notícias, conteúdos humorísticos, sinais financeiros ou de apostas, resultados desportivos, entre outros.
Por outro lado, Plugins são utilizados para expandir a própria interface da aplicação. Desta forma, funcionam como add-ons, podendo ser ativados ou desativados conforme o utilizador queira. Dentro do Discord, funcionalidades como contagem do tempo de chamada, tradução automática de texto, expansão de emojis, limpeza de notificações são meros exemplos de como os Plugins podem melhorar a experiência do utilizador dentro da aplicação.

© 2022 Comunicação Multimédia