Truck Tracker: um padrão de IoT utilizando o OpenShift e outros serviços IBM Cloud

Combinando os serviços IBM Cloud para produzir uma variedade de insights

O Truck Tracker é um serviço que recebe dados de frotas de caminhões durante seus percursos pelo país. Pode ser qualquer dado (por exemplo, consumo de combustível, detalhes do motorista, temperatura ambiente ou qualquer outra coisa que possa ser medida enquanto você navega). Aqui, utilizaremos o ID e a posição do caminhão (coordenadas de latitude e longitude). O Truck Tracker coloca os dados em vários armazenamentos de dados e mostra a posição atual dos caminhões no mapa.

Alguns usuários do aplicativo precisam desses dados para a execução de análises. Por exemplo, quando é necessário saber quantos quilômetros a frota percorreu nas últimas 24 horas e qual foi o consumo de combustível. Para isso, todos os pontos de dados podem ser colocados em um armazenamento de documentos confiável, como o IBM Cloudant, sendo possível também fazer procuras e agregações de acordo com a necessidade. O IBM Cloudant é um banco de dados distribuído e totalmente gerenciado, otimizado para cargas de trabalho intensas e para lidar com aplicativos móveis e da web de rápido crescimento.

Outros usuários podem precisar saber a localização exata atual dos caminhões. Para isso, basta saber a última posição conhecida de cada caminhão. Nesse caso, o Redis é a solução perfeita — um produto que permite o rápido armazenamento de pares de chave/valor, em que uma chave é o ID exclusivo do caminhão e o valor é a última posição conhecida.

O IBM Cloud® Databases for Redis é um armazenamento de estrutura de dados em memória totalmente gerenciado, que pode ser usado como banco de dados, como cache e como broker de mensagens.

É possível que os dados possam ser usados de outras formas, embora ainda desconhecidas, que exijam que o acesso ou o armazenamento sejam feitos de maneiras diferentes.

Enquanto percorrem todos os cantos do país, seus caminhões fornecem todo tipo de dados. Como é possível garantir que cada usuário receba os dados de que precisa? Acesse o IBM Event Streams, uma plataforma de transmissão de eventos que auxilia na construção de aplicativos inteligentes, que reagem instantaneamente aos eventos . Este é um serviço totalmente gerenciado, baseado no Apache Kafka de software livre.

Com o Event Streams, é possível receber os dados dos caminhões (produtores de dados) e, em seguida, encaminhá-los para os vários aplicativos nos quais serão utilizados (consumidores de dados).

Por fim, pode ser necessário executar o serviço do Truck Tracker em algum outro local e, para isso, é possível usar o Red Hat OpenShift on IBM Cloud, que permite conteinerizar e implementar de forma rápida e segura as cargas de trabalho corporativas em clusters Kubernetes. Fornecemos um cluster do Red Hat OpenShift on IBM Cloud, implementamos nele nossos aplicativos e os disponibilizamos para os serviços de banco de dados que precisam acessá-los. Também criamos um aplicativo voltado ao público, que permite a visualização dos caminhões em um mapa. Leia mais sobre Red Hat OpenShift on IBM Cloud.

O que será construído

Este é o sistema de alto nível que construiremos.

A
Truck Tracker*A solução Truck

Em um cenário real, os geradores de dados (os dispositivos de IoT dos caminhões) teriam que encontrar uma maneira de se comunicar com o aplicativo Event Streams, provavelmente usando o protocolo MQTT. Faremos uma simulação em que os caminhões percorrem o país e enviam dados por meio de um script (producer.js), que fornecerá a localização do caminhão a cada segundo, a partir da leitura de um conjunto predefinido de pares de dados de latitude/longitude referentes a alguns "percursos" (LAToDallas.json e boulderToNYC.json) e enviará esses dados para o Event Streams.

Este tutorial leva cerca de uma hora para ser concluído. Ele tem custos, pois alguns dos serviços IBM utilizados não oferecem um nível gratuito, mas se os serviços forem cancelados após a conclusão do tutorial, o gasto não deve ser superior a alguns poucos dólares.

O que você precisará

Antes de iniciar, recomenda-se a instalação de algumas ferramentas de produtividade necessárias:

  • Uma conta pré-paga da IBM Cloud (certifique-se de efetuar login em sua conta.)
  • A CLI da IBM - a interface de linha de comandos que permite a interação com a API da IBM. É necessário certificar-se de que os plug-ins a seguir estejam disponíveis:
    • openshift (oc)
    • registro de contêiner (cr)
  • Certifique-se de ter acesso a um terminal Mac ou Linux.
  • A CLI do Kubernetes - uma interface de linha de comandos para a execução de comandos em clusters Kubernetes.
  • Terraform - automatiza o fornecimento de recursos
  • Docker Utilizaremos o Docker para a criação das imagens que executarão o código no cluster — certifique-se de efetuar login em sua conta do Docker
  • jq - um processador JSON de linha de comandos leve e flexível
  • Git - um sistema de controle de versão distribuído de software livre e gratuito
  • Node.js e npm

Instruções passo a passo

Etapa 1: obtenha uma chave de API para implementar a infraestrutura em sua conta

Siga as etapas neste documento para criar uma chave de API e anote-a, para utilizá-la na Etapa 2.

Etapa 2: clone o repositório e o cd no diretório do Terraform

git clone https://github.com/IBM-Cloud/truck-tracker.git
cd truck-tracker/terraform

Crie um documento chamado terraform.tfvars com os seguintes campos:

ibmcloud_api_key = "<YOUR_API_KEY_FROM_STEP_1>"
region = "eu-gb"
redis_password  = "<MAKE_UP_A_PASSWORD>"

O documento terraform.tfvars contém variáveis que você talvez queira manter em segredo, portanto, ele é ignorado pelo repositório GitHub.

Etapa 3: crie a infraestrutura

TL;DR — execute o script Terraform:

terraform init
terraform apply --auto-approve

A pasta do Terraform contém vários scripts simples:

  • main.tf informa ao Terraform que utilize o IBM Cloud.
  • variables.tf contém as definições de variáveis cujos valores serão preenchidos a partir de terraform.tfvars.
  • cloudant.tf cria um DB Cloudant padrão e algumas credenciais que, posteriormente, serão usadas para acessá-lo.
  • redis.tf cria a instância do Redis e algumas credenciais que, posteriormente, serão usadas para acessá-lo.
  • eventstreams.tf cria a instância do Event Streams e algumas credenciais que, posteriormente, serão usadas para acessá-lo.
  • registry.tf cria o Container Registry no qual ficarão as imagens de contêiner.
  • iam.tf cria a chave de acesso necessária para a interação com o Container Registry.
  • vpc.tf cria a infraestrutura de VPC (Virtual Private Cloud) necessária para a implementação de um cluster OpenShift. Isso inclui um VPC, sub-redes e gateways públicos em três zonas de disponibilidade diferentes.
  • cos.tf cria uma única instância do Cloud Object Storage, utilizada pelo OpenShift para o gerenciamento do cluster.
  • openshift.tf cria um cluster de máquinas virtuais dentro do VPC, no qual serão implementados os aplicativos.

São necessário vários minutos para que os bancos de dados e outros recursos fiquem prontos, mas, depois desse período, haverá alguns recursos de VPC, um cluster de máquinas virtuais, uma instância do IBM Cloud® Databases for Redis, um banco de dados Cloudant e uma instância do Event Streams em sua conta, bem como um namespace do Container Registry para as imagens de contêiner. Para conferir esses itens, visite a seção Recursos da conta do IBM Cloud.

Etapa 4: crie imagens de contêiner e implemente-as no OpenShift

A partir daqui, toda a infraestrutura está pronta para receber dados. Agora, é necessário construir e implementar os diferentes módulos que produzirão e consumirão os dados, bem como o aplicativo que exibirá a posição do caminhão no mapa.

Execute o script de construção — mas, antes disso, você está conectado à CLI do IBM Cloud e ao Docker?

Acesse a raiz do projeto e digite o seguinte:

./build.sh

Etapa 5: acompanhe as viagens de seus caminhões

Ao final do script, será gerada uma URL — semelhante a https:// some.thing.eu-gb.appdomain.cloud.

Ao acessar a URL gerada, é possível ver um mapa dos EUA e, depois de alguns segundos, haverá no mapa vários marcadores, representando seus caminhões:

caption-side=bottom"
O Truck Tracker Wide

Ao aumentar o zoom em um desses marcadores, você verá a movimentação dele no percurso. Como gerente da frota, você agora sabe onde estão todos os seus caminhões.

caption-side=bottom"
O Truck Tracker Zoom

O que foi feito

O script build.sh

O script build.sh executa diversas ações:

  1. Ele constrói uma imagem do Docker para cada um dos serviços necessários. O produtor, os consumidores e o aplicativo da web ficam todos em pastas diferentes. Cada pasta possui seu próprio arquivo Dockerfile simples, usado pelo script para a criação de uma imagem de contêiner, que é, então, transferida por upload para o IBM Container Registry.
  2. Ele cria vários segredos do Kubernetes com todas as credenciais que serão necessárias para acessar os diferentes serviços IBM (IBM Cloudant, Redis e Event Streams).
  3. Ele também implementa o código do aplicativo (e os segredos) no cluster do Red Hat OpenShift on IBM Cloud, usando as instruções contidas no script deployment.yml.

O script deployment.yml

Esse script orienta o Openshift quanto ao que deve ser implementado nas máquinas contidas no cluster do Openshift. Em nosso caso, devem ser implementados:

  1. Produtores de dados (trucktrackerproducer*).
  2. Consumidores de dados (trucktrackerredisconsumer e trucktrackercloudantconsumer)
  3. Aplicativo da web (trucktrackerweb)

Em todos os casos, obtém-se uma imagem do registro de contêiner e algumas variáveis de ambiente que possuem as credenciais necessárias para acessar os serviços externos.

O sistema Truck Tracker

O sistema Truck Tracker é um conjunto de scripts Node.js simples que usam quatro pacotes principais:

  1. @ibm-cloud/cloudant para a conexão com o IBM Cloudant e para a leitura/gravação de dados.
  2. Redis para a conexão com a instância do Redis e para a leitura/gravação de dados.
  3. kafkajs para a conexão com a instância do Event Streams.
  4. Express, que ativa um servidor da web simples, por meio do qual é possível interagir com os dados.

Há cinco arquivos principais:

  1. server.js: executa o servidor da web e se comunica com o Redis. Ele recebe chamadas regulares do front-end para a rota /data. Ele se conecta ao Redis, faz download de um objeto com o ID e a posição de cada caminhão e devolve esses dados para o front-end.
  2. index.html: esta é a única e exclusiva página do aplicativo de front-end. Depois de carregado, ele mostra um mapa dos EUA, fornecido pelo incrível serviço Open Street Map. Em seguida, ele entra em um loop de cinco segundos, durante o qual faz uma solicitação de HTTP para o backend (server.js), recupera todos os caminhões e suas posições, conferindo e representando a posição mais recente de cada caminhão no mapa. Para cada caminhão, há um marcador de mapa, cujos dados de latitude/longitude são atualizados a cada ciclo.
  3. producer.js: são utilizados um arquivo de local e um truck_id da chamada de script e, em seguida, todos os pontos de dados no arquivo de local são verificados. Cada ponto de dados é transformado em uma mensagem, contendo o ID do caminhão e seus dados de latitude/longitude, e que é postada uma vez por segundo no Event Streams. Para deixar tudo mais interessante, ele seleciona um ponto de início aleatório ao longo da rota, faz uma curva e volta assim que atinge o final do arquivo de local.
  4. cloudantConsumer.js: este script cria um banco de dados do Truck Tracker no Cloudant, caso ainda não haja um e, em seguida, consulta regularmente o Event Streams para obter mais dados. Assim que são recebidos, os dados são gravados em massa no Cloudant.
  5. redisConsumer.js: este script consulta regularmente o Event Streams para a obtenção de dados. Assim que são recebidos, os dados são gravados em um "hash" do Redis, em que a chave de hash é o ID do caminhão e o valor são os dados do caminhão (latitude/longitude). Este acordo de hash permite que todos os dados do caminhão sejam enviados de uma só vez pelo script server.js. Um aspecto interessante é que, se por algum motivo um dos consumidores travar, ele será reiniciado a partir do ponto em que parou, sem perda de dados, pois o Event Streams sabe qual foi o último ponto de dados fornecido a cada consumidor. Essa separação entre os sistemas de produção de dados e os sistemas de consumo de dados é uma boa prática de design, que aumenta a resiliência e a tolerância a falhas.

Resumo

Neste tutorial, combinamos diversos serviços IBM para modelar um padrão realista de IoT, em que dispositivos com acesso à Internet instalados em caminhões produzem dados que são consumidos por vários aplicativos para diferentes propósitos.

Em razão da natureza gerenciada de todos esses serviços, como desenvolvedor de aplicativos, você pode se concentrar na solução de seus problemas de negócios, deixando para nós a parte pesada que é o gerenciamento da infraestrutura, economizando, assim, um tempo longo e valioso de trabalho, que seria gasto em atividades secundárias, como fornecimento do servidor, implementação de software, aplicação de correções, definição de segurança, entre outras.

Caso tenha seguido esse tutorial, lembre-se de cancelar o fornecimento da infraestrutura, para interromper a cobrança de encargos. Em seu terminal, faça o seguinte:

cd terraform/
terraform destroy

Se quiser dar o próximo passo em sua jornada como desenvolvedor, confira algumas de nossas ofertas para versões de teste.