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

如何遷移到PlanetScale的無服務器數據庫?

譯文
運維 數據庫運維
作為一名開發者,我一直嘗試通過試驗和構建來學習新技術。我最近對無服務器數據庫頗感興趣,該技術有望加快部署、增強可擴展性及改善開發者體驗。

[[431640]]

【51CTO.com快譯】作為一名開發者,我一直嘗試通過試驗和構建來學習新技術。我最近對無服務器數據庫頗感興趣,該技術有望加快部署、增強可擴展性及改善開發者體驗。我在測試多個產品后,決定將個人網站由使用Firebase和Redis改用PlanetScale,這是建立在MySQL和Vitess上的新的無服務器數據庫平臺,是為YouTube 提供支持而開發的開源平臺。

我選擇PlanetScale的原因如下:

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

Firebase和Redis

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

重建SQL

我發現自己在SQL有內置功能的地方編寫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,現在使用ORDER BY。雖然Firebase確實有類似功能,但我并不使用它。

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

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

我還堅信使用自己推薦的工具。如果我沒有實際動手編寫代碼、在生產環境中運行應用程序,就很難有把握地向別人推薦產品。我使用PlanetScale Vercel Integration后,大為驚喜。只需點擊幾下鼠標,我就可以部署整個全棧應用程序。正如開頭提到的,數據庫遷移與我的心智模型相一致。

遷移現有數據

可能有更好的方法來遷移,但我將數據遷移到PlanetScale的自創解決方案如下:

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

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

  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`)  

結果

我一直使用Checkly來監控連接到PlanetScale的生產級API的性能。Checkly讓我可以設置警報,那樣出現停運或性能降到接受的閾值以下時發出警報。迄今為止,我發現我的Next.js API Routes在us-east的Vercel上部署為無服務器函數時延遲約150ms。

 

PlanetScale性能小結

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

原文標題:How to Migrate to PlanetScale’s Serverless Database,作者:Lee Robinson

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

 

責任編輯:華軒 來源: 51CTO
相關推薦

2021-01-28 09:00:00

SQL數據庫NoSQL

2012-10-29 09:27:16

2015-03-20 13:40:17

2019-03-20 09:00:00

MySQL數據庫轉移數據庫

2017-12-13 09:00:00

2018-05-22 09:00:00

2011-09-07 09:30:57

服務器虛擬機

2019-04-30 10:27:46

無服務器云計算安全

2013-11-01 11:23:52

Linux遷移Windows服務器

2020-06-08 10:41:13

云計算數據工具

2011-08-09 14:27:16

WindowsServ服務器ADDS

2011-08-09 14:27:49

服務器DCADDS

2016-10-08 17:27:52

云端數據庫云計算數據遷移

2009-11-16 13:24:34

Oracle數據庫服務

2021-03-18 08:01:52

Docker容器遷移

2022-11-02 15:25:03

云數據庫云平臺

2023-11-30 07:15:57

MySQL數據庫

2017-09-13 07:23:03

2020-10-09 07:00:00

無服務器應用監控架構

2022-04-12 09:00:00

無服務器云原生數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 婷婷色国产偷v国产偷v小说 | 欧美日韩久久精品 | 久久久高清 | 亚洲视频精品 | 国产精品欧美一区二区三区不卡 | 午夜视频免费在线观看 | 91福利在线观看 | 91中文视频 | 欧美一级免费黄色片 | 国产日韩欧美二区 | 97超在线视频 | 天堂久久一区 | 中文字幕精品一区 | 日韩一级| 免费在线观看av网址 | 一区二区三区四区在线免费观看 | 最近中文字幕免费 | 国产精品免费在线 | 亚洲成人av| 五月天婷婷狠狠 | 欧美精品一区二区免费 | 日韩精品一区二区三区 | 欧美jizzhd精品欧美巨大免费 | 日韩精品在线观看一区二区 | 黑人巨大精品欧美一区二区免费 | 亚洲伊人a | 亚洲第一视频网 | 玖玖久久 | 99精品欧美一区二区三区 | 欧美日韩一 | 国产精品日韩高清伦字幕搜索 | 视频1区 | 欧美成人精品在线 | 在线免费观看黄色 | 欧美成人不卡 | 久久999| www.中文字幕.com| 午夜精| 亚洲天堂免费 | 黄色网址在线免费播放 | 日本成人免费观看 |