• Nenhum resultado encontrado

Teste de escalabilidade no recebimento de mensagens

5.2 Testes Realizados

5.2.10 Teste de escalabilidade no recebimento de mensagens

Na Figura 20tem-se um gráfico apresentando o número de pacotes recebidos em função do tamanho do pacote para os intermediadores RabbitMQ, QPID e ActiveMQ, considerando 3, 5 e 10 consumidores.

Figura 31: Teste de escalabilidade para o recebimento de mensagens

Na Tabela21(a), observa-se as áreas obtidas para cada um dos testes e o percentual resultante da normalização. Na Tabela21 (b), tem-se as representatividades calculadas, sendo que os valores obtidos foram de 25,84%, 7,52% e 66,64%, para os intermediadores RabbitMQ, Qpid e ActiveMQ, respectivamente.

Tabela 21: Matrizes de representatividade dos testes de escalabilidade no recebimento de mensagens

3 Clientes 5 Clientes 10 Clientes

Intermediador Área Perc. Área Perc. Área Perc. RabbitMQ 6, 6048 ∗ 106 22,23% 8, 4395 ∗ 106 22,27% 1, 1416 ∗ 107 33,01% Qpid 2, 2537 ∗ 106 7,58% 2, 5693 ∗ 106 6,78% 2, 8302 ∗ 106 8,18% (a) ActiveMQ 2, 0858 ∗ 107 70,19% 2, 6890 ∗ 107 70,95% 2, 0333 ∗ 107 58,80% Intermediador Resultado RabbitMQ 25,84% Qpid 7,52% (b) ActiveMQ 66,64%

5.2.11

Alta Disponibilidade

O primeiro intermediador de mensagens avaliado foi o Pivotal RabbitMQ. Nesse é possível realizar uma configuração de alta disponibilidade chamada de cluster ativo-ativo. Nesse tipo de configuração temos mais de um nodo do intermediador ativo com um balanceador de carga (load balancer2), ou seja, o load balancer distribui as conexões entre os nodos ativos. No caso de uma falha em um dos nodos do cluster, as conexões são encaminhadas para os outros nodos ativos. É importante destacar que as mensagens são replicadas entre todos os nodos ativos do cluster. Desta forma, todos os eles possuem o estado atual das filas de mensagem.

Para o intermediador de mensagens Apache QPID, a opção disponível é a confi- guração de um cluster ativo-passivo. Neste caso, tem-se apenas um nodo ativo (mestre), sendo que todas as mensagens são replicadas aos outros nodos. Porém, esses não recebem conexões até que não sejam transformados em nodos mestres, ou seja, não forem ativados. É importante destacar que caso o nodo mestre falhe, é necessário ativar manualmente o nodo passivo. Assim, todas as conexões que estavam ativas com o intermediador de mensagem irão falhar. Desta forma, é necessário a implementação de um failover3 nos produtores e consumidores.

Por fim, para o intermediador de mensagens Apache ActiveMQ, existe uma imple- mentação de alta disponibilidade similar a do intermediador QPID, porém com a ativação automática do nodo passivo. Desta forma, quando o nodo mestre falhar, o nodo passivo

2 Load Balancer: são responsáveis por distribuir requisições entre os nodos ativos. Esses são utilizados

para garantir um melhor uso dos recursos computacionais.

3 failover: é um mecanismo da aplicação que provê uma troca de servidor para um outro no caso de

é ativado automaticamente. É importante destacar que como não existe um sistema de cluster ativo-ativo, é necessário que o produtor e consumidor implementem um failover.

De modo a comparar os intermediadores, foi utilizada a escala fundamental de Saaty (ver Seção 3.1.2, Tabela 3), sendo atribuído peso 1 para o intermediador RabbitMQ, uma vez que esse implementa um sistema de cluster ativo-ativo. Já para o intermediador ActiveMQ foi atribuído um peso igual a 5, uma vez que esse possui um sistema de alta disponibilidade baseado no modelo cluster ativo-passivo automático. Desta forma, exigindo uma implementação de um mecanismo failover nos produtores e consumidores.

Por fim, atribuiu-se um peso 6 para o intermediador Qpid que também implementa um sistema de cluster ativo-passivo, porém com acionamento manual. Considerou-se um peso 9 para um sistema que não apresenta um modelo de alta disponibilidade. Os percentuais de representatividade são apresentados na Tabela 22, sendo que os valores obtidos foram de 72,0%, 10,0% e 18,0%, para os intermediadores RabbitMQ, Qpid e ActiveMQ, respectivamente. Já a inconsistência calculada foi de 2,5% para os valores obtidos.

Tabela 22: Tabela de pesos para o critério alta disponibilidade

RabbitMQ Qpid ActiveMQ PML RabbitMQ 1 6 5 72,0% Qpid 1 6 1 1 2 10,0% ActiveMQ 1 5 2 1 18,0% Inconsistência: 2,5%

5.2.12

Disponibilidade de Documentação

O intermediador RabbitMQ apresenta aproximadamente 9300 tópicos publicados em seu fórum, aproximadamente 15000 perguntas no fórum Stack Overflow e 9 livros publicados. Já o intermediador Apache Qpid, apresenta aproximadamente 3000 tópicos publicados em seu fórum, aproximadamente 700 perguntas no fórum Stack Overflow e nenhum livro publicado. Por fim, o intermediador Apache ActiveMQ apresenta aproximadamente 14500 tópicos publicados em seu fórum, aproximadamente 10500 perguntas no fórum Stack Overflow e 5 livros publicados.

Na Tabela 23(a), tem-se um resumo desses valores e a normalização dos mesmos. Na Tabela 23 (b) tem-se que os valores obtidos foram de 52,08%, 4,62% e 43,30%, para os intermediadores RabbitMQ, Qpid e ActiveMQ, respectivamente.

Tabela 23: Tabela de pesos para o critério disponibilidade de documentação

Forum Oficial Stack Overflow Livros Intermediador Tópicos Perc. Tópicos Perc. Qtde. Perc. RabbitMQ 9300 34,70% 15000 57,25% 9 64,29% Qpid 3000 11,20% 700 2,67% 0 0% (a) ActiveMQ 14500 54,10% 10500 40,08% 5 35,71% Intermediador Resultado RabbitMQ 52,08% Qpid 4,62% (b) ActiveMQ 43,30%

5.2.13

Resultados Finais

Ao final, os resultados obtidos para cada critério, devem ser compilados de forma a obter-se um resultado único para cada intermediador. Na Tabela 24 tem-se a compilação dos resultados obtidos em cada um dos testes para cada um dos intermediadores (ver Seção4.3.2). Além disso, na última coluna da tabela, tem-se o percentual médio global. Esses foram apresentados na Seção4.3.2 (ver Tabela 11).

Tabela 24: Tabela com o resultado dos testes realizados para os intermediadores e o percentual médio global dos critérios

Percentual Médio Local RabbitMQ Qpid ActiveMQ

PMG dos Critérios Performance Direto 72,16% 15,64% 12,20% 11,53% Performance Fanout 83,14% 16,86% 0,00% 4,74% Performance Topicos 82,55% 17,45% 0,00% 1,74% Performance Cabeçalhos 82,95% 17,05% 0,00% 1,74% Escalabilidade Direto 69,47% 8,52% 22,01% 18,73% Escalabilidade Fanout 88,84% 11,16% 0,00% 7,70% Escalabilidade Tópicos 88,24% 11,76% 0,00% 2,83% Escalabilidade Cabeçalho 88,81% 11,19% 0,00% 2,83% Performance Consumidor 18,64% 7,98% 73,38% 9,88% Escalabilidade Consumidor 25,84% 7,52% 66,64% 16,04% Alta Disponibilidade 72,00% 10,00% 18,00% 17,67% Documentação 52,08% 4,62% 43,30% 4,57%

Para que seja possível obter o resultado final da análise, os valores do percentual médio local devem ser convertidos para uma representatividade global. Assim, deve ser feita uma multiplicação da representatividade média local do intermediador pela representatividade global do critério (SAATY, 1980). Ao final, os valores obtidos deverão ser somados obtendo-se o resultado para cada intermediador. A Tabela 25 apresenta o resultado deste e o percentual resultante para os intermediadores avaliados.

Como pode ser observado, o intermediador RabbitMQ apresentou uma representa- tividade de 61,08% e, portanto, apresenta superioridade sobre os demais intermediadores. Essa superioridade foi evidenciada em quase todos os critérios avaliados. De fato, este apresentou um desempenho inferior somente nos testes de recebimento de mensagens com a performance e escalabilidade do consumidor inferior a ferramenta ActiveMQ.

Já o intermediador ActiveMQ apresentou uma representatividade de 28,63% onde, mesmo não implementando todos os tipos de encaminhamento de mensagens propostos pela

Tabela 25: Tabela com os valores dos testes e o resultado final obtido na avaliação deste trabalho

Cálculo da Normalização Resultado

RabbitMQ Qpid ActiveMQ RabbitMQ Qpid ActiveMQ

Performance Direto (72,16%*11,53%) (15,64%*11,53%) (12,20%*11,53%) 8,32% 1,80% 1,41% Performance Fanout (83,14%*4,74%) (16,86%*4,74%) (0,00%*4,74%) 3,94% 0,80% 0,00% Performance Topicos (82,55%*1,74%) (17,45%*1,74%) (0,00%*1,74%) 1,44% 0,30% 0,00% Performance Cabeçalhos (82,95%*1,74%) (17,05%*1,74%) (0,00%*1,74%) 1,44% 0,30% 0,00% Escalabilidade Direto (69,47%*18,73%) (8,52%*18,73%) (22,01%*18,73%) 13,01% 1,60% 4,12% Escalabilidade Fanout (88,84%*7,70%) (11,16%*7,70%) (0,00%*7,70%) 6,84% 0,86% 0,00% Escalabilidade Tópicos (88,24%*2,83%) (11,76%*2,83%) (0,00%*2,83%) 2,50% 0,33% 0,00% Escalabilidade Cabeçalho (88,81%*2,83%) (11,19%*2,83%) (0,00%*2,83%) 2,51% 0,32% 0,00% Performance Consumidor (18,64%*9,88%) (7,98%*9,88%) (73,38%*9,88%) 1,84% 0,79% 7,25% Escalabilidade Consumidor (25,84%*16,04%) (7,52%*16,04%) (66,64%*16,04%) 4,14% 1,21% 10,69% Alta Disponibilidade (72,00%*17,67%) (10,00%*17,67%) (18,00%*17,67%) 12,72% 1,77% 3,18% Documentação (52,08%*4,57%) (4,62%*4,57%) (43,30%*4,57%) 2,38% 0,21% 1,98% 61,08% 10,29% 28,63%

norma AMQP de versão 0.9.1. Esse desempenho deve-se principalmente a sua performance no recebimento de mensagens. De fato, esse foi superior aos demais intermediadores neste critério. A documentação também teve bons resultados, uma vez que os foruns e os posts no Stack Overflow demonstram uma comunidade de desenvolvimento ativa.

Por fim, o intermediador Qpid obteve uma representatividade de apenas 10,29%. Essa apresentou os piores resultados em todos os critérios.

6 CONSIDERACOES FINAIS

Os estudos realizados neste trabalho objetivaram prover informações que auxiliassem na escolha de um intermediador de mensagens que implemente o padrão AMQP, e que seja mais adequado para ser utilizado como middleware na execução de processos assíncronos em ambientes de nuvens SaaS.

Para entendimento do funcionamento do intermediador de mensagens, foi apre- sentado o protocolo AMQP, que tem por objetivo padronizar o desenvolvimento de intermediadores de mensagem. Esse protocolo define entre outras coisas, a arquitetura do intermediador, o formato da mensagem, os tipos de encaminhamento, os procedimentos de tolerância a falhas, os mecanismos de segurança, os tipos de dados, etc. Foram escolhidas para esta avaliação os intermediadores de código aberto RabbitMQ, Qpid, ActiveMQ que implementam esse protocolo.

Para realizar os testes comparativos, foi utilizado o método analítico hierárquico que auxilia na avaliação diminuindo a subjetividade do avaliador. Baseando-se nesse método foi definido um modelo de avaliação, que procurou avaliar a performance e escalabilidade dos intermediadores. Além disso, procurou-se avaliar a alta disponibilidade dos intermediadores e sua documentação. Como ferramenta de apoio a avaliação dos intermediadores, definiu-se uma aplicação de referência, que tinha por objetivo produzir e consumir mensagens.

Como resultados, obteve-se que o intermediador RabbitMQ é a mais adequado para o desenvolvimento de aplicações que executem processos assíncronos em nuvens do tipo SaaS. Este apresentou uma representatividade de 61,08%,sendo superior em quase todos os critérios avaliados. Além disso, observou-se durante os testes, que este intermediador apresenta uma alta confiabilidade e um baixo consumo de recursos computacionais.

Já o intermediador ActiveMQ, apresentou um percentual de representatividade de 28,63%. Essa ferramenta mostrou-se adequada em situações onde o número de mensagens a ser recebidas é crítico. De fato esta apresentou um melhor desempenho em todos os testes envolvendo o recebimento de mensagens. Além disso, esse intermediador apresentou um baixo consumo de recursos computacionais na execução.

Por fim, o intermediador Qpid, apresentou um percentual de representatividade de apenas 10,29%. Esse foi o que apresentou mais problemas durante a execução, apresentando instabilidade no envio e recebimento de mensagens, necessitando o desenvolvimento de mecanismos de failover. Destaca-se também, seu alto consumo de recursos computacionais, o que inclusive inviabilizou os testes em cenários de escalabilidade de 10 clientes.

6.1

Trabalhos Futuros

Como sugestões de trabalhos futuros tem-se:

• Avaliar a qualidade do serviço (QoS - Quality of Service) dos intermediadores de mensagens que já encontram-se disponíveis em nuvens comerciais como, por exemplo, os intermediadores Windows Azure Service Bus (MICROSOFT, 2016a), Google Cloud Pub/Sub (GOOGLE, 2016) e Amazon Simple Queue Service (AMAZON, 2016).

• Avaliar intermediadores de mensagem comerciais que implementam o protocolo AMQP. Como exemplo de intermediadores pode-se citar: SwiftMQ (IIT, 2016), Service Bus for Windows Server (MICROSOFT, 2016c) e Red Hat JBoss A-MQ (RED HAT, 2016).

• Avaliar os intermediadores de mensagem em testes de performance e escalabilidade com mais tamanhos de mensagem, utilizando também mensagens de 8 KB, 16 KB, 32 KB e 64 KB.

Referências

AMAZON WEB SERVICES, INC. Amazon Simple Queue Service (SQS). [S.l.], 2016. Disponível em: <https://aws.amazon.com/pt/sqs/>. Acesso em: 15 jun. 2016. Citado na página 66.

AMAZON.COM INC. Amazon Web Services. [S.l.], 2015. Disponível em: <https: //aws.amazon.com>. Acesso em: 10 nov. 2015. Citado na página 11.

AMAZON.COM, INC. Amazon.com: Online Shopping for Electronics, Apparel, Computers, Books, DVDs & more. [S.l.], 2016. Disponível em: <https://www.amazon.com/>. Acesso em: 03 jun. 2016. Citado na página 40.

BAKER, M. Cluster computing white paper. arXiv preprint cs/0004014, 2000. Citado na página 40.

BARRETO, C. G. Agregando Frameworks de Infra-Estrutura em uma Arquitetura Baseada em Componentes: Um Estudo de Caso no Ambiente AulaNet. Tese (Doutorado) — PUC-Rio, 2006. Citado na página 40.

BESTEIRO, A. M. et al. A utilização do método ahp para traçar, como ferramenta para o auxilio a decisão de um candidato, a escolha de um curso de engenharia. 2009. Citado na página 51.

CARMO, T. d. R. Uso do padrão AMQP para transporte de mensagens entre atores remotos. Dissertação (Mestrado) — Universidade de São Paulo, 2012. Citado 2 vezes nas páginas 16e 20.

CHAN, A. H.; KWOK, W.; DUFFY, V. G. Using ahp for determining priority in a safety management system. Industrial Management & Data Systems, Emerald Group Publishing Limited, v. 104, n. 5, p. 430–445, 2004. Citado na página 29.

FIELDING, R. et al. Hypertext transfer protocol–HTTP/1.1. [S.l.], 1999. Citado na página 25.

GNU PROJECT. Gnuplot. [S.l.], 2016. Disponível em: <http://gnuplot.info/>. Acesso em: 03 jun. 2016. Citado na página 49.

GOOGLE INC. Google Cloud Pub/Sub. [S.l.], 2016. Disponível em: <https: //cloud.google.com/pubsub/>. Acesso em: 15 jun. 2016. Citado na página 66.

GOOGLE TECHNOLOGY COMPANY. Google Cloud Computing, Hosting Services & Cloud Support. [S.l.], 2015. Disponível em: <https://cloud.google.com/>. Acesso em: 10

nov. 2015. Citado na página 11.

GUIDORIZZI, H. L. Um curso de cálculo, vol. 2. [S.l.]: Grupo Gen-LTC, 2000. Citado na página 50.

IIT SOFTWARE GMBH. SwiftMQ Enterprise Messaging Platform. [S.l.], 2016. Disponível em: <http://www.swiftmq.com/>. Acesso em: 15 jun. 2016. Citado na página 66.

KELLEY, C. T. Iterative methods for optimization. [S.l.]: Siam, 1999. v. 18. Citado na página49.

KRAMER, J. Advanced message queuing protocol (amqp). Linux J., Belltown Media, Houston, TX, v. 2009, n. 187, nov. 2009. ISSN 1075-3583. Disponível em: <http://dl.acm.org/citation.cfm?id=1653247.1653250>. Citado 2 vezes nas páginas15

e24.

LIBERTY, J. Programming C#: Building. NET Applications with C#. [S.l.]: "O’Reilly Media, Inc.", 2005. Citado na página 37.

MARSH, G. et al. Scaling advanced message queuing protocol (amqp) architecture with broker federation and infiniband. Ohio State University, Tech. Rep. OSU-CISRC-5/09- TR17, 2008. Citado na página 38.

MICROSOFT CORPORATION. Microsoft Azure: Plataforma e serviços de computação em nuvem. [S.l.], 2015. Disponível em: <https://azure.microsoft.com>. Acesso em: 10 nov. 2015. Citado na página 11.

MICROSOFT CORPORATION. AMQP.Net Lite: AMQP 1.0 library for .Net and WinRT. [S.l.], 2016. Disponível em:<https://www.nuget.org/packages/AMQPNetLite/1.1.8>. Acesso em: 10 jun. 2016. Citado na página 47.

MICROSOFT CORPORATION. Azure Service Bus, a cloud-based messaging system for connecting apps and devices across public and private clouds. [S.l.], 2016. Disponível em: <https://azure.microsoft.com/en-us/services/service-bus/>. Acesso em: 15 jun. 2016.

Citado na página66.

MICROSOFT CORPORATION. .NET - Powerful Open Source Cross Platform Development. [S.l.], 2016. Disponível em: <https://www.microsoft.com/net>. Acesso em: 10 jun. 2016. Citado na página 47.

MICROSOFT CORPORATION. Service Bus for Windows Server (Service Bus 1.1). [S.l.], 2016. Disponível em:<https://msdn.microsoft.com/en-us/library/dn282144.aspx>. Acesso em: 15 jun. 2016. Citado na página 66.

OASIS, O. Organization for the advancement of structured information standards. Oasis Open, v. 2, n. 4, 2015. Citado na página15.

O’HARA, J. Toward a commodity enterprise middleware. Queue, ACM, v. 5, n. 4, p. 48–55, 2007. Disponível em: <http://dl.acm.org/citation.cfm?id=1255424/>. Acesso em: 15 out. 2015. Citado na página15.

PIVOTAL. .NET/C# RabbitMQ client library. [S.l.], 2016. Disponível em:

<https://www.rabbitmq.com/dotnet.html>. Acesso em: 10 jun. 2016. Citado 2 vezes nas páginas47 e48.

PIVOTAL SOFTWARE. RabbitMQ - Messaging that just works. [S.l.], 2015. Disponível em: <https://www.rabbitmq.com/>. Acesso em: 01 nov. 2015. Citado 2 vezes nas páginas11 e25.

RED HAT, INC. Red Hat JBoss A-MQ. [S.l.], 2016. Disponível em: <https:

//www.redhat.com/en/technologies/jboss-middleware/amq>. Acesso em: 15 jun. 2016. Citado na página66.

REIS, C. R.; FORTES, R. P. de M. Caracterizaç ao de um Processo de Software para Projetos de Software Livre. Tese (Doutorado) — PhD thesis, University of Sao Paulo, Brazil, 2003. Citado na página 40.

RIBEIRO, A. de L. Teorias da administração. [S.l.]: Saraiva, 2003. Citado na página 29. SAATY, T. L. The Analytic Hierarchy Process. New york: McGraw-Hill, 1980. Citado 6 vezes nas páginas 13, 29,34, 35, 41e 62.

SAATY, T. L. Decision making for leaders: the analytic hierarchy process for decisions in a complex world. [S.l.]: RWS publications, 1999. v. 2. Citado na página 13.

SAATY, T. L. Decision making with the analytic hierarchy process. International journal of services sciences, Inderscience Publishers, v. 1, n. 1, p. 83–98, 2008. Citado 2 vezes nas páginas 30e 31.

SAATY, T. L.; VARGAS, L. G. The seven pillars of the analytic hierarchy process. In: Models, Methods, Concepts & Applications of the Analytic Hierarchy Process. [S.l.]: Springer, 2012. p. 23–40. Citado 2 vezes nas páginas 51 e55.

SILVA, R. M.; BELDERAIN, M. C. N. Considerações sobre métodos de decisão multicritério. International journal of services sciences, Instituto Tecnológico de Aeronáutica, ITA, São Paulo, 2005. Citado na página31.

SNYDER, B.; BOSNANAC, D.; DAVIES, R. ActiveMQ in action. [S.l.]: Manning, 2011. v. 47. Citado na página 26.

SOUSA, F. R.; MOREIRA, L. O.; MACHADO, J. C. Computação em nuvem: Conceitos, tecnologias, aplicações e desafios. II Escola Regional de Computação Ceará, Maranhão e Piauí (ERCEMAPI), p. 150–175, 2009. Citado na página 11.

SPOLTI, E. Avaliação de frameworks de desenvolvimento de aplicações móveis multiplataforma. 2015. Trabalho de Conclusão de Curso - Ciência da Computação, Universidade de Caxias do Sul, Caxias do Sul, 2015. Citado na página 29.

STACK EXCHANGE INC. Stack Overflow. [S.l.], 2016. Disponível em: <http: //stackoverflow.com/>. Acesso em: 03 jun. 2016. Citado na página40.

STANFORD-CLARK, A.; HUNKELER, U. Mq telemetry transport (mqtt). 1999. Disponível em: <http://mqtt.org>. Citado 2 vezes nas páginas25e 26.

STOMP GROUP. The Simple Text Oriented Messaging Protocol. [S.l.], 2012. Disponível em: <https://stomp.github.io/>. Acesso em: 21 nov. 2015. Citado 2 vezes nas páginas 25e 26.

TANENBAUM, A. S.; BOS, H. Modern Operating Systems. 4th. ed. Upper Saddle River, NJ, USA: Prentice Hall Press, 2014. ISBN 013359162X, 9780133591620. Citado na página 47.

THE APACHE SOFTWARE FOUNDATION. Apache ActiveMQ. [S.l.], 2015. Disponível em: <http://activemq.apache.org/>. Acesso em: 01 mar. 2016. Citado 9 vezes nas páginas 11, 25, 26, 51, 52,53, 56, 57e 58.

THE APACHE SOFTWARE FOUNDATION. Apache Qpid, Messaging built on AMQP. [S.l.], 2015. Disponível em: <http://qpid.apache.org/>. Acesso em: 01 nov. 2015. Citado 3 vezes nas páginas 11, 25e 26.

TRIELOFF, C. et al. Advanced message queuing protocol protocol specification. amq-spec. AMQP. org, v. 0.10, 2006. Citado 9 vezes nas páginas 13, 15, 16,17, 18, 19, 20,22 e24.

TROITIñO, D. Aplicações Ricas na Web. 2012. Trabalho de Conclusão de Curso - Sistemas de Informação, Universidade de Caxias do Sul, Caxias do Sul, 2012. Citado na página29.

VMWARE, INC. VMware Virtualization for Desktop & Server, Application, Public & Hybrid Clouds. [S.l.], 2016. Disponível em: <http://www.vmware.com/>. Acesso em: 03 jun. 2016. Citado na página48.

WHITAKER, R. Criticisms of the analytic hierarchy process: Why they often make no sense. Mathematical and Computer Modelling, Elsevier, v. 46, n. 7, p. 948–961, 2007. Citado 2 vezes nas páginas 51e 55.

WOLFRAM ALPHA LLC. Wolfram|Alpha: Computational Knowledge Engine. [S.l.], 2016. Disponível em:<https://www.wolframalpha.com/>. Acesso em: 02 jun. 2016. Citado na página50.

YANG, K.-L.; CHU, P.; CHOUHUANG, W.-T. Note on incremental benefit/cost ratios in analytic hierarchy process. Mathematical and computer modelling, Elsevier, v. 39, n. 2, p. 279–286, 2004. Citado na página 51.

Documentos relacionados