Esta aplicação tem como objetivo possibilitar o acesso ao vivo a informações de partidas de Teamfight Tactics (TFT). O TFT é um jogo multiplayer, em que cada jogador forma um time e o objetivo é sobreviver a confrontos com jogadores adversários durante estágios da partida, até que o último inimigo seja eliminado. De uma partida é possível extrair dados como o tempo decorrido e o estágio corrente, e eventos relacionados a um jogador, como sua vida, dinheiro e campeões.
Para poder realizar a transmissão dessas informações ao vivo, foi idealizado um sistema baseado na plataforma Apache Kafka, em que os jogadores seriam responsáveis por enviar as informações de suas partidas para tópicos exclusivos deles, e quem quisesse assistir a partida de um jogador, teria que se inscrever no tópico do mesmo, para receber as informações.
O projeto foi feito em Java, e por enquanto não está integrado com a API que fornece os eventos do jogo (Overwolf). Para testes, está sendo
utilizado um arquivo .txt no diretório ./app/Logs, com exemplos reais de eventos do jogo, no formato JSON.
Na imagem abaixo é apresentada a arquitetura da aplicação, com indicações do fluxo principal de comunicação:
1.: Jogador 1 envia mensagem para o tópicoJogadores Online, para informar que estará transmitindo sua partida.2.: Jogador 1 envia mensagens para seu tópicoJogador 1, com eventos da partida.3.: Amigo dos jogadores 1 e 2 se inscreve no tópicoJogadores Onlinepara ver quais jogadores estão em transmissão.4.: Amigo dos jogadores vê que o Jogador 1 está transmitindo e se inscreve em seu tópico para assistir a partida.
Para a implementação de uma característica de Sistemas Distribuídos no projeto, configurou-se cada tópico com um fator de replicação igual
a três. Desta forma, cada partição possui duas cópias, sendo elas chamadas de seguidoras, e a principal de líder. Com esta configuração,
se faz necessário a criação de mais dois Brokers para conter as partições seguidoras.
Esta mudança busca prover um mecanismo de tolerância a falhas para o cluster. Seguindo a ilustração do cenário na imagem abaixo,
temos que a dinâmica ocorre da seguinte forma:
- Dada uma partição 0, operações de escrita e leitura serão feitas sobre a partição 0
líder. - Quando uma escrita é feita, as partições 0
seguidorassão notificadas, e então fazem requisições para partiçãolíderpara se atualizarem. - Se uma partição
líderfalha, as partiçõesseguidorascomeçam um processo de eleição de uma nova partiçãolíder. - Com um
fator de replicaçãoigual a três, tolera-se duas falhas.
No momento o sistema pergunta ao jogador seu nickname e o arquivo em que está os logs de sua partida. Por enquanto não há outras interações com o jogador.
-
listar:
- Retorno: Lista jogadores online.
-
assistir:
- Parâmetro:
nicknamedo jogador. - Retorno: Inscrição no tópico do jogador.
- Parâmetro:
-
status:
- Retorno: Informações da partida do jogador.
-
sair:
- Retorno: Cancelamento da inscrição no tópico do jogador.
Cada entidade da plataforma Kafka foi configurada da seguinte forma.
broker.id=0|broker.id=1|broker.id=2- ID único para cada
broker.
- ID único para cada
listeners=PLAINTEXT://localhost:9092|listeners=PLAINTEXT://localhost:9093|listeners=PLAINTEXT://localhost:9094- Endereço de cada
broker.
- Endereço de cada
num.partitions=3- Número de partições para cada tópico criado.
offsets.topic.replication.factor=3- Fator de replicação para as partições dos tópicos.
log.cleaner.enable=true- Configuração necessária para utilzação de
cleanup.policy=compactnos tópicos.
- Configuração necessária para utilzação de
cleanup.policy=compact- Tópicos mantém apenas as mensagens mais recentes de uma determinada chave. Desta forma, tanto da partida como da lista de jogadores online, preserva-se as últimas informações.
- Dada a sequência de mensagens de uma partida: vida:90 | vida:70 | estágio:2-1 | vida:60 | estágio:2-2 | dinheiro:30 | dinheiro:25, mantém-se no tópico: vida:60 | dinheiro:25 | estágio:2-2.
- Dada a sequência de mensagens na lista de jogadores online: jogador1:online | jogador2:online | jogador1:offline | jogador3:online | jogador2:offline, mantém-se: jogador1:offline | jogador2:offline | jogador3:online.
-
bootstrap.servers=localhost:9092,localhost:9093,localhost:9094- Endereços dos
brokers.
- Endereços dos
-
key.serializer=org.apache.kafka.common.serialization.StringSerializer -
value.serializer=org.apache.kafka.common.serialization.StringSerializer -
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer -
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer- Tratamento das mensagens (key, value) como Strings.

