Partager via


Tutoriel : Créer une application pilotée par les événements avec Dapr et MQTT broker

Dans cette procédure pas à pas, vous déployez une application Dapr sur le cluster. L’application Dapr consomme des données MQTT simulées publiées sur MQTT broker, applique une fonction de fenêtrage, puis publie le résultat sur MQTT broker. La sortie publiée représente la façon dont les gros volumes de données peuvent être agrégés sur la périphérie pour réduire la fréquence et la taille des messages. L’application Dapr est sans état et utilise le magasin d’états de MQTT broker pour mettre en cache les valeurs antérieures nécessaires pour les calculs de fenêtre.

L'application Dapr effectue les étapes suivantes :

  1. S’abonne à la rubrique sensor/data pour les données de capteur.
  2. Quand des données sont reçues sur la rubrique, elles sont publiées au magasin d’états de MQTT broker.
  3. Toutes les 10 secondes, il extrait les données du magasin d’états et calcule les valeurs minimale, maximale, moyenne, médiane et 75e centile sur les données de capteur horodatées au cours des 30 dernières secondes.
  4. Les données antérieures à ces 30 secondes sont expirées dans le magasin d’états.
  5. Le résultat est publié dans la rubrique sensor/window_data au format JSON.

Remarque

Ce tutoriel désactive Dapr CloudEvents, ce qui lui permet de publier et de s’abonner avec le protocole MQTT brut.

Prérequis

Déployer l’application Dapr

À ce stade, vous pouvez déployer l’application Dapr. L’inscription des composants ne déploie pas le binaire associé empaqueté dans un conteneur. Pour déployer le binaire avec votre application, vous pouvez utiliser un déploiement pour regrouper l’application Dapr conteneurisée et les deux composants ensemble.

Pour commencer, créez un fichier yaml qui utilise les définitions suivantes :

Composant Description
volumes.mqtt-client-token Le SAT utilisé pour authentifier les composants Dapr enfichables avec MQTT broker et le magasin d’états
volumes.aio-internal-ca-cert-chain Chaîne d’approbation pour valider le certificat TLS du MQTT broker
containers.mq-event-driven Conteneur d’application Dapr prédéfini.
  1. Enregistrez le yaml de déploiement suivant dans un fichier nommé app.yaml :

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: dapr-client
      namespace: azure-iot-operations
      annotations:
        aio-broker-auth/group: dapr-workload
    ---    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mq-event-driven-dapr
      namespace: azure-iot-operations
    spec:
      selector:
        matchLabels:
          app: mq-event-driven-dapr
      template:
        metadata:
          labels:
            app: mq-event-driven-dapr
          annotations:
            dapr.io/enabled: "true"
            dapr.io/inject-pluggable-components: "true"
            dapr.io/app-id: "mq-event-driven-dapr"
            dapr.io/app-port: "6001"
            dapr.io/app-protocol: "grpc"
        spec:
          serviceAccountName: dapr-client
    
          volumes:
          # SAT token used to authenticate between Dapr and the MQTT broker
          - name: mqtt-client-token
            projected:
              sources:
                - serviceAccountToken:
                    path: mqtt-client-token
                    audience: aio-internal
                    expirationSeconds: 86400
    
          # Certificate chain for Dapr to validate the MQTT broker
          - name: aio-ca-trust-bundle
            configMap:
              name: azure-iot-operations-aio-ca-trust-bundle
    
          containers:
          - name: mq-event-driven-dapr
            image: ghcr.io/azure-samples/explore-iot-operations/mq-event-driven-dapr:latest
    
  2. Déployez l’application en exécutant la commande suivante :

    kubectl apply -f app.yaml
    
  3. Vérifiez que l’application a été déployée avec succès. Le pod doit signaler que tous les conteneurs sont prêts après un court intervalle, comme indiqué avec la commande suivante :

    kubectl get pods -l app=mq-event-driven-dapr -n azure-iot-operations
    

    Avec la sortie suivante :

    NAME                         READY   STATUS              RESTARTS   AGE
    mq-event-driven-dapr         3/3     Running             0          30s
    

Déployer le simulateur

Simuler des données de test en déployant une charge de travail Kubernetes. Il simule un capteur en envoyant périodiquement des échantillons de lectures de température, de vibration et de pression au MQTT broker en utilisant un client MQTT sur la rubrique sensor/data.

  1. Déployer le simulateur à partir du référentiel Explorer Opérations IoT :

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/tutorials/mq-event-driven-dapr/simulate-data.yaml    
    
  2. Vérifiez que le simulateur s’exécute correctement :

    kubectl logs deployment/mqtt-publisher-deployment -n azure-iot-operations -f
    

    Avec la sortie suivante :

    Get:1 http://deb.debian.org/debian stable InRelease [151 kB]
    Get:2 http://deb.debian.org/debian stable-updates InRelease [52.1 kB]
    Get:3 http://deb.debian.org/debian-security stable-security InRelease [48.0 kB]
    Get:4 http://deb.debian.org/debian stable/main amd64 Packages [8780 kB]
    Get:5 http://deb.debian.org/debian stable-updates/main amd64 Packages [6668 B]
    Get:6 http://deb.debian.org/debian-security stable-security/main amd64 Packages [101 kB]
    Fetched 9139 kB in 3s (3570 kB/s)
    ...
    Messages published in the last 10 seconds: 10
    Messages published in the last 10 seconds: 10
    Messages published in the last 10 seconds: 10
    

Déployer un client MQTT

Pour vérifier que le pont MQTT fonctionne, déployez un client MQTT sur le cluster.

  1. Dans un nouveau fichier nommé client.yaml, spécifiez le déploiement du client :

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: mqtt-client
      namespace: azure-iot-operations
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: mqtt-client
      namespace: azure-iot-operations
    spec:
      serviceAccountName: mqtt-client
      containers:
      - image: alpine
        name: mqtt-client
        command: ["sh", "-c"]
        args: ["apk add mosquitto-clients mqttui && sleep infinity"]
        volumeMounts:
        - name: mqtt-client-token
          mountPath: /var/run/secrets/tokens
        - name: aio-ca-trust-bundle
          mountPath: /var/run/certs/aio-internal-ca-cert/
      volumes:
      - name: mqtt-client-token
        projected:
          sources:
          - serviceAccountToken:
              path: mqtt-client-token
              audience: aio-internal
              expirationSeconds: 86400
      - name: aio-ca-trust-bundle
        configMap:
          name: azure-iot-operations-aio-ca-trust-bundle
    
  2. Appliquez le fichier de déploiement avec kubectl :

    kubectl apply -f client.yaml
    

    Vérifiez la sortie :

    pod/mqtt-client created
    

Vérifier la sortie de l’application Dapr

  1. Ouvrez un interpréteur de commandes sur le pod client Mosquitto :

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  2. Abonnez-vous à la rubrique sensor/window_data pour observer la sortie publiée depuis l’application Dapr :

    mosquitto_sub -L mqtt://aio-broker/sensor/window_data
    
  3. Vérifiez que l’application génère un calcul des fenêtres glissantes pour les différents capteurs toutes les 10 secondes :

    {
        "timestamp": "2023-11-16T21:59:53.939690+00:00",
        "window_size": 30,
        "temperature": {
            "min": 553.024,
            "max": 598.907,
            "mean": 576.4647857142858,
            "median": 577.4905,
            "75_per": 585.96125,
            "count": 28
        },
        "pressure": {
            "min": 290.605,
            "max": 299.781,
            "mean": 295.521,
            "median": 295.648,
            "75_per": 297.64050000000003,
            "count": 28
        },
        "vibration": {
            "min": 0.00124192,
            "max": 0.00491257,
            "mean": 0.0031171810714285715,
            "median": 0.003199235,
            "75_per": 0.0038769150000000003,
            "count": 28
        }
    }
    

Facultatif - Créer l’application Dapr

Ce tutoriel utilise un conteneur prédéfini de l’application Dapr. Si vous souhaitez modifier et générer le code vous-même, suivez ces étapes :

Prérequis

  1. Docker : pour la création du conteneur d’applications
  2. Registre de conteneurs : pour l’hébergement du conteneur d’applications

Créer l’application

  1. Clonez le référentiel Explorer les opérations IoT :

    git clone https://github.com/Azure-Samples/explore-iot-operations
    
  2. Modification apportée au répertoire du tutoriel Dapr :

    cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
    
  3. Créez l’image Docker :

    docker build docker build . -t mq-event-driven-dapr
    
  4. Pour utiliser l’application dans votre cluster Kubernetes, vous devez envoyer (push) l’image à un registre de conteneurs tel qu’Azure Container Registry. Vous pouvez également envoyer (push) à un registre de conteneurs local tel que minikube ou Docker.

    docker tag mq-event-driven-dapr <container-alias>
    docker push <container-alias>
    
  5. Mettez à jour votre app.yaml pour extraire votre image nouvellement créée.

Dépannage

Si l’application ne démarre pas ou si vous voyez les conteneurs dans CrashLoopBackoff, le journal de conteneur daprd contient des informations utiles.

Exécutez la commande suivante pour afficher les journaux d’activité des pods :

kubectl logs -l app=mq-event-driven-dapr -n azure-iot-operations -c daprd

Étapes suivantes