自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何遷移到PlanetScale的無服務(wù)器數(shù)據(jù)庫?

譯文
運(yùn)維 數(shù)據(jù)庫運(yùn)維
作為一名開發(fā)者,我一直嘗試通過試驗(yàn)和構(gòu)建來學(xué)習(xí)新技術(shù)。我最近對無服務(wù)器數(shù)據(jù)庫頗感興趣,該技術(shù)有望加快部署、增強(qiáng)可擴(kuò)展性及改善開發(fā)者體驗(yàn)。

[[431640]]

【51CTO.com快譯】作為一名開發(fā)者,我一直嘗試通過試驗(yàn)和構(gòu)建來學(xué)習(xí)新技術(shù)。我最近對無服務(wù)器數(shù)據(jù)庫頗感興趣,該技術(shù)有望加快部署、增強(qiáng)可擴(kuò)展性及改善開發(fā)者體驗(yàn)。我在測試多個(gè)產(chǎn)品后,決定將個(gè)人網(wǎng)站由使用Firebase和Redis改用PlanetScale,這是建立在MySQL和Vitess上的新的無服務(wù)器數(shù)據(jù)庫平臺(tái),是為YouTube 提供支持而開發(fā)的開源平臺(tái)。

我選擇PlanetScale的原因如下:

  • 數(shù)據(jù)庫分支:我可以使用心智模型與Git相同的數(shù)據(jù)庫。每次更改我的數(shù)據(jù)庫模式,我都打開部署請求。然后,我可以將這些更改合并回到主數(shù)據(jù)庫分支中。
  • Prisma支持:與Prisma結(jié)合使用,可以很輕松地處理數(shù)據(jù)庫遷移。
  • 無連接:由于PlanetScale是無服務(wù)器,因此可以承受數(shù)千個(gè)同時(shí)連接。幾乎可以把這認(rèn)為是無連接,因?yàn)槲也恍枰獡?dān)心池化或其他常見的反對意見。
  • 10秒內(nèi)部署:我在測試13個(gè)數(shù)據(jù)庫后,發(fā)現(xiàn)PlanetScale部署速度最快。使用它幾周并監(jiān)控性能后,我看到API平均在大約150ms內(nèi)解析(見下面的結(jié)果)。

Firebase和Redis

我的網(wǎng)站以前使用Google Firebase和Redis用于實(shí)時(shí)博文閱讀量和留言簿。決定選擇這些技術(shù)主要是想學(xué)習(xí)一下。Firebase和Redis(借助Upstash)都很易于上手,無需思考即可擴(kuò)展,在無服務(wù)器環(huán)境下運(yùn)行順暢。但是我想轉(zhuǎn)而使用基于SQL的數(shù)據(jù)庫(MySQL或PostgreSQL),以獲得新的學(xué)習(xí)體驗(yàn)。

重建SQL

我發(fā)現(xiàn)自己在SQL有內(nèi)置功能的地方編寫JavaScript。比如說,我使用Firebase獲取 JSON對象閱讀量,然后將這些值相加以找到總的閱讀量。

  1. const snapshot = await db.ref('views').once('value'); 
  2. const views = snapshot.val();  
  3. const allViews = Object.values(views).reduce((total, value) => total + value);  
  4. With SQL, you can use SUM() instead.   
  5. SELECT SUM(countas total  
  6. FROM views; 

排序同樣如此。以前我使用JavaScript sort,現(xiàn)在使用ORDER BY。雖然Firebase確實(shí)有類似功能,但我并不使用它。

  1. SELECT * FROM guestbook 
  2. ORDER BY updated_at DESC

SQL是成熟的技術(shù)。它已存在多年,會(huì)繼續(xù)存在多年。我在以前的工作中用過它,但仍覺得可以更深入地理解它。我也喜歡使用PostgreSQL(推薦Supabase),強(qiáng)烈推薦考慮該解決方案。

我還堅(jiān)信使用自己推薦的工具。如果我沒有實(shí)際動(dòng)手編寫代碼、在生產(chǎn)環(huán)境中運(yùn)行應(yīng)用程序,就很難有把握地向別人推薦產(chǎn)品。我使用PlanetScale Vercel Integration后,大為驚喜。只需點(diǎn)擊幾下鼠標(biāo),我就可以部署整個(gè)全棧應(yīng)用程序。正如開頭提到的,數(shù)據(jù)庫遷移與我的心智模型相一致。

遷移現(xiàn)有數(shù)據(jù)

可能有更好的方法來遷移,但我將數(shù)據(jù)遷移到PlanetScale的自創(chuàng)解決方案如下:

  • 從我的Firebase實(shí)時(shí)數(shù)據(jù)庫導(dǎo)出JSON數(shù)據(jù)
  • 使用HVALS和TablePlus,從我的Redis集群導(dǎo)出JSON數(shù)據(jù)
  • 在PlanetScale中創(chuàng)建新的數(shù)據(jù)庫分支,用于添加表的模式遷移
  • 創(chuàng)建兩個(gè)新的API路由,負(fù)責(zé)加載JSON數(shù)據(jù)和INSERT INTO(插入到)MySQL
  • 在數(shù)據(jù)庫分支上驗(yàn)證API正確處理和遷移數(shù)據(jù)
  • 創(chuàng)建擁有新模式更改的部署請求,并將其合并到main中
  • 最后,點(diǎn)擊API,將JSON數(shù)據(jù)遷移到main
  • 完畢!

下面是我使用的兩個(gè)腳本,供參考。

  1. import db from 'lib/planetscale' 
  2. import guestbookData from 'data/guestbook'  
  3. export default async function handler(req, res) {   
  4.   const toISOString = (unixTimestampInMs) =>   
  5.     new Date(unixTimestampInMs).toJSON().slice(0, 19).replace('T'' ');   
  6.   let query = `INSERT INTO guestbook (email, updated_at, body, created_by)   
  7.     VALUES `;   
  8.   const escapeStr = (str) =>   
  9.     str  
  10.       .replace(/\\/g, '\\\\' 
  11.       .replace(/\$/g, '\\$' 
  12.       .replace(/'/g, "\\'") 
  13.       .replace(/"/g, '\\"'); 
  14.   guestbookData.forEach((item, key) => {  
  15.     var value = JSON.parse(item['value']);  
  16.     query += `("${  
  17.       value.email ? `${value.email}` : 'not@provided.com'   
  18.     }", "${toISOString(value.updated_at)}", "${escapeStr(value.body)}", "${   
  19.       value.created_by  
  20.     }")`;   
  21.     if (key === guestbookData.length - 1) {   
  22.       query += ';'  
  23.     } else {   
  24.       query += ', '  
  25.     }   
  26.   });   
  27.   const [rows] = await db.query(query);   
  28.   return res.status(201).json(rows[0]);  
  29.  
  30. import db from 'lib/planetscale' 
  31. import viewsData from 'data/views'  
  32. export default async function handler(req, res) {   
  33.   let query = `INSERT INTO views (slug, count  
  34.     VALUES `;  
  35.   const slugs = Object.keys(viewsData['views']);  
  36.   slugs.forEach((slug, key) => {   
  37.     const count = viewsData['views'][slug];   
  38.     query += `("${slug}", ${count})`;   
  39.     if (key === slugs.length - 1) {   
  40.       query += ';'  
  41.     } else {   
  42.       query += ', '  
  43.     }   
  44.   });   
  45.   const [rows] = await db.query(query);   
  46.   return res.status(201).json(rows[0]);   

以下是我的PlanetScale模式,用于跟蹤博文閱讀量和留言簿留言。

  1. CREATE TABLE `views` (  
  2.   `slug` varchar(128) NOT NULL 
  3.   `countbigint NOT NULL DEFAULT '1' 
  4.   PRIMARY KEY (`slug`)  
  5.  
  6. CREATE TABLE `guestbook` (   
  7.  `id` bigint NOT NULL AUTO_INCREMENT,  
  8.   `email` varchar(256) NOT NULL 
  9.   `body` varchar(500) NOT NULL 
  10.   `created_by` varchar(256) NOT NULL 
  11.   `created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),  
  12.   `updated_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),  
  13.   PRIMARY KEY (`id`)  

結(jié)果

我一直使用Checkly來監(jiān)控連接到PlanetScale的生產(chǎn)級API的性能。Checkly讓我可以設(shè)置警報(bào),那樣出現(xiàn)停運(yùn)或性能降到接受的閾值以下時(shí)發(fā)出警報(bào)。迄今為止,我發(fā)現(xiàn)我的Next.js API Routes在us-east的Vercel上部署為無服務(wù)器函數(shù)時(shí)延遲約150ms。

 

PlanetScale性能小結(jié)

如下圖所示,與我之前的Firebase實(shí)現(xiàn)相比,響應(yīng)時(shí)間顯著加快(請注意我何時(shí)進(jìn)行切換)。 此外,擁有一項(xiàng)而不是兩項(xiàng)服務(wù)可以清理代碼,需要較少的環(huán)境變量即可連接到每項(xiàng)服務(wù)。

原文標(biāo)題:How to Migrate to PlanetScale’s Serverless Database,作者:Lee Robinson

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】

 

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

2021-01-28 09:00:00

SQL數(shù)據(jù)庫NoSQL

2012-10-29 09:27:16

2015-03-20 13:40:17

2019-03-20 09:00:00

MySQL數(shù)據(jù)庫轉(zhuǎn)移數(shù)據(jù)庫

2017-12-13 09:00:00

2018-05-22 09:00:00

2019-04-30 10:27:46

無服務(wù)器云計(jì)算安全

2011-09-07 09:30:57

服務(wù)器虛擬機(jī)

2020-06-08 10:41:13

云計(jì)算數(shù)據(jù)工具

2013-11-01 11:23:52

Linux遷移Windows服務(wù)器

2011-08-09 14:27:16

WindowsServ服務(wù)器ADDS

2016-10-08 17:27:52

云端數(shù)據(jù)庫云計(jì)算數(shù)據(jù)遷移

2011-08-09 14:27:49

服務(wù)器DCADDS

2023-11-30 07:15:57

MySQL數(shù)據(jù)庫

2009-11-16 13:24:34

Oracle數(shù)據(jù)庫服務(wù)

2022-11-02 15:25:03

云數(shù)據(jù)庫云平臺(tái)

2021-03-18 08:01:52

Docker容器遷移

2022-04-12 09:00:00

無服務(wù)器云原生數(shù)據(jù)庫

2020-10-09 07:00:00

無服務(wù)器應(yīng)用監(jiān)控架構(gòu)

2017-09-13 07:23:03

點(diǎn)贊
收藏

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