5.5 Provisionamento de Qualidade de Contexto
5.5.2 Provisionamento de Qualidade de Serviço
Para prover qualidade de serviço para aplicações de IoT, a M-Hub/CDDL define um conjunto extensível de parâmetros e políticas de QoS. Uma política de QoS é um mecanismo transparente que controla o envio e o recebimento de dados de modo a atender requisitos diversos da aplicação, tais como confiabilidade, pontualidade, persistência e disponibilidade na distribuição de dados de contexto. O comportamento da política dependerá dos parâmetros de QoS que a configuram. Sendo assim, o provisionamento de QoS vai além de simplesmente tornar a aplicação ciente da qualidade do serviço, mas principalmente permitir que essa qualidade seja controlada para satisfazer os requisitos de produtores e consumidores.
Os parâmetros e políticas de qualidade de serviço são configurados de forma simétrica para ambos os lados da distribuição, ou seja, tanto no publicador como no subscritor. Por um lado, os parâmetros de QoS informados pelo produtor controlarão a forma como os dados são enviados para o broker. Por outro, os parâmetros de QoS informados pelo subscritor vão controlar a maneira como os
dados serão recebidos do broker e entregues para a camada de aplicação. Os
parâmetros/políticas providos pela M-Hub/CDDL são:
• Prazo de Entrega: define o tempo máximo pelo qual a aplicação está disposta a esperar para enviar ou receber pelo menos uma mensagem. Essa política monitora as filas de envio e recebimento na camada de middleware, notificando a aplicação caso o prazo especificado não seja cumprido.
• Taxa de Atualização (Filtro baseado em Tempo): define o intervalo mínimo de separação entre chegadas sucessivas de mensagens, possibilitando assim que a aplicação controle a taxa de recebimento e processamento dos dados, independentemente da frequência com a qual eles são produzidos.
• Controle de Latência: permite que a aplicação defina um atraso adicional
programado na distribuição de dados de contexto. Durante o período
especificado, as mensagens produzidas são agrupadas a fim de que possam ser enviadas ou recebidas em uma única rajada.
• Histórico: define a maneira como as mensagens publicadas ou recebidas pela aplicação são armazenadas. Há dois modos: keep all e keep last. No primeiro, todas
5.5 Provisionamento de Qualidade de Contexto 108 as mensagens são armazenadas na cache. No segundo, apenas as n últimas são armazenadas. O histórico pode ser acessado por meio de operações read e take. A primeira obtém apenas uma cópia da mensagem armazenada, que pode ser lida novamente no futuro, pois a original permanecerá no histórico. A segunda remove a mensagem original do histórico, que não poderá ser lida novamente. • Ordem de Destino: define se as mensagens armazenadas no histórico da
aplicação serão organizadas com base no tempo da publicação ou do recebimento da mensagem. Se o subscritor quiser considerar o tempo da publicação, então deverá estar ciente de que existe a necessidade de utilizar um mecanismo de sincronização entre os relógios do produtor e do consumidor.
• Vida Útil: remove do histórico da aplicação as mensagens cujo tempo de validade expirou. O tempo de validade pode ser especificado pelo publicador. Entretanto, o subscritor pode ignorar esse tempo de validade e até mesmo estabelecer um prazo de validade adicional.
• Retenção (Durabilidade): define que o broker deve reter sempre a última mensagem publicada em cada tópico. Se novos subscritores surgirem, então a mensagem retida será enviada imediatamente a eles, evitando que os mesmos tenham que esperar até a próxima publicação para receber uma mensagem. Essa política é baseada no mecanismo de retenção padrão do MQTT (ver Seção 4.3.6) • Vivacidade: política utilizada por clientes que desejam ser notificados quando
outros clientes perderem a conexão com o broker devido a falhas. Esse
mecanismo é baseado em mensagens Last Will and Testament - LWT do protocolo MQTT (ver Seção 4.3.5)
• Confiabilidade: define o nível de confiabilidade empregado pela CDDL na entrega das mensagens. Essa política foi implementada com base nos três níveis de confiabilidade providos pelo protocolo MQTT: at most once, at least once e
exactly once (Ver Seção 4.3.2). Entretanto, essa confiabilidade é incrementada
pela utilização de um buffer intermediário, cujo funcionamento será explicado na Seção 5.6
• Sessão: define se a sessão mantida entre o cliente e o broker é persistente ou não. Esse mecanismo é baseado no gerenciamento de sessões implementado pelo broker MQTT (Ver Seção 4.3.4).
Do ponto de vista da aplicação, cada política de qualidade de serviço é uma classe que contém métodos específicos para a configuração dos parâmetros de QoS. Com exceção da política Sessão, todas políticas herdam da classe AbstractQoS, que pode ser utilizada para implementar novas políticas. Uma vez definidas, usa-se as interfaces Publisher e Subscriber para alterar as políticas do publicador e do subscritor, respectivamente.
A Figura 5.4 mostra um diagrama de classe das políticas de QoS. As Figuras 5.5 e 5.6 mostram as interfaces do publicador e do subscritor, respectivamente. Nessas figuras é possível observar os métodos de configuração das políticas de QoS.
5.5 Provisionamento de Qualidade de Contexto 110
Figura 5.5: Interface Publisher
As Listagens 5.9 e 5.10 mostram exemplos de como configurar a política Histórico no publicador e no subscritor, respectivamente. Nesse exemplo, o histórico do subscritor é configurado de modo a armazenar todos os dados, enquanto que o histórico do publicador é configurado de modo a armazenar apenas as últimas cem mensagens. A política é configurada utilizando-se um objeto da classe HistoryQoS. O tipo de histórico (Keep All ou Keep Last) é informado utilizando-se o método
setKind(int kind) dessa classe. A definição do histórico como Keep All no
subscritor indica que ele guardará todas as mensagens (até o limite dos recursos). A definição de profundidade do histórico do subscritor requer o uso do método
setDepth(int depth). A política é alterada no publicador e no subscritor
invocando-se o método setHistoryQoS(HistoryQoS qos).
Listing 5.9: Exemplo de configuração da política Histórico no publicador.
//...Oculta codigos anteriores
//Cria uma instancia da politica de QoS para o publicador HistoryQoS pubHistoryQoS = new HistoryQoS();
//Configura o historico como keep last pubHistoryQoS.setKind(HistoryQoS.LAST); //configura a profundidade do historico pubHistoryQoS.setDepth(100);
//Obtem instancia do publicador
Publisher publisher = DefaultPablisher.getInstance(); //muda a politica do publicador
publisher.setHistoryQoS(historyQoS); //...
Listing 5.10: Exemplo de configuração da política Histórico no subscritor.
//instancia a politica de QoS do subscritor HistoryQoS subHistoryQoS = new HistoryQoS(); //configura o historico para armazenar tudo subHistoryQoS.setKind(HistoryQoS.KEEP_ALL) //Obtem instancia do subscritor
Subscriber subscriber = DefaultSuscriber.getInstance(); //muda a politica no subscritor
5.5 Provisionamento de Qualidade de Contexto 112 As Listagem 5.11 e 5.12 mostram exemplos de como configurar a política Taxa de Atualização (Filtro baseado em Tempo) no publicador e no subscritor, respectivamente. Essa política é representada pela classe TimeBasedFilterQoS. O intervalo mínimo de separação entre as amostras é informado pela aplicação utilizando-se o método setMinSeparation(long time) dessa classe. Uma vez instanciada e configurada, a política é alterada tanto no publicador como no subscritor invocando-se o método setTimeBasedFilterQoS(TimeBasedFilterQoS qos).
Listing 5.11: Exemplo de configuração da política Taxa de Atualiação no publicador.
//...Oculta codigos anteriores
//Obte uma instancia da politica de QoS
TimeBasedFilterQoS timeBasedFilterQoS = new TimeBasedFilterQoS(); //configura o intervalo minimo de separacao (milisegundos)
timeBasedFilterQoS.setMinSeparation(1000);
Publisher publisher = DefaultPublisher.getInstance(); //muda a politica no subscritor
publisher.setTimeBasedFilterQoS(timeBasedFilterQoS);
Listing 5.12: Exemplo de configuração da política Taxa de Atualiação no no subscritor.
//...Oculta codigos anteriores
//Obte uma instancia da politica de QoS
TimeBasedFilterQoS timeBasedFilterQoS = new TimeBasedFilterQoS(); //configura o intervalo minimo de separacao (milisegundos)
timeBasedFilterQoS.setMinSeparation(5000);
Subscriber subscriber = DefaultSuscriber.getInstance(); //muda a politica no subscritor
subscriber.setTimeBasedFilterQoS(timeBasedFilterQoS);
Considerando a dinamicidade das aplicações cientes de contexto, cujos requisitos de QoC podem mudar de um momento para o outro, a M-Hub/CDDL permite alterar o valor de todos parâmetros de QoS em tempo de execução, exceto
a Sessão. Por exemplo, em relação à política Confiabilidade, se o publicador
estava enviando mensagens com confiabilidade em nível 0 (at most once) e muda dinamicamente essa confiabilidade para o nivel 1 (at least once), isso significa que os envios das novas mensagens já serão feitos utilizando-se a configuração mais recente.