• Nenhum resultado encontrado

Algoritmo de Filiação

No documento João Miguel de Matos Gil Ramos (páginas 44-47)

2.3 Abordagens conhecidas dentro do Paradigma Editor/assinante

2.4.2 Algoritmo de Filiação

O sistema Livefeeds é um sistema dinâmico, ao longo do tempo novos nós chegam ao sistema e os nós presentes do sistema devem ficar a conhecer estes novos nós. Por ou- tro lado, existem nós que abandonam o sistema, quer por falha ou vontade própria. A saída destes deve ser do conhecimento dos restantes participantes para que estes possam proceder à limpeza das suas bases de dados. O conhecimento da chegada e saídas de nós é produzido pelo algoritmo de filiação. Este algoritmo é o principal responsável por criar em todos os nós uma visão completa dos participantes do sistema, disseminando as entradas e saídas dos novos nós pelos sistema.

2.4.2.1 Entrada de um Nó

À chegada ao sistema vamos supor que o novo nó conhece um outro nó que já se encontra no sistema. O nó começa por contactar este nó semente e através deste, obtém a base de dados dos participantes do sistema em termos de identificadores, endereços e chaves dos filtros. Uma vez obtida a base de dados o nó consegue assim determinar o sequenciador da sua fatia e enviar para este o pedido de entrada no sistema.

O sequenciador irá agregar os pedidos durante um período de tempo pré-configurado e iniciar a disseminação das novas entradas. Esta agregação visa minimizar o impacto dos cabeçalhos das mensagens que seria extremamente elevado se fosse iniciada uma disse- minação por cada nova entrada no sistema. Durante a disseminação, o conjunto de novos nós, os seus identificadores, endereços e filtros é disseminado entre os nós. Quando o nó recebe notificação da sua própria entrada durante a disseminação este considera que en- trou no sistema.

Nesta altura o nó necessita também de ficar a conhecer os filtros dos nós que já se encontram no sistema. Como os filtros são potencialmente os objectos de maior dimensão no sistema, o download da base de dados dos filtros é feito, não apenas a partir de um nó mas, a partir de vários de modo a distribuir o upload por esses vários nós. Para este efeito, o nó contacta aleatoriamente um nó para que este lhe envie uma parte da base de dados de filtros até obter todas as partes.

2.4.2.2 Algoritmo de Disseminação de Entradas

O sequenciador é responsável por iniciar a disseminação dos pedidos de entrada que agregou. Esta disseminação poderia ser feita colocando o sequenciador a notificar todos os nós do sistema directamente mas essa seria uma abordagem que implicaria que os nós sequenciadores realizariam muito mais trabalho que os restantes nós. Em alterna- tiva, queremos tirar partido da rede estruturada formada pelos participantes do sistema e distribuir ao máximo a carga da disseminação das novas entradas pelos participantes no sistema.

Inicialmente consideramos que o sequenciador tem à sua responsabilidade um inter- valo no espaço de chaves. Isto é, um intervalo em que, no final da disseminação, todos os nós devem estar notificados das novas entradas. Este intervalo é inicialmente igual ao intervalo de chaves global do sistema, uma vez que todos os participantes do sistema devem ficar a conhecer os novos nós. O sequenciador pode então dividir este intervalo em G subintervalos e escolher um nó em cada um desses para receber a lista de novas entradas e o subintervalo que ele deverá tratar. Uma vez que o nó escolhido em cada subintervalo é o primeiro desse intervalo, quando os nós do segundo nível vão tratar o seu intervalo podem assumir que os nós que estão para trás da sua chave já foram notifi- cados e por isso o intervalo pode avançar até à sua própria chave. Isto significa que um intervalo recebido da forma [min, max] pode tomar a forma [k, max] onde k é a chave do nó. Os nós do segundo nível repetem o processo de divisão do intervalo de forma análoga ao realizado inicialmente pelo sequenciador e assim sucessivamente nos níveis seguintes até que todos os nós foram notificados da chegada dos novos nós. Este pro- cesso de subdivisão dos intervalos dá origem a uma árvore de disseminação. O grau G desta árvore pode ser controlado parametrizando o número de subintervalos que devem ser gerados por cada nó a cada nível. A certa altura, os intervalos serão tão pequenos que os nós podem decidir contactar todos os nós do intervalo directamente terminando assim a subdivisão.

Algoritmo 1TRATAREVENTOENTRADAS(s, m) Require: Evento m, Socket s.

1: GUARDARNOVASENTRADAS(m.entradas)

2: m.intervaloAVANCARINTERVALO(m.intervalo, k){k, a chave do no}

3: if m.intervalo.nodeCount() > G then 4: {G, grau da árvore de disseminação}

5: subintervalos DIVIDIRINTERVALO(m.intervalo, G)

6: for all intervalo : subintervalos do

7: for all n :NÓSCONHECIDOS(intervalo)do

8: repeat

9: resultado← ENVIAR(NÓSCONHECIDOS(intervalo).next(), m)

10: until resultado = true ∨NÓSCONHECIDOS(intervalo).next() = null

11: end for

12: end for

13: else

14: for all n : known(m.intervalo) do

15: ENVIAR(n, m)

16: end for

17: end if

O algoritmo descrito resulta então numa distribuição do trabalho da disseminação. No entanto, os nós escolhidos para realizar trabalho durante a distribuição seriam sempre os mesmos uma vez que o intervalo seria sempre o mesmo ([0, chavemax]). Para melhor balancear a carga entre os vários nós consideramos um intervalo circular e um ajuste segundo um deslocamento aleatório no início de cada disseminação. Podemos então definir o intervalo com deslocamento aleatório, para um espaço de chaves [0, 1] como,

[δ, 1]∨ [0, δ] (2.1)

2.4.2.3 Saída de um Nó

As entradas de novos nós no sistema são um acontecimento que consideramos impor- tante pois tratam-se de novos nós que podem realizar trabalho, as saídas, por outro lado, podem ser consideradas menos importantes uma vez que um nó pode simplesmente pas- sar por cima do nó que falhou. Ainda assim, a acumulação de nós que falharam resulta num desperdício de espaço e em complexidade desnecessária durante as disseminações. Para além do desperdício de espaço em cada nó a falta de limpeza das bases de dados dos nós fará com que o custo do download da base dados inicial aquando da entrada do nó seja muito mais despendioso. Por essas razões, queremos acelerar o processo em que os nós tomam conhecimento da saída dos nós.

Quando um nó detecta que é incapaz de comunicar com outro nó do sistema consi- dera que este abandonou o sistema. Nessa altura o nó pode enviar uma notificação para

o sequenciador ou iniciar ele próprio uma disseminação notificando os restantes partici- pantes da saída do nó.

Uma vez que os participantes do sistemas comunicam entre si de forma concorrente, isto significa que a detecção de saídas é concorrente. Este facto revela-se particularmente problemático quando existe um aumento repentino da taxa de saídas, por exemplo, de- vido a uma partição na rede. A saída de um nó pode ser detectada por vários nós concor- rentemente gerando um elevado tráfego de notificações ao sequenciador. Por outro lado se os nós iniciarem a sua própria disseminação iremos ter várias disseminações redun- dantes.

Numa primeira versão do Livefeeds os nós limitam-se a iniciar uma disseminação do evento de saída o que acarreta o problema de existirem várias disseminações redundan- tes e um consumo exagerado de largura de banda. Na secção2.4.4 descrevemos uma variação do sistema que pretende lidar com este problema.

No documento João Miguel de Matos Gil Ramos (páginas 44-47)

Documentos relacionados