Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation

Sistemas Distribuídos: Eleição de Líder em Anel (Ring Leader Election)

Este projeto implementa o Algoritmo de Eleição de Líder em Anel utilizando
Message-Oriented Middleware (MOM) para comunicação entre nós distribuídos.
Cada nó roda como um processo independente, conectado ao RabbitMQ, e participa
do processo de eleição para determinar qual deles será o líder do sistema distribuído.

✍️ Autoria do código:

Enzo C. Stival, Henrique de O. Godoy, Hiann W. Padilha, Marcos P. Ruppel. Bacharelado em Ciência da Computação, PUCPR - 2025.


📘 Descrição do Problema

A eleição distribuída de líder consiste em decidir, entre várias entidades em um
sistema distribuído, qual delas exercerá o papel de líder. A topologia
utilizada neste trabalho é um anel unidirecional, onde cada nó possui
exatamente dois vizinhos.

Requisitos fundamentais

  • Cada nó deve possuir um identificador único.
  • O sistema deve garantir que somente um líder seja eleito.
  • A comunicação ocorre apenas entre vizinhos, via MOM (RabbitMQ).
  • Um nó iniciador dispara o processo de eleição.

🧠 Funcionamento do Algoritmo

O algoritmo segue o modelo clássico de eleição em anel:

  1. Um nó iniciador envia seu próprio identificador para um vizinho.
  2. Ao receber uma mensagem ELEICAO:<id>:
    • o nó compara <id> com o seu próprio id;
    • encaminha ao próximo vizinho o maior entre eles;
    • se um nó receber o próprio id, significa que seu id é o maior do anel; portanto, é o líder.
  3. Após determinar o líder, o nó envia LIDER:<id_lider> pelo anel.
  4. Cada nó recebe essa mensagem, registra o líder e a repassa adiante.
  5. Quando a mensagem retorna ao próprio líder, o sistema está síncronizado.

🏗 Arquitetura do Projeto

├── componente.py      # Implementação de um nó no anel
├── starter.py         # Dispara a eleição em um nó arbitrário
└── README.md          # este arquivo

Cada nó:

  • cria sua própria fila no RabbitMQ (queue=<id_nó>),
  • escuta mensagens endereçadas a ele,
  • processa eleição ou anúncio de líder,
  • encaminha mensagens ao próximo vizinho.

📡 Comunicação (Mensagens)

Mensagens enviadas pelos nós:

  • ELEICAO:<id> circula pelo anel até retornar ao maior.
  • LIDER:<id_lider> notifica todos os nós do líder eleito.

Mensagens vindas do starter:

  • START:<id> faz um nó iniciar uma eleição.

▶️ Como Executar

Subir cada componente (nó), informando seu id e seu vizinho:

python componente.py 1 2
python componente.py 2 3
...

Disparar a eleição informando o nó iniciador:

python starter.py START 3

📄 Exemplo de Topologia Padrão

Para o sistema funcionar é necessário que os componentes estejam conectados
em uma topologia de anel unidirecional. O anel padrão usado no exemplo é:

1 ─ 2 ─ 3 ─ 4 ─ 5 ─ 6 ─ 7 ─ 8
↑                         ↓
└─────────────────────────┘

Cada nó tem exatamente dois vizinhos.


🧪 Comportamento Esperado

Durante a execução, o nó líder será descoberto ao receber seu próprio id e imprimirá:

>>> EU SOU O LÍDER (id máximo do anel) <<<

E os demais nós:

<id> reconhece <lider> como líder.

🧰 Dependências

  • Python 3+
  • pika (client AMQP)
pip install pika

👨‍🏫 Notas Acadêmicas

Este projeto demonstra:

  • implementação do conceito de Message-oriented Middleware (MOM);
  • coordenação de processos via mensagens;
  • ausência de relógio global e dependência apenas do tráfego pelo anel;

📚 Licença

Uso educacional - PUCPR.

About

T2 - Eleição de Líder em Anel - Prog Distribuída - BCC/PUCPR 2025

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages