Juillet 2016

Volume 31, numéro 7

Cet article a fait l'objet d'une traduction automatique.

Le travail programmeur - comment être moyenne : Passer de MEAN à DEAN

Par Ted Neward | Juillet 2016

Ted NewardBienvenue à nouveau, MEANers. Ou, au lieu de cela, pour ce mois-ci, « DEAN » ers.

L’une des choses qui rend les conversations et architecture autour de la pile MEAN donc attrayant est que la pile MEAN est intrinsèquement flexible : vous pouvez remplacer les composants de la pile avec les autres, plus ou en moins-équivalent des parties et créer une nouvelle pile qui permettre répondre aux besoins d’entreprise/entreprise sans effet l’essence de l’architecture. En tant qu’une démonstration de ce concept, dans cet article je vais faire des essais avec remplacement MongoDB avec Microsoft Azure DocumentDB (par conséquent, « D » à la place de la lettre « M »).

MongoDB vs. DocumentDB

Pour ceux qui n’ont pas passé beaucoup de temps familiariser avec DocumentDB, je vous recommande vivement examiner certaines des ressources disponibles, y compris de la colonne de juin 2015 des Points de données de Julie existants (msdn.com/magazine/mt147238). Lerman offre une excellente présentation de DocumentDB, une de ses fonctionnalités plus intéressantes, notamment l’exécution de code côté serveur (Oui, comme dans les procédures stockées, écrit en JavaScript). Si vous n’avez jamais glanced à DocumentDB, ou une présentation rapide, faire une lecture rapide avant de continuer.

Sur la surface, MongoDB et DocumentDB sont des créatures similaire. Ils sont les deux bases de données orientées document, l’utilisation de JSON comme format de représentation sous forme de document principal. Chacun d’eux étend JSON afin d’incorporer certains types de données supplémentaires. Ils chacun réfléchir à des données en termes de collections de documents et l’utiliser comme modèle d’agrégation principal (au lieu de tables). Elles sont intrinsèquement » non relationnelles » dans la mesure où la base de données ne fait pas la vérification des identificateurs de document utilisé pour lier un document à un autre document. D’ailleurs, elles sont également à la fois « sans schéma, » le contenu d’un document est entièrement dans les mains du développeur et la même structure de document n’est pas appliquée sur tous les éléments d’une collection.

Par conséquent, ce doit être une simple permutation.

Cependant, à part quelques différences plus approfondies, que vous découvrirez un peu, immédiatement il existe une différence principale : Bien que MongoDB peut être téléchargé et exécuté localement hors tension d’un ordinateur portable, DocumentDB n’est disponible via un abonnement Azure, par conséquent, la première étape DEAN est la simple tâche de création d’une instance de DocumentDB sur un compte Azure. Cette opération est décrite dans d’autres éléments en détail (y compris dans la documentation de DocumentDB en ligne), donc je ne reviendrai pas ici le processus à l’exception au résumé. Accédez au portail de gestion, créez une ressource Azure DocumentDb, lui donner un nom unique (j’ai appelé mine dean-db) et introduire le gros bouton Créer bleu. Le portail sera évolution du quelques minutes et Azure créera votre instance de DocumentDB dans le cloud.

Avant que vous avez terminé avec le portail, il existe quelques éléments d’information que vous aurez besoin plus tard dans le code. Examinons quelques instants et noter maintenant. En particulier, vous aurez besoin de l’URL de connexion et la clé d’autorisation afin de garantir que vous. Dans le portail de gestion, on parle d’une clé primaire (il existe une clé secondaire appelée seconde) et le moment, il est affiché dans l’onglet tous les paramètres, sous les clés. Ces clés sont des secrets partagés, veillez à donner l’utilisateur, en particulier, si le code est dans un référentiel de code source publics (la GitHub), assurez-vous que la clé ne fait pas partie du code source archivé. (Par convention, applications Node.js configurer cela comme une variable d’environnement et le code de point d’entrée application permet de récupérer ce dans le cadre de son démarrage, que vous avez effectué similaires à celles-ci dans les itérations précédentes de cette base de code, donc cela ne doit pas être une surprise.) Si une clé est compromise de quelque façon (comme dans, vous découvrez que la clé d’une certaine manière rendait arrière en public), veillez à régénérer les clés et les remplacer. En fait, il est probablement judicieux de leur cycle de tous les 30 ou 60 jours seulement sur le principe.

Cela signifie que la config.js dans la base de code existante ressemble à présent Figure 1.

Figure 1 Config.js dans la Base de Code existante

module.exports = {
  mongoServer : "localhost",
  mongoPort : "27017",
  docdbServer : "https://dean-db.documents.azure.com:443/",
  docdbKey :
    "gzk030R7xC9629Cm1OAUirYg8n2sqLF3O0xtrVl8JT
      ANNM1zV1KLl4VEShJyB70jEtdmwnUUc4nRYyHhxsjQjQ=="
      };
if (process.env["ENV"] === "prod") {
  module.exports.mongoServer = "ds054308.mongolab.com";
  module.exports.mongoPort = "54308";
  module.exports.docdbServer = process.env["DOCDB_HOST"];
  module.exports.docdbKey = process.env["DOCDB_KEY"];
}

 (Par ailleurs, j’ai déjà changent les clés sur mon référentiel, afin d’afficher la clé ici est uniquement pour les afficher, pour vous donner une idée de ce à quoi il allez ressembler.)

Bonjour, à partir de Node.js

L’étape suivante est prévisible, vous avez besoin du module Node.js pour accéder à l’instance DocumentDB, et procéder à l’aide de « npm installer--enregistrer documentdb ». Naturellement, vous devrez « demander » dans le code app.js, comme suit :

var express = require('express'),
  bodyParser = require('body-parser'),
  debug = require('debug')('app'),
  edge = require('edge'),
  documentdb = require('documentdb'),
  ...;
// Go get our configuration settings
var config = require('./config.js');
debug("Mongo is available at ",config.mongoServer,":",config.mongoPort);
debug("DocDB is available at ",config.docdbServer);

À ce stade, ouverture d’une connexion est simplement de construction d’un objet DocumentClient à l’aide de la clé de serveur et d’autorisation, comme suit :

// Connect to DocumentDB
var docDB = documentdb.DocumentClient(config.docdbServer, {
  masterKey: config.docdbKey
});

À présent, bien sûr, la plus grande question est : Que faire avec ce dernier, une fois que vous l’avez ouverte ?

À l’aide de DocumentDB

Comme MongoDB, DocumentDB utilise un format JSON pour un schéma et des collections de documents, afin de stocker des données (par exemple, « présentations ») implique les mêmes types d’opérations comme vous l’avez vu avec MongoDB dans le passé. Toutefois, l’API est un peu différent, probablement en raison des différences culturelles entre Microsoft aime comment concevoir des choses et choses d’évoluent hors du monde open source.

(À propos, la référence DocumentDB/Node.js meilleures que j’ai trouvé jusqu'à présent est l’ensemble d’exemples sur la page de Documentation Azure [bit.ly/1TkqXaP]. C’est un ensemble de liens directs vers les projets exemples créés par Microsoft stockés sur GitHub, ainsi que des liens vers la documentation générée à partir de code source DocumentDB Node.js API, et à la place de quoi que ce soit plus officiel, j’ai utilisé il comme mon référence incontournable pour APIs DocumentDB.)

Pour commencer, une fois l’objet client de base de données est construite, vous devez vous connecter à la base de données en question à l’aide d’un databaseId ; Ceci est la base de données, à peu près de la même façon qu’un serveur MongoDB peut héberger plusieurs bases de données. Toutefois, contrairement à MongoDB, avec DocumentDB cette base de données doit être créé à l’avance. Cette opération peut être effectuée par programme (ce qui est idéal pour les démonstrations et les scénarios DevOps) via l’appel de l’API de createDatabase, ou via le portail de gestion (qui est probablement à l’approche la plus courante, étant donné qu’il s’agit généralement d’une opération isolée) à l’aide de l’onglet Ajouter une base de données dans la page de ressources DocumentDB. Par souci de simplicité, le code ici suppose que conferencedb une base de données existe déjà, sans doute créé précédemment dans le portail. En supposant que la base de données existe, Node.js peuvent se connecter à celui-ci en appelant queryDatabases, ce qui nous amène à la différence suivante dans l’approche des MongoDB et DocumentDB, comme indiqué dans Figure 2.

Figure 2 l’interrogation de DocumentDB pour obtenir la liste des bases de données

docClient.queryDatabases({
  query: 'SELECT * FROM root r WHERE r.id = @id',
  parameters: [
    {
      name: '@id',
      value: 'conferencedb'
    }
  ]}).toArray(function (err, results) {
  if (err) {
    handleError(err);
  }
  if (results.length === 0) {
    // No error occured, but there were no results returned
    // indicating no database exists matching the query           
    // so, explictly return null
    debug("No results found");
  } else {
    // Found a database, so return it
    debug('Found a database:', results[0]);
    var docDB = results[0];
  }
});

Tout d’abord, notez comment l’API DocumentDB utilise une explicite « spécification de la requête, « même pour l’extraction de la liste des bases de données, avec des paramètres. Il s’agit d’une différence d’approche de « requête par l’exemple » de Mongo. Accordé, clairement inutile d’utiliser cette — vous pouvez simplement faire population inline des arguments via la concaténation de chaînes — mais comme tout développeur qui a été victime d’une attaque d’injection SQL sera attester, les requêtes paramétrables à ceci sont beaucoup plus sûre.

La principale différence est, bien sûr, le langage de requête : hello, SQL, mon vieil ami. Pour être honnête, il est pas exactement SQL, car vous n’avez pas les tables, colonnes, etc., mais Microsoft est devenu beaucoup d’efforts pour adapter le langage de requête familier au monde orienté document. Il s’agit d’un « bogue » ou « caractéristiques » sont susceptibles de dépendent de relation d’amour ou détestent du développeur avec le monde de la base de données relationnelle, mais par ces (et autres) décisions, Microsoft est marquer clairement DocumentDB en tant que le choix de compromis entre SQL Server et MongoDB (ou d’autres bases de données de document) et qui n’est pas un bon emplacement pour être.

Une fois qu’une base de données est trouvé, vous devez obtenir la collection, à nouveau par identificateur. Comme les bases de données, les collections sont des choses « formels », ce qui signifie qu’ils doivent être créés soit explicitement à l’aide de l’appel d’API de createCollection ou via le portail de gestion. Étant donné la DocumentDB pense que des collections en tant que tables, il n’est pas surprenant. Là encore, la chose la plus simple à faire est de créer un via le portail en (à ce jour) en cliquant sur le nom de la base de données dans la vignette de bases de données dans la vignette de ressources DocumentDB. Cela fera apparaître un nouvel onglet, dans laquelle vous pouvez ajouter une nouvelle collection, des présentations et ensuite trouver via cet identificateur, comme dans Figure 3.

Figure 3 a trouvé une base de données ? Recherchez à présent les Collections

// We found a database
debug('Found a database:', results[0]);
docDB = results[0];
debug('Looking for collections:');
docClient.readCollections('dbs/conferencedb').
toArray(function(err, colls) {
if (err) {
  debug(err);
}
else {
  if (colls.length === 0) {
    debug("No collections found");
  }
  else {
    for (var c in colls) {
      debug("Found collection",colls[c]);
      if (colls[c].id === 'presentations')
        presentationColl = colls[c];
      }
    }
  }
});

Prenez note du premier paramètre à l’appel readCollections API ; s’il semble qu’il spécifie un type de chemin d’accès de type URL/URI à la base de données en question, il le devrait. Chaque appel à l’API DocumentDB Node.js utilise ces types d’identificateurs REST-ish pour simplifier l’extraction directement à la collection (et, finalement, document) sans avoir à naviguer dans une hiérarchie complexe.

(Notez qu’est très différent de MongoDB : Azure facture pour ses services sur une base par regroupement, par conséquent, où un utilisateur MongoDB pense que sur les regroupements à partir d’un point de vue purement modélisation avec DocumentDB, la décision de créer une nouvelle collection auront directement a d’impact sur les frais mensuels sont imputés.)

Enfin, pour rechercher des documents particuliers de la collection, vous utilisez l’API queryDocuments. Là encore, vous transmettez l’identificateur de la collection (qui, car vous savez que la collection que vous allez après, vous pouvez simplement incorporer directement dans le code) et utilisent les résultats à transmettre directement dans le corps JSON, comme je l’ai fait quelques colonnes pour MongoDB, comme indiqué dans Figure 4.

Figure 4 liste tous les Documents dans une Collection

var getAllPresentations = function(req, res) {
  debug("Getting all presentations from DocumentDB:");
  docClient.queryDocuments("dbs/conferencedb/colls/presentations",
  {
    query: "SELECT * FROM presentations p"
  }).toArray(function (err, results) {
    if (err) res.status(500).jsonp(err);
    else res.status(200).jsonp(results);
  });
};
// ...
app.get('/presentations', getAllPresentations);

Naturellement, si vous souhaitez limiter les présentations à un intervenant, qui serait être un paramètre de requête dans le cadre de la configuration d’itinéraire et serait deviennent un paramètre dans la spécification de requête et ainsi de suite.

Synthèse

Au début de cet article, j’ai cité comment MongoDB et DocumentDB sont similaires ; Toutefois, à ce stade, vous pouvez commencer à détecter qu’il existe en fait un nombre de différences entre les deux, par le biais de philosophie leur construction, si rien d’autre. Microsoft recherche clairement pour placer des « enterprise » dans le monde orienté document de base de données avec DocumentDB et sa base de clients, qui est un déplacement solid. Toutefois, une chose qui manque clairement (pour l’instant) est n’importe quel genre de « orientées objet » wrapper autour de l’API DocumentDB, à ce que Mongoose fournit à l’API de MongoDB Node.js. Ce n’est pas une chose compliquée aux développeurs de créer leurs propres, mais il représente plus de code qui déclare les développeurs doivent écrire et maintenir au fil du temps. Qui est au moins jusqu'à ce que la Communauté open source deux ports Mongoose, s’adapte pour utiliser MongoDB ou DocumentDB (probablement pas) ou jusqu'à ce que quelqu'un quelque chose de similaire à celui-ci, mais en génère un moyen plus spécialisé que le DocumentDB approche de durée de vie.

Plus important, cependant, est de comprendre que l’acronyme « Moyenne » est simplement que — un acronyme. DocumentDB représente la seule une douzaine de types d’outils de persistance qui pourrait être la fin d’une « * EAN »-pile de problèmes, y compris une bonne vieille de SQL Server. Où « Moyenne » ne correspond pas à vos normes de l’entreprise, personnel ou objectifs commerciaux, n’hésitez pas à remplacer l’élément incriminé avec quelque chose qui est plus conviviale. À la fin de la journée, suivant une architecture à la lettre (littéralement) qui crée des problèmes pour vous en tant que développeur ou à l’organisation dans son ensemble est simplement idiot.  Je n’ai pas d’espace pour l’instant... bon codage !


Ted Neward est mentor, conférencier et consultant de polytechnology basée à Seattle.  Il a écrit plus de 100 articles, est MVP F # et a rédigé et coécrit une dizaine d’ouvrages. Vous pouvez le contacter à l'adresse ted@tedneward.com si vous souhaitez qu'il vienne travailler avec votre équipe, ou vous pouvez lire son blog à l'adresse blogs.tedneward.com.

Merci aux experts techniques suivants d'avoir relu cet article : Shawn Wildermuth