成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在幾分鐘內(nèi)搭建一個(gè)可擴(kuò)展并且高可用的GraphQL API

譯文
開(kāi)發(fā) 前端
這篇文章將為你介紹如何使用一個(gè)基礎(chǔ)數(shù)據(jù)庫(kù)在幾分鐘內(nèi)迅速搭建一個(gè)跨越同一個(gè)公共云片區(qū)的多個(gè)可用區(qū)域的GraphQL層。

譯者 | 譚劍

審校 | 孫淑娟 梁策

對(duì)于云原生的應(yīng)用來(lái)說(shuō),一個(gè)現(xiàn)代化的GraphQL API層需要具備兩個(gè)特征:水平可擴(kuò)展性以及高可用性。

比如說(shuō),給一臺(tái)運(yùn)行API層的現(xiàn)有機(jī)器設(shè)備增加更多的CPU、內(nèi)存和其他資源,這是垂直擴(kuò)展性。而水平擴(kuò)展性會(huì)為你的API基礎(chǔ)設(shè)施添加更多的機(jī)器設(shè)備。

垂直擴(kuò)展性主要是為了實(shí)現(xiàn)某種特定的擴(kuò)展,而一個(gè)具備水平擴(kuò)展性的API層可以發(fā)揮超越單臺(tái)機(jī)器的容積能力。

當(dāng)談到高可用性的時(shí)候,GraphQL層需要無(wú)差錯(cuò)地持續(xù)運(yùn)轉(zhuǎn)(甚至在一些超出我們可控范圍的突發(fā)情況中)。這是判斷一個(gè)系統(tǒng)是否具備99.999%高可用特征的最佳考核指標(biāo)。

這篇文章將為你介紹:如何使用一個(gè)基礎(chǔ)數(shù)據(jù)庫(kù)在幾分鐘內(nèi)迅速搭建一個(gè)跨越同一個(gè)公共云片區(qū)的多個(gè)可用區(qū)域的GraphQL層。

最終的解決方案將會(huì)橫跨多個(gè)可用區(qū)域,并且可以經(jīng)受區(qū)域級(jí)別的故障,以及水平地?cái)U(kuò)展。

下面我們拿AWS、Hasura云,以及Yugabyte云作為參考平臺(tái)來(lái)做案例演示。

跨多個(gè)可用區(qū)域來(lái)部署YugabyteDB

就從數(shù)據(jù)庫(kù)層開(kāi)始吧,我們選擇??YugabyteDB??——一個(gè)開(kāi)源的分布式SQL數(shù)據(jù)庫(kù)。

對(duì)于可擴(kuò)展性和可快速恢復(fù)的API來(lái)說(shuō),它是一個(gè)理想的支撐服務(wù)。

YugabyteDB同時(shí)也是符合PostgreSQL語(yǔ)法習(xí)慣的一個(gè)數(shù)據(jù)庫(kù)。這意味著我們不需要學(xué)習(xí)另外一門(mén)SQL方言或者從零開(kāi)始地重寫(xiě)現(xiàn)有的應(yīng)用。

那么需要花費(fèi)多少時(shí)間來(lái)部署一個(gè)有彈性、跨多區(qū)域的YugabyteDB集群呢?

這要看情況而定,但如果你像我一樣懶,或者更傾向于直接使用云原生服務(wù)的話,那么Yugabyte云將會(huì)是完成這項(xiàng)任務(wù)的最簡(jiǎn)單的方式:

1.對(duì)于初學(xué)者來(lái)說(shuō),創(chuàng)建或者注冊(cè)你的Yugabyte云賬號(hào)。

2.然后,準(zhǔn)備一個(gè)多節(jié)點(diǎn)的跨越若干個(gè)可用區(qū)域的YugabyteDB集群:

a. 選用一個(gè)自定義的集群名字,比如 multi-zone-cluster,把集群服務(wù)安放在離你最近的AWS片區(qū)(對(duì)我來(lái)說(shuō),N.Virginia - us-east-1是最近的),然后確保把Fault Tolerance這項(xiàng)參數(shù)設(shè)置為Availability Zone Level。

b. 點(diǎn)擊Download credentials下載證書(shū)。然后點(diǎn)擊"Create Cluster"(創(chuàng)建集群)。

那我們?cè)趺蠢肶ugabyteDB來(lái)實(shí)現(xiàn)高可用呢?

這個(gè)集群有三個(gè)節(jié)點(diǎn),部署在三個(gè)可用區(qū)域的其中一個(gè)里面。備份因子同樣已設(shè)置為3。

這意味著每一個(gè)節(jié)點(diǎn)(而實(shí)際上是在每個(gè)區(qū)域)都會(huì)維護(hù)著一份數(shù)據(jù)記錄的拷貝。在我的例子中,分別位于us-east-1b、us-east-1c、以及us-east-1a等可用區(qū)域里都分別有一個(gè)節(jié)點(diǎn):

節(jié)點(diǎn)

YugabyteDB是基于Raft一致性協(xié)議的。因此,按當(dāng)前已有三個(gè)節(jié)點(diǎn)的配置,我們可以釋放為一個(gè)節(jié)點(diǎn)(或者說(shuō),一個(gè)可用區(qū)間——只要在每個(gè)片區(qū)都有一個(gè)節(jié)點(diǎn)),這個(gè)節(jié)點(diǎn)仍然是可運(yùn)行的。

為什么YugabyteDB不選擇只用一個(gè)節(jié)點(diǎn)來(lái)處理請(qǐng)求服務(wù)呢?

依據(jù)CAP定理(又稱(chēng)作布魯爾定理),YugabyteDB??是一個(gè)遵循一致性和分區(qū)容錯(cuò)性(CP)的數(shù)據(jù)庫(kù)??。

下面的公式定義了容錯(cuò)變量K和備份因子RF之前的依賴(lài)關(guān)系:

RF=(2k + 1)

在我的例子中,K=1(意思是,集群可以釋放為1個(gè)節(jié)點(diǎn)),而因此,RF結(jié)果為3(3份數(shù)據(jù)拷貝)。

問(wèn)題來(lái)了,如果數(shù)據(jù)庫(kù)需要處理100倍的查詢(xún)次數(shù)或者存儲(chǔ)更多的數(shù)據(jù),那我們?cè)趺礃永肶ugabyteDB來(lái)完成水平擴(kuò)展呢?只需要在集群的Setting界面添加更多的節(jié)點(diǎn)到基礎(chǔ)設(shè)施里。

打造一個(gè)可擴(kuò)展以及富有彈性的 Hasura GraphQL層

Hasura 是一個(gè)高級(jí)的GraphQL服務(wù)器,它基于符合PostgreSQL方言的數(shù)據(jù)庫(kù)(比如YugabyteDB),提供了快速實(shí)時(shí)的GraphQL API。

Hasura有一個(gè)完全可管理的云版本。創(chuàng)建一個(gè)Hasura項(xiàng)目,具有水平擴(kuò)展性和高可用性,開(kāi)箱即用:

  • 創(chuàng)建或登錄你的Hasura Cloud賬號(hào);
  • 創(chuàng)建一個(gè)Standard Tier項(xiàng)目:

  1. 選擇一個(gè)AWS片區(qū),類(lèi)似部署YugabyteDB那樣——在我的例子中,是US East (N. Virginia)。
  2. 點(diǎn)擊Create Project按鈕,繼續(xù)部署操作。

就像我們所看到的,Hasura沒(méi)有任何與擴(kuò)展性或區(qū)域級(jí)別可用性相關(guān)的設(shè)置。那么,在可能發(fā)生區(qū)域故障或者哪天有必要做水平擴(kuò)展的時(shí)候,我們?nèi)绾未_定API層能夠繼續(xù)保持可運(yùn)行呢?

實(shí)際上,只要我們選擇了Standard Tier,這兩個(gè)特性就都會(huì)有的。這就是Hasura在文檔所說(shuō)的:

把Hasura鏈接到Y(jié)ugabyteDB

到目前為止,我們已經(jīng)部署了一個(gè)Hasura GraphQL層和YugabyteDB集群,可以支撐水平擴(kuò)展以及區(qū)域級(jí)別的突發(fā)故障了。剩下要做的,就是把這兩個(gè)組件連接起來(lái),為我們的應(yīng)用提供一個(gè)最終解決方案。

把Hasura添加到Y(jié)ugabyteDB白名單里

YugabyteDB集群實(shí)例要求我們?cè)O(shè)定所訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用IP地址。對(duì)我們的Hasura實(shí)例來(lái)說(shuō)這并不難。

把Hasura Cloud IP添加到Y(jié)ugabyte Cloud終端的Allow IP List里:

  • 從你的Hasura項(xiàng)目界面里復(fù)制Hasura Cloud IP。
  • 轉(zhuǎn)到Y(jié)ugabyteDB Cloud,把IP添加到IP Allow List里。

建立連接

在授權(quán)Hasura訪問(wèn)YugabyteDB實(shí)例后,我們需要在兩個(gè)服務(wù)之間建立連接。這需要兩個(gè)步驟:

1. 打開(kāi)Yugabyte Cloud,然后復(fù)制一個(gè)鏈接URL:

  • 點(diǎn)擊Connect按鈕,選擇Connect to your Application選項(xiàng)。
  • 勾選Optimize。
  • 復(fù)制鏈接YSQL(Yugabyte SQL)的唯一URL。
  • 確保使用之前從YugabyteDB集群部署那個(gè)步驟下載的證書(shū)里面的信息,替換掉數(shù)據(jù)庫(kù)用戶(hù)和密碼。

3. 轉(zhuǎn)到Hasura云,與YugabyteDB建立一個(gè)連接:

  • 點(diǎn)擊Launch Console按鈕,跳轉(zhuǎn)到Data & Schema 管理界面。
  • 填寫(xiě)YugabyteDB鏈接參數(shù),建立一個(gè)鏈接。
  • 點(diǎn)擊Connect Database按鈕,建立鏈接。

我們剛剛已經(jīng)完成一個(gè)Graphql API層的搭建,它可以支撐區(qū)域級(jí)別的故障以及水平擴(kuò)展能力。現(xiàn)在,我們用一些樣例數(shù)據(jù)和請(qǐng)求來(lái)做一個(gè)健全性測(cè)試。

創(chuàng)建一個(gè)樣例數(shù)據(jù)庫(kù)

按照以下的步驟,在YugabyteDB里創(chuàng)建用戶(hù)表和消息表:

1. 在YugabyteDB Cloud終端里,點(diǎn)擊Launch the Cloud Shell。

2. 創(chuàng)建用戶(hù)表Users和消息表Messages:

3. SQL:

CREATE SEQUENCE users_pk_seq CACHE 100;
CREATE SEQUENCE messages_pk_seq CACHE 100;

CREATE TABLE Users (
id int NOT NULL DEFAULT nextval('users_pk_seq'),
name text,
age int,
city text,
PRIMARY KEY(id));

CREATE TABLE Messages (
id int NOT NULL DEFAULT nextval('messages_pk_seq'),
sender_id int REFERENCES Users(id),
recipient_id int REFERENCES Users(id),
payload text,
PRIMARY KEY (id)
);


4.最后,初始化用戶(hù)表,創(chuàng)建兩條記錄:

SQL:

INSERT INTO USERS (name, age, city) VALUES
('John', 35, 'Austin'),
('Mark', 36, 'Seattle');


用GraphQL來(lái)查詢(xún)數(shù)據(jù)

往YugabyteDB里載入樣例數(shù)據(jù)庫(kù)后,我們可以體驗(yàn)到Hasura提供的GraphQL API層帶來(lái)的便利。

把數(shù)據(jù)表暴露到GraphQL層

即使Hasura自動(dòng)檢測(cè)數(shù)據(jù)庫(kù)端的結(jié)構(gòu)更改,我們?nèi)匀恍枰鞔_指定哪些表可以通過(guò)GraphQL API查詢(xún):

1. 在Hasura Console里打開(kāi)Data & Schema Management。

2. 點(diǎn)擊Track All按鈕,通過(guò)YugabyteDB API展示出兩個(gè)數(shù)據(jù)表:

3. 最后,點(diǎn)擊Track按鈕,建立從message表到users表的外鍵關(guān)聯(lián)關(guān)系:

查詢(xún)數(shù)據(jù)

下一步,我們來(lái)用GraphQL讀取用戶(hù)表里面的記錄:

1. 打開(kāi)Hasura Console界面的Api Explorer標(biāo)簽:

2. 查詢(xún)?nèi)坑脩?hù):

query {
users {
id
name
age
city
}
}


3.最后,確認(rèn)輸出如下:

{
  "data": {
    "users": [
      {
        "id": 1,
        "name": "John",
        "age": 35,
        "city": "Austin"
      },
      {
        "id": 2,
        "name": "Mark",
        "age": 36,
        "city": "Seattle"
      }
    ]
  }
}


更新數(shù)據(jù)

最后,來(lái)確認(rèn)一下我們的GraphQL API能夠順利處理寫(xiě)入問(wèn)題。

1. 使用以下的GraphQL變種語(yǔ)法,添加一條消息記錄到數(shù)據(jù)庫(kù)里:

mutation {
insert_messages_one(object: {recipient_id: 2, sender_id: 1, payload: "Hi, Mark! How are you doing?"}) {
id
}
}


2.從YugabyteDB反向讀取消息:

query {
messages {
payload
userBySenderId {
name
city
}
user {
name
city
}
}
}


3.確認(rèn)輸出如下:

{
  "data": {
    "messages": [
      {
        "payload": "Hi, Mark! How are you doing?",
        "userBySenderId": {
          "name": "John",
          "city": "Austin"
        },
        "user": {
          "name": "Mark",
          "city": "Seattle"
        }
      }
    ]
  }
}


結(jié)論

正如我們?cè)谶@篇文章里所看到的,正確地融合現(xiàn)代的云原生服務(wù),可以搭建一個(gè)水平可擴(kuò)展和一個(gè)高可用的GraphQL API層。

在幾分鐘的時(shí)間里,我們已經(jīng)得到一個(gè)可以處理請(qǐng)求增加的API層,并把它的容積能力從10GB擴(kuò)展到100GB,甚至更大的容量。此外,最重要的是,它能夠持續(xù)服務(wù)應(yīng)用的請(qǐng)求,哪怕突發(fā)區(qū)域級(jí)別故障也可以做到。

最后,如果你的GraphQL API層需要跨多個(gè)云片區(qū)工作,并能實(shí)現(xiàn)片區(qū)級(jí)別的突發(fā)狀況容錯(cuò),那么你仍然可以使用Hasura和YugabyteDB。目前,這項(xiàng)能力可在自管理安裝選項(xiàng)中獲取(可參考 ??YugabyteDB的多區(qū)域部署??)。

相信在不久的將來(lái),它也會(huì)往完全管理版本的技術(shù)方向發(fā)展。

譯者介紹

譚劍,畢業(yè)于廣東財(cái)經(jīng)大學(xué),現(xiàn)自主創(chuàng)業(yè)。喜歡編程、外語(yǔ)、閱讀。

原文標(biāo)題:??How To Set Up a Scalable and Highly-Available GraphQL API in Minutes??,作者:Denis Magda

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2020-09-11 09:18:07

PythonPython包開(kāi)發(fā)

2022-04-06 09:28:04

漏洞SQL注入

2010-11-30 10:12:08

2017-08-03 17:30:26

戴爾IoT設(shè)備

2010-01-06 13:39:51

擴(kuò)展Jquery的Js

2021-12-02 11:54:10

云計(jì)算云錯(cuò)誤配置網(wǎng)絡(luò)安全

2013-07-02 09:58:38

ClojureClojure教程

2016-09-30 15:13:01

Python代碼

2023-05-09 15:04:37

人工智能工具

2022-05-20 07:36:02

LiveTerm工具

2010-01-06 15:35:06

JSON對(duì)象

2024-11-20 13:18:21

2023-08-15 09:00:00

人工智能破解密碼

2009-12-29 09:01:46

ADSL斷線

2009-11-25 17:22:12

路由器安裝

2010-01-21 09:46:24

C++程序

2010-02-23 14:19:30

Python目錄操作

2024-12-03 15:38:14

2024-04-19 09:37:49

Ollama大語(yǔ)言模型開(kāi)源

2020-11-03 07:34:12

Kafka后端工程師
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚州一区二区三区 | 理论片免费在线观看 | 91嫩草精品 | 羞羞视频在线网站观看 | 免费亚洲网站 | 久久精品国产一区二区电影 | 欧美日韩久久 | 日韩一级精品视频在线观看 | 一区二区三区视频在线 | 国产欧美精品一区二区 | 日日噜噜噜夜夜爽爽狠狠视频97 | 免费一区二区三区 | 一级毛片黄片 | 亚洲视频免费在线 | 日韩精品久久一区 | 久久不射电影网 | 国产亚洲久 | 国产精品久久久久久久7电影 | h漫在线观看 | 日本欧美在线观看视频 | 国产精品91网站 | 97超碰在线免费 | 国产午夜精品久久久久 | 亚洲精品久 | 99久久精品免费视频 | 91看片| 嫩草视频在线免费观看 | 久久99精品国产 | 亚洲欧美中文日韩在线v日本 | 国产一区不卡 | 久久99蜜桃综合影院免费观看 | 国产精品视频久久久久久 | 欧美男人的天堂 | 成人av播放| 亚洲一区二区久久 | 911网站大全在线观看 | 亚洲视频三 | 野狼在线社区2017入口 | 久久亚洲欧美日韩精品专区 | 久久精品男人的天堂 | 激情91|