Partilhar via


Recomendações para desenvolver aplicações prontas para produção

À medida que desenvolve aplicações para os seus dispositivos do Azure Sphere, existem vários aspetos a considerar que garantem que as suas aplicações estão prontas para produção. Este tópico inclui uma lista de verificação das melhores práticas para verificar se as aplicações estão prontas para implementação piloto ou de produção. Confirmar que estes itens estão concluídos pode reduzir o número de problemas que encontra na produção e facilitar o diagnóstico de quaisquer problemas que surjam.

Quando desenvolver uma aplicação do Azure Sphere, decida se será executada no HL (High-Level), no núcleo em Tempo Real (RT) ou num híbrido de ambos. As aplicações de alto nível são executadas em contentores no SO do Azure Sphere e as aplicações em tempo real (RTApps) são executadas em bare-metal ou com um sistema operativo em tempo real (RTOS) nos núcleos em tempo real.

As recomendações aqui fornecidas destinam-se a ajudá-lo a aumentar a qualidade e a produtividade nas suas aplicações prontas para produção. A lista de verificação abaixo fornece uma lista concisa de sugestões de design para ambos os tipos de aplicações, bem como considerações de design de soluções e noções básicas de codificação recomendadas, incluindo ligações para tópicos que abordam cada ponto mais detalhadamente. Estas sugestões derivam das nossas parcerias com os clientes, incluindo análises de campos, revisões de código e interações de suporte de aplicações implementadas em produção em soluções do mundo real e designs de dispositivos.

Noções básicas sobre codificação

  • Problemas comuns

    • Certifique-se de que as aplicações prontas para produção não utilizam conjuntos de ferramentas beta.
    • Ao filtrar o conjunto de API, utilize as ferramentas mais recentes do CMake e do Azure Sphere.
    • Para garantir a otimização e o tamanho completos do código, considere compilar os pacotes de imagens finais no Modo de versão antes de implementar uma aplicação para produção. Certifique-se de que cria e testa o Pacote de versão antes de o implementar.
    • Utilize uma política de avisos zero ao executar uma compilação completa para garantir que os avisos do compilador são endereçados intencionalmente.
    • Configure um pipeline CI/CD consistente e utilize uma estratégia de ramificação adequada.
  • Problemas relacionados com a memória

    • Sempre que possível, defina todas as cadeias fixas comuns como global const char* em vez de hard-coding, para que possam ser utilizadas como ponteiros de dados.
    • Se as estruturas de dados globais forem razoavelmente pequenas, considere dar comprimentos fixos aos membros da matriz em vez de utilizar ponteiros para alocar memória dinamicamente.
    • Evite a alocação de memória dinâmica sempre que possível.
    • Para funções que devolvem um ponteiro para uma memória intermédia, considere converter em funções que devolvem um ponteiro de memória intermédia referenciado e o respetivo tamanho relacionado para os autores da chamada.
  • Contentores dinâmicos e memórias intermédias

    • Considere utilizar uma abordagem de alocação incremental para contentores, como listas e vetores.

Sugestões de design de aplicações principais de alto nível

  • Noções básicas gerais

    • Inicialize e destrua corretamente todos os processadores após a saída ou o erro.
    • Utilize sempre códigos de saída.
    • Se uma aplicação detetar que está num estado irrecuperável e exigir um reinício, certifique-se de que é sempre processada como uma saída de aplicação "limpa", em vez de arriscar um estado de impasse.
    • Implemente o processamento e o registo de erros. Para obter mais informações, veja Processamento e registo de erros.
    • Utilize um temporizador do sistema como um cão de guarda para detetar se a aplicação está num estado irrecuperável ou num impasse (como impasse, memória esgotada ou conectividade que não está a recuperar apesar da lógica implementada) e efetuar uma recuperação adequada. Para obter mais informações, consulte Utilizar um temporizador do sistema como um cão de guarda.
  • Lidar com a simultaneidade

    • Utilize EventLoop sempre que possível.
    • Procure eficiência em tarefas simultâneas.
    • Avalie quando utilizar threads e âmbito apenas para tarefas específicas. Para obter mais informações sobre quando utilizar threads, veja Handling concurrency (Lidar com a simultaneidade).
  • Monitorização da conectividade

    • Implemente uma tarefa de verificação do estado de funcionamento de conectividade adequada com base numa máquina de estado robusta que verifica regularmente o estado da ligação à Internet.
    • Para soluções que requerem gestão de energia, desligue o chip do Azure Sphere após o envio de dados, controle o tempo de disponibilidade total e defina um temporizador de encerramento.
    • O cURL atualizou recentemente o comportamento de chamada de retorno e as melhores práticas. Embora o Azure Sphere tenha envidado esforços para garantir que as versões mais antigas do comportamento cURL continuam a funcionar conforme esperado, recomenda-se que siga as orientações mais recentes sobre segurança e fiabilidade ao utilizar curl_multi, uma vez que a utilização de chamadas de retorno recursivas pode resultar em falhas inesperadas, falhas de conectividade e potenciais vulnerabilidades de segurança. Se um TimerCallback for acionado com um tempo limite de 0 ms, trate-o como um tempo limite de 1 ms para evitar chamadas de retorno recursivas. Certifique-se de que também chama curl_multi_socket_action explicitamente pelo menos uma vez após as chamadas para curl_multi_add_handle.
  • Gestão e utilização de memória

    • Controle a utilização da memória da aplicação com as APIs de SO do Azure Sphere e garanta que as aplicações reagem adequadamente a uma utilização inesperada da memória.

Sugestões de design de aplicações principais em tempo real

  • Ative o temporizador mt3620 watchdog para detetar o impasse e implementar a lógica de recuperação adequada.
  • Implemente comunicações entre núcleos para aplicações HL-core e RT-core híbridas.

Considerações de conceção de soluções

  • Requisitos de conectividade e resolução de problemas

    • Certifique-se de que todos os pré-requisitos de rede são cumpridos. Para obter mais informações, veja Requisitos de conectividade e resolução de problemas.
    • Resolva problemas OSNetworkRequirementCheck-HLApp de conectividade com o e OSNetworkRequirementChecker-PCo .

Para obter mais itens a considerar ao mover uma solução de IoT para um ambiente de produção, veja Mover uma solução de IoT do teste para a produção.