為云而生的MongoDB Atlas
譯文【51CTO.com快譯】多年來,各大平臺相繼意識到,光靠基于SDK連接器的本地單一數據庫,是難以構建出整套應用平臺的。因此,我們往往需要面向未來的數據庫即服務(Database-as-a-Service,DaaS),作為云原生的解決方案,通過API連接到各類用戶端。與此同時,針對非SQL的數據庫結構,我們創建并普及了NoSQL的相關概念。如今,市場上已有著許多基于NoSQL的數據庫,其中包括:鍵值類、文檔類、柱狀、以及圖形數據庫等。雖然有CouchBase作為強有力的競爭對手,但是MongoDB仍然是目前文檔類數據庫領域的佼佼者。實際上,作為一個通用的、基于文檔的分布式數據庫,MongoDB就是專為云端應用而開發構建的。
就像JDBC連接器可以協助將Java程序連接到關系型數據庫的RDBMS上一樣,目前已有多種語言和框架,為MongoDB構建了開箱即用的連接器。例如,MEAN(MongoDB、Express、AngularJS、Node.js)或MERN(MongoDB、Express、ReactJS、Node.js)棧中的一個關鍵組件—Mongoose,便可以作為NodeJS中的一個模塊,并能通過npm來獲取。
在本文中,我們將重點討論服務于分布式應用和云端數據庫的MongoDB Atlas平臺,并以實例的形式,了解它是如何協助開發者構建出云原生的且快捷的應用服務棧。
MongoDB Atlas的主要功能
1. 它是一個基于云端的純數據庫,用戶在線完成注冊后,可以獲得其大量服務。
2. 由于Atlas支持基于純API式的通信方式,因此消費者端可以通過多種身份驗證和授權機制(如:基本的身份驗證、oAuth2等),通過標準的REST接口,去調用數據庫。
3. 其GraphQL功能可以通過API進行查詢。也就是說,用戶可以通過從底層數據庫架構自動生成架構,去輕松地為其端點設置API。
4. 諸如NodeJS應用和Gatsby的JAMStack平臺框架,都能夠通過Atlas的連接器連接到MongoDB上。
5. 它可以通過提供多種與管理相關的服務,來治理目標數據庫。
6. 它可以通過主、備服務器的方式,為集群提供多(跨)區域的可用性。
7、在保留了文檔數據庫核心能力的同時,它在云服務之上增加了一個核心應用服務層—Realm,并通過提供一個名為MongoDB Stitch的框架,來集成多個消費者端(如:Web應用、fat programs、以及其他云原生應用程序等)。它們都能夠通過該層面連接到MongoDB上,并進行數據交換。
8. 它通過被稱為“觸發器”的概念,提供基于事件的集成。也就是說,“觸發器”可以通過觸發事件,以傳遞給其他發布者和注冊相同的消費者端。
9. 它提供了一種無服務器的編程模型,可以使用Python、JavaScript等編碼語言,將代碼片段嵌入到“功能函數”中,并使其成為功能即服務(Function-As-A-Service,FaaS),以支持低代碼模式(low code pattern)。
10. MongoDB可以通過電子郵件或短信的連接方式,與多個第三方(如,Twilio的本地連接器)進行通信。
11. 它提供基于角色安全的數據庫訪問和管理。
12. 它能夠根據分析和報告目,去創建圖表。
開發示例
在新冠疫情的當下,我們使用MongoDB Atlas進行開發,并使用Gatsby作為JAMStack平臺,構建一個響應式的簡單Web應用程序。它可以被用來搜索和顯示諸如:醫院病床、氧氣瓶、政府聯系電話、以及志愿者等重要信息。所有的數據都會以協作的方式被保存在Google Sheet中。
作為一名Gatsby新手,為了避免開發中出現繁瑣的頁面和集成,我使用了Google App Script和MongoDB Atlas,來輕松地選擇和構建客戶端和數據庫應用。由于Atlas帶有易于配置的集群、集合、以及拼接服務(stitch service),因此GraphQL在MongoDB上設置和構建整個應用程序的效率,比為自定義應用去構建樣板代碼(boiler-plate code),要快得多。當然,您也可以使用諸如Lambda、DynamoDB、Cognito、GraphQL API之類的服務,在AWS平臺上構建類似的應用。整個應用示例的邏輯,如下圖所示。
下面是一些關鍵性的代碼片段。
Google Sheet的各種應用腳本
在Google Sheet的“工具”菜單或客戶端上,請點擊“腳本編輯器”,以編寫 Google應用腳本。如果您在Google Sheet中已經完成了如下JavaScript代碼的添加或修改,那么請直接單擊“運行”按鈕。
- ***** Export the events from the sheet to a MongoDB Database via Stitch****/
- function exportEventsToMongoDB()
- {var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
- var sheet = spreadsheet.getSheetByName("Data");
- var headerRows = 1; // Number of rows of header info (to skip)
- var range = sheet.getDataRange(); // determine the range of populated data
- var numRows = range.getNumRows(); // get the number of rows in the range
- var data = range.getValues(); // get the actual data in an array data[row][column]
- Logger.log(JSON.stringify(data));
- for (var i=headerRows; i<numRows; i++)
- {var date_updated = Utilities.formatDate(new Date(data[i][5]), "GMT", "yyyy-MM-dd");
- // Make a POST request with form data.
- var formData = {'location': data[i][0],
- 'links': data[i][1],
- 'hospital': data[i][2],
- 'available_bed': data[i][3],
- 'number': data[i][4],
- 'date': date_updated,
- 'commentes': data[i][6],
- 'type': data[i][7]};
- var options = {'method' : 'post','payload' : formData};
- if (true) {// Call the API from MongoDB Atlas
- var insertID = UrlFetchApp.fetch('https://<<MongoDB Stitch API endpoint>>-mejsg/service/GetCOVID19Data/incoming_webhook/webhook0', options);
- }
MongoDB Atlas的開發步驟
在MongoDB中,請依次執行以下步驟:
1. 創建集群 -> 集合。此處的集合中已保存有數據模式(data schema)。
2. 設置訪問數據庫的角色。
3. 在Atlas的Realm空間中,編寫一個將在此集合中輸入數據的第三方服務,以作為Webhook角色,進而創建各種所需的日志記錄和授權訪問。為了實現從Google App Script處調用API,我們還需要創建一個POST API,來插入相關信息。
4. 從Atlas集合中創建一個可用于查詢數據的GraphQL API。由于GraphQL是在Atlas的Realm下被創建的,因此它將提供可選擇數據庫和集合的接口,以及生成待部署的模式,以供客戶端使用。
5. 您可以像Solr或ElasticSearch索引那樣,創建帶有集合數據的搜索索引,以實現更快的導航。
如下是webhook的相關JavaScript代碼段:
- exports = async function(payload) {
- const mongodb = context.services.get("mongodb-atlas");
- const eventsdb = mongodb.db("data");
- const eventscoll = eventsdb.collection("data");
- const result= await eventscoll.insertOne(payload.query);
- var id = result.insertedId.toString();
- if(result) {
- return JSON.stringify(id,false,false);
- }
- return { text: `Error saving` };
- }
如下代碼段則是配套的JSON文檔:
- _id:609d81b3c37d0e43541a0b20
- location: "Kolkata"
- hospital: ""
- type: "Oxygen"
- commentes : "Oxygen support for patients"
- date: "2021-05-07"
- number : "91-1111111111"
- available_bed: ""
- links : ""
您可以通過創建一個Twilio帳戶,并使用Twilio服務發送簡單的消息短信(SMS)。同時,您也可以使用如下JavaScript代碼段的功能函數(function),來執行任務。
- exports = function(changeEvent) {
- const twilio = context.services.get("SendSMS");
- return twilio.send({
- to: "919999999999",
- from: "19990009999",
- body: "Hello from Realm!"
- });
- };
Gatsby的設置
Gatsby為初學者提供了一個非常簡單便捷的設置過程。我們可以事先通過npm的方式,下載并設置其對應的代碼包,然后通過更改gatsby-config.js文件,以添加MongoDB與GraphQL查詢之間的連接模塊。此外,我們可以修改index.js頁面,編寫ReactJS代碼,并使用GraphQL查詢與響應,來呈現相關數據。當然,我在查找Gatsby是如何緩存GraphQL響應時,以及每次在MongoDB的Gatsby服務器中更改數據時,也曾遇到過GraphQL查詢數據庫的錯誤。希望您在開發的過程中,能夠避免。
gatsby-config.js 中的變更
請使用“npm install --save gatsby-source-mongodb”命令來安裝代碼包,并為MongoDB添加以下JSON代碼段作為插件:
- {
- // The name of the plugin
- resolve: `gatsby-source-mongodb`,
- options: {
- // Name of the database and collection where are records reside
- dbName: 'data',
- collection: 'data',
- server: {
- address: 'cluster0-test-.mongodb.net',
- port: 27017
- },
- auth: {
- user: 'test',
- password: 'test123'
- },
- extraParams: {
- replicaSet: 'Main-shard-0',
- ssl: true,
- authSource: 'admin',
- retryWrites: true
- },
- refetchInterval: 60,
- }
- }
如下JavaScipt代碼段將各項變更反應到index.js上:
- import React from "react"
- import { Link } from "gatsby"
- import { graphql } from "gatsby"
- import Layout from "../components/layout"
- const IndexPage = (props) => {
- const covid19DataSet = props.data.allMongodbCovid19Covid19.edges;
- return (
- <Layout>
- <table>
- <tr>
- <td>Type</td>
- <td>Location</td>
- <td>Hospital</td>
- <td>Available Bed</td>
- <td>Links</td>
- <td>Contact Number</td>
- <td>Date of Update</td>
- <td>Comments</td>
- </tr>
- {covid19DataSet.map(covid19Data =>
- <tr>
- <td>{covid19Data.node.type}</td>
- <td>{covid19Data.node.location}</td>
- <td>{covid19Data.node.hospital}</td>
- <td>{covid19Data.node.available_bed}</td>
- <td>{covid19Data.node.links}</td>
- <td>{covid19Data.node.number}</td>
- <td>{covid19Data.node.date}</td>
- <td>{covid19Data.node.commentes}</td>
- </tr>
- )}
- </table>
- </Layout>
- )
- }
- export default IndexPage
- export const pageQuery = graphql`
- query MQuery {
- allMongodbCovid19Covid19 {
- edges {
- node {
- hospital
- date
- commentes
- available_bed
- links
- location
- number
- type
- }
- }
- }
- }
圖表
我們可以根據不同的分析目的,產生各種圖表。下面的柱狀圖展示了在該應用示例中,不同類型服務的可用數量。當然,其他可支持的圖表類型還有:圓形、條形、線狀、組合、區域、網格等。
除此以外,MongoDB Atlas還可以被用于許多其他類型的應用,例如將服務構建為云原生平臺的一部分。
原文標題:Cloud-Native and MongoDB,作者: Bikram Sinha
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】