33 votes

Firebase Cloud Functions - réponse lente lors de l'interrogation de Firestore

J'ai une simple fonction Cloud dans Firebase qui prend JSON dans un POST http et l'enregistre dans une collection Firestore. Elle dispose de 512 Mo de mémoire.

Les performances de cette fonction cloud sont très médiocres. Si elle est exécutée en continu, l'aller-retour varie de 200 à 600 ms et si elle est exécutée rarement (toutes les 5 à 10 minutes), elle peut prendre de 4 à 10 secondes. Je comprends le problème du démarrage à froid, mais sur AWS, je n'ai jamais vu un démarrage à froid aussi lent, ni aussi fréquent.

Mon code est ci-dessous - j'apprécierais toute idée sur la manière d'accélérer les performances.

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();

const express = require('express');
const bodyParser = require("body-parser");
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// CORS Express middleware to enable CORS Requests.
const cors = require('cors');
app.use(cors({ origin: true }))

app.post('/submitResponse', (req, res) => {
  console.log('/submitResponse');

  if (!req.body.info)
    res.status(422).send()

  const payload = req.body.info;
  console.log(payload);

  const responses = db.collection("responses")

  responses.add({
    payload: payload,
    timestamp: admin.firestore.FieldValue.serverTimestamp()
  }).then(function(docRef) {
    console.log("Response written with ID: ", docRef.id);
    res.status(200).send(JSON.stringify(docRef.id))
  })
  .catch(function(error) {
      console.error("Error adding document: ", error);
  });
});

exports.app = functions.https.onRequest(app);

1 votes

N'oubliez pas que Cloud Functions et Cloud Firestore sont tous deux en version bêta et ne donnent aucune garantie de performance. Je suis sûr que si vous comparez les performances avec Realtime Database, vous obtiendrez de meilleurs résultats.

0 votes

Merci pour votre réponse, Doug. Donc : (1) Serait-il juste de dire qu'il s'agit d'une performance normale pour la version bêta ? (2) Y a-t-il quelque chose que je fais qui provoque une lenteur anormale ? (3) Est-il possible d'influencer les démarrages à froid ?

0 votes

Je ne pense pas que vous fassiez quelque chose de mal. J'ai personnellement remarqué que le délai d'exécution est parfois rapide et parfois moins, donc je ne peux pas vraiment dire ce qui est "typique". L'équipe Firebase travaille activement sur ce sujet.

2voto

Dennis Alund Points 980

S'adresser à quelques commentaires : au moment de la rédaction du présent document Cloud Firestore pour Firebase est en fait toujours en version bêta .

Firestore is in Beta

Mais Firestore n'est probablement pas le coupable dans ce cas. Le temps de démarrage à froid de la fonction cloud éclipse très probablement toute opération de base de données que vous avez.

Les fonctions de l'informatique en nuage ont besoin de temps pour créer de nouvelles instances chaque fois que vous avez besoin d'aide.

  1. Déploiement de nouvelles fonctions / première invocation
  2. L'instance a été recyclée
  3. Augmentation de l'échelle pour faire face à la charge (demande frappant une nouvelle instance)

Il y a un section sur les performances de la fonction "nuage" (Cloud Function) qui mentionne les gains potentiels que vous pouvez réaliser en minimisant les dépendances de vos modules.

Les fonctions étant sans état, l'environnement d'exécution est souvent initialisé à partir de zéro (au cours de ce que l'on appelle un démarrage à froid). Lors d'un un démarrage à froid se produit, le contexte global de la fonction est évalué.

Si vos fonctions importent des modules, le temps de chargement de ces modules peut ajouter à la latence d'invocation lors d'un démarrage à froid. Vous pouvez réduire ce temps de latence, ainsi que le temps nécessaire pour déployer votre fonction, en en chargeant correctement les dépendances et en ne chargeant pas les dépendances que votre n'utilise pas.

Découvrez également l'impressionnant Vidéo de Cloud Performance Atlas sur le sujet qui mentionne des conseils tels que

  • Réduire les dépendances des bibliothèques
  • Utiliser les versions les plus populaires d'un paquet, car elles sont plus susceptibles d'être déjà mises en cache.
  • Chargement paresseux des modules non critiques au démarrage

Dans le cas des dépendances de bibliothèque, le plus simple est de se débarrasser des dépendances qu'il est possible d'implémenter soi-même et/ou qui n'utilisent qu'une ou quelques fonctions mais nécessitent toute la bibliothèque (je te regarde, lodash).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X