Fermer

juin 21, 2018

Premiers pas avec Google Cloud Functions et MongoDB –


Cet article a été initialement publié le Code Barbarian . Merci de soutenir les partenaires qui rendent SitePoint possible.

Les architectures sans serveur deviennent de plus en plus populaires, et avec raison. D'après mon expérience, les cadres d'orchestration basés sur des conteneurs ont une courbe d'apprentissage abrupte et sont exagérés pour la plupart des entreprises faisant face aux consommateurs. Avec architectures FaaS comme AWS Lambda et Azure Functions en théorie, les seuls devops dont vous avez besoin est de regrouper et de télécharger votre application.

Cet article marchera à travers la configuration d'une fonction Google Cloud dans Node.js qui se connecte à MongoDB. Cependant, une limitation majeure des fonctions sans état est la nécessité d'établir une connexion de base de données distincte chaque fois que la fonction sans état fonctionne, ce qui entraîne une pénalité de performance majeure. Malheureusement, je n'ai pas réussi à comprendre comment réutiliser une connexion à une base de données dans Google Cloud Functions, l'astuce qui fonctionne pour IBM Cloud Azure Functions et AWS Lambda ne fonctionne pas pour Google Cloud Functions.

"Bonjour, monde" dans Google Cloud Functions

Accédez à la page de renvoi Google Cloud Functions et cliquez sur " Essayez-le gratuitement.

Cliquez sur l'icône représentant un hamburger dans le coin supérieur gauche de la fenêtre et trouvez le lien "Fonctions Cloud" dans la barre latérale, puis cliquez sur "Créer une fonction". ] Nommez votre fonction "hello-world" et laissez le reste des options dans le formulaire "Créer une fonction" inchangé. Laissez "Fonction à exécuter" comme "helloWorld", car cela doit correspondre au nom de la fonction que votre code exporte. Vous trouverez ci-dessous le code que vous devez entrer pour pouvoir confirmer la version de Node.js sur laquelle votre fonction s'exécute.

 exports.helloWorld = (req, res) => {
  res.send ('Bonjour de Node.js' + process.version);
}

Cliquez sur "Créer" et attendez que Google déploie votre fonction de cloud. Une fois votre fonction déployée, cliquez dessus pour afficher les détails de la fonction

Cliquez sur l'onglet "Trigger" pour trouver l'URL de votre fonction cloud.

Copiez l'URL et utilisez curl pour exécuter votre fonction cloud.

 $ curl https://us-central1-test21-201718.cloudfunctions.net/hello-world
Bonjour à partir de Node.js v6.11.5
$

Google Cloud Functions ne vous donne aucun contrôle sur la version de Node.js que vous utilisez, ils exécutent Node.js v6.11.5 actuellement. Vous ne pouvez pas utiliser async / await nativement sur Google Cloud Functions au moment d'écrire ces lignes

Connexion à MongoDB Atlas

Cliquez sur l'onglet "Source" dans les détails de la fonction et cliquez sur le bouton "Modifier". Vous remarquerez qu'il y a 2 fichiers dans votre code source, dont l'un est package.json . Éditez package.json pour faire correspondre le code ci-dessous.

 {
  "nom": "échantillon-http",
  "version": "0.0.1",
  "dépendances": {
    "co": "4.6.0",
    "mongodb": "3.x"
  }
}

Une fois le redéploiement effectué, Google Cloud installera automatiquement vos dépendances npm pour vous. Maintenant, modifiez votre index.js pour qu'il corresponde au code ci-dessous, en remplaçant le uri par votre MongoDB Atlas URI

 const co = require ('co ');
const mongodb = require ('mongodb');

const uri = 'ATLAS_URI_HERE';

exports.helloWorld = (req, res) => {
  co (fonction * () {
    client const = rendement mongodb.MongoClient.connect (uri);

    const docs = donne le client.db ('test'). collection ('tests'). find (). toArray ();
    res.send ('Résultat:' + JSON.stringify (docs));
  }). catch (erreur => {
    res.send ('Erreur:' + error.toString ());
  });
}

Cliquez sur "Enregistrer" pour déployer votre fonction. Une fois qu'il est déployé, vous devriez pouvoir boucler votre fonction de nuage et récupérer un document de MongoDB Atlas .

 $ curl https://us-central1-test21-201718.cloudfunctions.net/ Bonjour le monde
Résultat: [{"_id":"5a7b7df69d07887542605888","name":"Hello!","__v":0}]
$

À ce stade, vous devriez essayer de réutiliser la connexion à la base de données en utilisant la même astuce d'état globale qui fonctionne dans AWS Lambda et d'autres fournisseurs de fonctions cloud.

 const co = require ('co');
const mongodb = require ('mongodb');

const uri = 'ATLAS_URI_HERE';

// D'autres fournisseurs de cloud le conserveraient, mais pas Google Cloud
laisser client = null;

exports.helloWorld = (req, res) => {
  co (fonction * () {
    const reusedConnection = client! = null;
    if (client == null) {
      client = rendement mongodb.MongoClient.connect (uri);
    }

    const docs = donne le client.db ('test'). collection ('tests'). find (). toArray ();
    res.send ('Résultat:' + JSON.stringify (docs) + ', Réutilisé:' + réutiledConnection);
  }). catch (erreur => {
    res.send ('Erreur:' + error.toString ());
  })
}

Malheureusement, l'astuce de l'état global ne semble pas fonctionner dans Google Cloud.

 $ curl https://us-central1-test21-201718.cloudfunctions.net/hello-world
Résultat: [{"_id":"5a7b7df69d07887542605888","name":"Hello!","__v":0}]Réutilisé: faux
$
$ curl https://us-central1-test21-201718.cloudfunctions.net/hello-world
Résultat: [{"_id":"5a7b7df69d07887542605888","name":"Hello!","__v":0}]Réutilisé: faux
$

Moving On

FaaS est un paradigme puissant, mais les fonctions purement apatrides souffrent de limitations de performance quand il s'agit de bases de données car l'établissement d'une nouvelle connexion à la base de données est coûteux. La plupart des fournisseurs de services de cloud disposent d'un mécanisme permettant de conserver les connexions de base de données entre les appels de fonction, mais pas Google Cloud Functions. Cela limite considérablement la capacité de Google Cloud Functions à remplacer un serveur Web conventionnel.




Source link