A comparative study of software architectures in constrained-device iot deployments

Detalhes bibliográficos
Autor(a) principal: Plessis, Shani du
Data de Publicação: 2021
Tipo de documento: Dissertação
Idioma: eng
Título da fonte: Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
Texto Completo: http://hdl.handle.net/10400.1/17440
Resumo: Since its inception in 2009, the Internet of Things (IoT) has grown dramatically in both size and complexity. One of the areas that has seen significant developments is that of resourceconstrained devices. Such devices clearly require careful engineering in order to manage resources such as energy and memory, whilst still ensuring acceptable performance. A number of aspects play a critical role in the engineering of such systems. One such aspect is the choice of software architecture. The microservices architecture appears to be a promising approach for IoT, as suggested by a number of researchers. However, limited research has been done on the implementation of microservices in IoT and resource-constrained devices, and even less research has been done to compare the microservices architecture to the monolithic architecture in such deployments. The aim of this research thesis was to compare these two architectures in the context of IoT and constrained devices. The two architectures were compared by: energy consumption, runtime performance and memory consumption. To ensure that the results are not specific to a single programming language, each architecture was developed in three different languages: Go, Python and C++. Following a review of different asynchronous messaging protocols, Message Queuing Telemetry Transport was selected. The experiments were conducted on a Raspberry Pi 4, and a number of other hardware devices were used, including sensors, an actuator and a type C USB Tester. Two metrics were used to measure power consumption: maximum instantaneous power consumption and total power consumption. Whilst three metrics were used to measure memory consumption: maximum Resident Set Size (RSS), total RSS and central processing unit (CPU) resource usage. Each experiment was carried out 10 times in order to ensure data validity. The power consumption results showed that the microservices architecture had, on average, 14,9% higher maximum instantaneous power consumption, whilst the total power consumption of the microservices architecture was only 3,0% greater than that of the monolithic architecture. The runtime results indicated that the microservices architecture had a longer runtime than the monolithic architecture for Go and C++, whilst the inverse was true for Python. When considering memory consumption, it was found that the maximum RSS was 37,1% greater for the microservices architecture. The total RSS results for both architectures were very similar for Go and C++, whilst microservices performed much better for Python. Lastly, the results for CPU usage showed that the monolithic architecture had, on average, 14,9% greater CPU usage than the microservices architecture. It was concluded that, for small-scale applications, the monolithic architecture had better performance across most metrics and languages. It was, however,recommended that additional research be conducted on larger scale applications to determine the applicability of these results beyond the scope of small-scale applications. In general, there is still much room for research in this area.
id RCAP_948001bb85b6fc2c1d81d2a072df7d64
oai_identifier_str oai:sapientia.ualg.pt:10400.1/17440
network_acronym_str RCAP
network_name_str Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
repository_id_str 7160
spelling A comparative study of software architectures in constrained-device iot deploymentsInternet of ThingsResource-constrained devicesSoftware architectureMicroservicesMonolothicDomínio/Área Científica::Engenharia e Tecnologia::Outras Engenharias e TecnologiasSince its inception in 2009, the Internet of Things (IoT) has grown dramatically in both size and complexity. One of the areas that has seen significant developments is that of resourceconstrained devices. Such devices clearly require careful engineering in order to manage resources such as energy and memory, whilst still ensuring acceptable performance. A number of aspects play a critical role in the engineering of such systems. One such aspect is the choice of software architecture. The microservices architecture appears to be a promising approach for IoT, as suggested by a number of researchers. However, limited research has been done on the implementation of microservices in IoT and resource-constrained devices, and even less research has been done to compare the microservices architecture to the monolithic architecture in such deployments. The aim of this research thesis was to compare these two architectures in the context of IoT and constrained devices. The two architectures were compared by: energy consumption, runtime performance and memory consumption. To ensure that the results are not specific to a single programming language, each architecture was developed in three different languages: Go, Python and C++. Following a review of different asynchronous messaging protocols, Message Queuing Telemetry Transport was selected. The experiments were conducted on a Raspberry Pi 4, and a number of other hardware devices were used, including sensors, an actuator and a type C USB Tester. Two metrics were used to measure power consumption: maximum instantaneous power consumption and total power consumption. Whilst three metrics were used to measure memory consumption: maximum Resident Set Size (RSS), total RSS and central processing unit (CPU) resource usage. Each experiment was carried out 10 times in order to ensure data validity. The power consumption results showed that the microservices architecture had, on average, 14,9% higher maximum instantaneous power consumption, whilst the total power consumption of the microservices architecture was only 3,0% greater than that of the monolithic architecture. The runtime results indicated that the microservices architecture had a longer runtime than the monolithic architecture for Go and C++, whilst the inverse was true for Python. When considering memory consumption, it was found that the maximum RSS was 37,1% greater for the microservices architecture. The total RSS results for both architectures were very similar for Go and C++, whilst microservices performed much better for Python. Lastly, the results for CPU usage showed that the monolithic architecture had, on average, 14,9% greater CPU usage than the microservices architecture. It was concluded that, for small-scale applications, the monolithic architecture had better performance across most metrics and languages. It was, however,recommended that additional research be conducted on larger scale applications to determine the applicability of these results beyond the scope of small-scale applications. In general, there is still much room for research in this area.A Web e a Internet das Coisas (WoT/IoT) são áreas empolgantes que, sem dúvida, continuarão a desenvolver-se nos próximos anos. À medida que vão sendo feitos novos desenvolvimentos nestas áreas, e vários tipos de objetos se tornam “Coisas”, é expectável que a limitação de recursos seja cada vez mais uma preocupação. Atualmente já existem muitos dispositivos que possuem recursos limitados por vários motivos, como a sua localização em locais difíceis ou remotos (ex: sensores implantáveis ou sensores de erupção vulcânica) ou necessidade de trabalhar enquanto estão em movimento (ex: dispositivos vestíveis). Assim sendo, a necessidade de usar-se os recursos de forma eficiente será cada ver maior. O objetivo primordial desta tese foi o de analisar a utilização de recursos por parte de uma aplicação IoT, considerando duas arquiteturas de software diferentes, implementada num dispositivo com poucos recursos. O dispositivo escolhido é um Raspberry Pi 4, dado ser um dispositivo embarcado bastante adequado para realização de testes. As arquiteturas que foram comparadas neste estudo foram: microsserviços e monolítica. Para garantir que os resultados não fossem específicos da linguagem utilizada, o desenvolvimento foi feito em três linguagens de programação: Go, Python e C++. Embora seja possível encontrar estudos que analisam como as linguagens de programação utilizam os recursos, apenas foi encontrado um estudo cujo foco é a eficiência energética, memória e tempo de execução em dispositivos com recursos limitados, não tendo sido encontrado nenhum estudo que compare o desempenho das arquiteturas de software em dispositivos com recursos limitados. A adoção de uma arquitetura de microsserviços em ambientes WoT/IoT tem vantagens, como modularidade, flexibilidade e facilidade de manutenção. Vários estudos referem que esta arquitetura é adequada para WoT/IoT, pois compartilha muitos dos mesmos objetivos. WoT/IoT é inerentemente dinâmico e tem muitos pontos de extremidade, o que pode apresentar desafios de desenho e implementação. Uma arquitetura como microsserviços pode explorar estas caracteristicas, transformando estes desafios em vantagens. No entanto, não foi encontrada investigação que compare o desempenho da arquitetura de microsserviços com a arquitetura monolítica, especialmente no contexto IoT, tendo sido este o foco desta tese. A escolha do protocolo de transferência de mensagens, para comunicação entre os vários microsserviços, foi também analisada. Um protocolo de transferência leve será o mais adequado, para dispositivos que têm recursos limitados, e três opções foram consideradas em mais profundidade: MQTT (Message Queuing Telemetry Transport), AMQP (Advanced Message Queuing Protocol) e CoAP (Constrained Application Protocol). Da análise feita, verificou-se que o MQTT é limitado na qualidade de serviço, seguranca e confiabilidade que oferece, isto quando comparado com o AMQP, sendo por isso um protocolo mais leve. Ao comparar-se MQTT e CoAP, verificou-se que ambos os protocolos oferecem vários benefícios, tendo o MQTT sido escolhido para os testes realizados. A abordagem técnica que foi adotada é descrita em detalhe, incluindo os componentes de hardware necessários para o projeto e o software necessário para a recolha de medições. Foi ainda delineada uma metodologia experimental, a qual foi seguida de perto. Foram obtidos resultados que permitem analisar em detalhe o consumo de energia, o tempo de execução e o consumo de memória. Quanto ao consumo de energia, em específico, recolhe-se o consumo de energia instantâneo máximo e o consumo de energia total. Desta análise verificou-se que o consumo de energia instantâneo máximo da arquitetura de microserviços foi, em média, e em todas as linguagens, 14.9% maior do que o consumo obtido para a arquitetura monolítica. Verificou-se também que a linguagem Go tem o maior consumo de energia instantâneo máximo, para ambas as arquiteturas, enquanto que o Python e o C++ tiveram medidas semelhantes. Os resultados para o consumo total de energia (durante o tempo de execução total) foram ligeiramente diferentes. Ao comparar-se as duas arquiteturas, deduziu-se que os valores de consumo de energia eram muito semelhantes e, em média, e em todas as linguagens, a arquitetura de microsserviços consumia apenas 3.0% a mais que a arquitetura monolítica. Também foi verificado que ao usar-se a arquitetura monolítica, o consumo total de energia era quase idêntico em todos as linguagens. Com a arquitetura de microserviços, o Python teve o maior consumo, seguido do Go e C++, embora os valores não tenham diferido muito. Também ficou claro que, embora o consumo de energia instantâneo máximo possa ser útil para entender os requisitos de energia de pico, não é diretamente proporcional ao consumo de energia total. Por exemplo, o Python teve o menor consumo de energia instantâneo máximo, mas o maior consumo de energia total. A segunda parte dos resultados considerou o desempenho no que diz respeito ao tempo de execução. Considerando apenas a arquitetura, verificou-se que a quitetura de microsserviços tinha um tempo de execução maior do que a arquitetura monolítica para Go e C++, enquanto o inverso era verdadeiro para o Python, o que pode estar relacionado com a otimizacao de simultaneidade vinculada à unidade central de processamento (CPU), pelas diferentes linguagens. Ao comparar o tempo de execução das linguagens de programacao, os resultados ficaram amplamente em linha com as expetativas. C++ teve o menor tempo de execução, seguido de perto pelo Go. O Python teve um tempo de execução significativamente mais longo, o que faz sentido já que o Python é a única linguagem interpretada que foi usada neste projeto. Foi interessante notar que o tempo de execução do Python foi muito maior ao usar-se uma arquitetura monolítica do que ao usar-se uma arquitetura de microserviços, o que não foi o caso do C++ ou Go. Com a arquitetura de microserviços, o Python teve um tempo de execução médio 319.4% maior do que o do C++, enquanto que o tempo de execuçao médio do Go foi 31.5% maior do que o do C++. Diferenças semelhantes foram observadas para a arquitetura monolítica. O consumo de memória foi medido usando três métricas diferentes: tamanho do conjunto residente (RSS) máximo, RSS total e uso de CPU. A comparação do RSS máximo, em cada arquitetura, mostrou que o RSS máximo para a arquitetura de microserviços foi 37.1% maior do que para a arquitetura monolítica. A diferença foi especialmente significativa para Python (65.9% de diferença). Verificou-se que o Go teve um RSS máximo significativamente maior do que as outras linguagens, para ambas as arquiteturas. O Python teve o menor RSS máximo na arquitetura monolítica, enquanto que o C++ teve o menor para a arquitetura de microserviços. Os resultados para o RSS total foram muito diferentes do RSS máximo, tanto por arquitetura como por linguagem usada. Mais concretamente, as medidas totais de RSS para Go e C++ nao diferiam muito por arquitetura, embora houvesse uma grande diferença quando comparado com o Python. Em média o RSS total foi 127.0% maior para a arquitetura monolítica do que para a arquitetura de microserviços, ao usar-se Python. Comparando por linguagem, o RSS total do Python foi significativamente maior do que para as outras duas linguagens, especialmente para a arquitetura monolítica, enquanto o Go e C++ tiveram medições RSS totais muito semelhantes. A última métrica de consumo de memória considerada foi o uso médio da CPU. Verificou-se que a arquitetura monolítica teve, em média, 14.9% maior utilização de CPU do que a arquitetura de microserviços, e a maior diferença foi observada para o Python. Uma comparação por linguagem mostrou que o Go teve a maior utilização de CPU, para ambas as arquiteturas. O C++ teve a segunda maior utilização de CPU, e o Python teve a menor utilização. Estas conclusões foram de encontro às expectativas, já que o Go tem processos integrados leves (rotinas Go), podendo otimizar a utilização de CPU. Esta dissertação produziu, em geral, resultados muito interessantes, uns mais esperados que outros. Os resultados mostraram que a arquitetura monolítica teve melhor desempenho na maioria das métricas, ou seja, consumo de energia instantâneo máximo, consumo de energia total (apenas para o Go e Python), tempo de execução geral (apenas para o Go e C++), RSS e CPU máximos. Deste modo, é possível concluir que ao implementar-se aplicações de pequena escala, em dispositivos IoT, a arquitetura monolítica pode oferecer mais benefícios. É bastante provável, no entanto, que a arquitetura de microserviços possa superar a arquitetura monolítica em aplicações de maior escala. A dimensão da aplicação deve, por isso, ser considerada ao escolherse uma arquitetura de software. Claramente, ainda existe muito espaço para contribuição nesta área de investigação. A investigação encontrada sobre o desempenho da arquitetura de microserviços, em comparação com a arquitetura monolítica, é limitafa e não foi encontrada investigação no contexto da IoT. Isto acaba por ser surpreendente, pois muitas empresas estão já a adotar microserviços e tem havido um aumento das pesquisas relacionadas com esta arquitetura. Assim sendo, compreender quais as vantagens e desvantagens desta arquitetura tornou-se muito pertinente. Embora esta dissertação tenha analisado a arquitetura de microsserviços, e tendo esta sido comparada com a arquitetura monolítica, considerando diferentes linguagens, a análise é feita numa escala relativamente pequena, quanto ao número de componentes de serviço, e num único dispositivo embarcado. A análise de aplicações de maior escala forneceria, certamente, perceções adicionais muito valiosas.Correia, N.SapientiaPlessis, Shani du2022-01-06T12:03:57Z2021-11-102021-11-10T00:00:00Zinfo:eu-repo/semantics/publishedVersioninfo:eu-repo/semantics/masterThesisapplication/pdfhttp://hdl.handle.net/10400.1/17440TID:202807592enginfo:eu-repo/semantics/openAccessreponame:Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)instname:Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informaçãoinstacron:RCAAP2023-07-24T10:29:37Zoai:sapientia.ualg.pt:10400.1/17440Portal AgregadorONGhttps://www.rcaap.pt/oai/openaireopendoar:71602024-03-19T20:07:25.500569Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos) - Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informaçãofalse
dc.title.none.fl_str_mv A comparative study of software architectures in constrained-device iot deployments
title A comparative study of software architectures in constrained-device iot deployments
spellingShingle A comparative study of software architectures in constrained-device iot deployments
Plessis, Shani du
Internet of Things
Resource-constrained devices
Software architecture
Microservices
Monolothic
Domínio/Área Científica::Engenharia e Tecnologia::Outras Engenharias e Tecnologias
title_short A comparative study of software architectures in constrained-device iot deployments
title_full A comparative study of software architectures in constrained-device iot deployments
title_fullStr A comparative study of software architectures in constrained-device iot deployments
title_full_unstemmed A comparative study of software architectures in constrained-device iot deployments
title_sort A comparative study of software architectures in constrained-device iot deployments
author Plessis, Shani du
author_facet Plessis, Shani du
author_role author
dc.contributor.none.fl_str_mv Correia, N.
Sapientia
dc.contributor.author.fl_str_mv Plessis, Shani du
dc.subject.por.fl_str_mv Internet of Things
Resource-constrained devices
Software architecture
Microservices
Monolothic
Domínio/Área Científica::Engenharia e Tecnologia::Outras Engenharias e Tecnologias
topic Internet of Things
Resource-constrained devices
Software architecture
Microservices
Monolothic
Domínio/Área Científica::Engenharia e Tecnologia::Outras Engenharias e Tecnologias
description Since its inception in 2009, the Internet of Things (IoT) has grown dramatically in both size and complexity. One of the areas that has seen significant developments is that of resourceconstrained devices. Such devices clearly require careful engineering in order to manage resources such as energy and memory, whilst still ensuring acceptable performance. A number of aspects play a critical role in the engineering of such systems. One such aspect is the choice of software architecture. The microservices architecture appears to be a promising approach for IoT, as suggested by a number of researchers. However, limited research has been done on the implementation of microservices in IoT and resource-constrained devices, and even less research has been done to compare the microservices architecture to the monolithic architecture in such deployments. The aim of this research thesis was to compare these two architectures in the context of IoT and constrained devices. The two architectures were compared by: energy consumption, runtime performance and memory consumption. To ensure that the results are not specific to a single programming language, each architecture was developed in three different languages: Go, Python and C++. Following a review of different asynchronous messaging protocols, Message Queuing Telemetry Transport was selected. The experiments were conducted on a Raspberry Pi 4, and a number of other hardware devices were used, including sensors, an actuator and a type C USB Tester. Two metrics were used to measure power consumption: maximum instantaneous power consumption and total power consumption. Whilst three metrics were used to measure memory consumption: maximum Resident Set Size (RSS), total RSS and central processing unit (CPU) resource usage. Each experiment was carried out 10 times in order to ensure data validity. The power consumption results showed that the microservices architecture had, on average, 14,9% higher maximum instantaneous power consumption, whilst the total power consumption of the microservices architecture was only 3,0% greater than that of the monolithic architecture. The runtime results indicated that the microservices architecture had a longer runtime than the monolithic architecture for Go and C++, whilst the inverse was true for Python. When considering memory consumption, it was found that the maximum RSS was 37,1% greater for the microservices architecture. The total RSS results for both architectures were very similar for Go and C++, whilst microservices performed much better for Python. Lastly, the results for CPU usage showed that the monolithic architecture had, on average, 14,9% greater CPU usage than the microservices architecture. It was concluded that, for small-scale applications, the monolithic architecture had better performance across most metrics and languages. It was, however,recommended that additional research be conducted on larger scale applications to determine the applicability of these results beyond the scope of small-scale applications. In general, there is still much room for research in this area.
publishDate 2021
dc.date.none.fl_str_mv 2021-11-10
2021-11-10T00:00:00Z
2022-01-06T12:03:57Z
dc.type.status.fl_str_mv info:eu-repo/semantics/publishedVersion
dc.type.driver.fl_str_mv info:eu-repo/semantics/masterThesis
format masterThesis
status_str publishedVersion
dc.identifier.uri.fl_str_mv http://hdl.handle.net/10400.1/17440
TID:202807592
url http://hdl.handle.net/10400.1/17440
identifier_str_mv TID:202807592
dc.language.iso.fl_str_mv eng
language eng
dc.rights.driver.fl_str_mv info:eu-repo/semantics/openAccess
eu_rights_str_mv openAccess
dc.format.none.fl_str_mv application/pdf
dc.source.none.fl_str_mv reponame:Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
instname:Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informação
instacron:RCAAP
instname_str Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informação
instacron_str RCAAP
institution RCAAP
reponame_str Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
collection Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos)
repository.name.fl_str_mv Repositório Científico de Acesso Aberto de Portugal (Repositórios Cientìficos) - Agência para a Sociedade do Conhecimento (UMIC) - FCT - Sociedade da Informação
repository.mail.fl_str_mv
_version_ 1799133318662324224