技術基礎| 用JSON在抖音上發佈動態——使用Stargate即可輕鬆實現
Cassandra是世界上經受住最多實戰考驗的資料庫,通過其快速且易於使用的數據API,讓你的程式開發升級。
本文將介紹什麼是Stargate以及Stargate的最新進展,如果您想快速流覽相關代碼和動手操作指南,不妨直接跳到本文的第四節,跟著我們一起在App上發佈動態、創建頻道並管理使用者吧。
01 在Astra上使用Stargate
這對開發者來說真是個超棒的時刻。
我們將很多的API和很棒的工具集成在了一起,説明大家構建不斷變化的全棧應用程式。 如果你是一個開發者,你可能在用無模式(schemaless)資料存儲、無伺服器(serverless)架構、JSON的各種API,以及GraphQL語言等技術。
不僅如此,還有很多非常棒的框架(比如Jamstack,即JavaScript、APIs和Markup)和服務(比如Netlify)讓無伺服器應用程式的部署變得更快。
現在,由於Stargate在Astra上作為官方數據API正式發行,Apache Cassandra首次成為了這個應用棧的一部分。
我們構建的現代應用程式需要各種數據API,我們將這些API都集成到了我們的工具組中,它們會和原生的數據格式(JSON、REST、GraphQL等)協同工作。 這些數據API需要支援無模式的JSON,與此同時還要提供速度和伸縮性。
最重要的是,如果想要在我們的專案中使用他們,我們至多需要幾分鐘的時間而已。
DataStax將Stargate構建於Astra,這給作為程式開發人員的我們一個自然的數據API棧,它與Jamstack或你選擇的其它無伺服器應用棧相容。
Apache Cassandra助力於Netflix、Instagram、Yelp、iCloud以及其他我們每日都用的很多應用,而在Astra上的Stargate就是構建在這個基礎堅實的NoSQL數據引擎之上的。
02 Stargate到底是什麼?
Stargate是一個開源的數據閘道,它處於你的程式伺服器和你的資料庫之間。 Stargate將一個API平臺和數據請求協調代碼放到同一個開源專案中。
多個成功的應用程式公司(像是Netflix和Yelp)都構建了他們自己的數據閘道,以説明內部的程式開發人員用各種簡單的API開發App功能,同時無需瞭解底層的資料庫或把資料模式(schema)弄得一團糟。
DataStax將Stargate整合到Astra中,讓你同樣能夠輕鬆存取你的數據。
這對你來說意味著什麼?
- 無需預先進行Documents的數據建模
- 更少的需要維護的個人化代碼
- 更多的時間用於建構你真正在意的東西

有Stargate作為去往Cassandra的不同flavor的協調數據請求的代理,你可以按你所想使用你的數據——無論是通過無模式Document API使用JSON,抑或是通過能感知資料庫模式的GraphQL和RESTful API使用JSON。
為了在實戰中看看這個,讓我們來研究一下如何在一個抖音的克隆版App中使用JSON和Stargate的無模式Document API。 因為如果Instagram和Snapchat都有了克隆抖音而來的功能,我們也應該要有一個,不是嗎?
03 動手操作前的簡短說明
在不需數據建模的情況下將JSON隨意丟入Apache Cassandra或從中隨意取出是很有意思的事情。 你真應該自己在Astra上動手試一下。 你可以在Astra上立刻得到動手體驗,或者你也可以看看我們的範例程式庫,瞭解一下實戰中的無模式Cassandra。
我們很高興和來自Netflix、黑莓、麥格理銀行、美國聯合服務汽車協會以及Yelp的眾多工程師一起創造Stargate。 他們很努力地在對這些API進行實戰考驗,並與在我們一起開發新的功能。
好了就是這些,讓我們開始寫代碼吧!
04 在抖音上發佈動態
我們打算用Astra上的Stargate提供的API來向抖音的複製版App創建並上傳動態。 在這個過程中,我們將會使用你可以直接粘貼到你最新的Jamstack程序的代碼。
想要在你的應用程式中使用在Astra上的Stargate,首先請安裝並配置我們的JAVAScript SDK。 你也許需要自行查詢一下如何在你的.env檔中存儲環境變數。
讓我們先從一個基本的抖音動態開始——一個帶有簡短描述的視頻——就像是這樣:
const postData = {
"postId": 0,
"video": "https://i.imgur.com/FTBP02Y.mp4",
"caption": "These ducks are cute",
"timestamp": "2020-12-09T09:08:31.020Z",
"likes": 0,
}
當你用一個node JS用戶端連接到在Astra上的Stargate之後,讓我們一起在我們的App中創建一個新的collection,並將剛才的視頻動態加入其中:
const postsCollection = astraClient.namespace("tikTokClone").collection("posts");
const post = await postsCollection.create(postData);
如果你之前用過Cassandra,你會知道這一步有多棒。 看看我們剛才省略的步驟吧:無需數據建模、無需創建新表、無需配置代碼、無需分區鍵、無需聚類鍵...... 我想你已經明白我的意思了。
在Astra上的Stargate讓你僅用一行代碼就能向Apache Cassandra中添加數據。 這種程度的便捷是之前的Cassandra不可能做到的。 插入JSON數據,然後繼續下一步。
下一步,假設你想要找到所有和鴨子(ducks)相關的動態,你可以這樣做:
// find all posts about ducks
const posts = await postsCollection.find({ caption:
{ $in: ["ducks"] } });
Duang~現在一個有關鴨子的頻道已經為你的使用者找出來了。 畢竟沒人不會喜歡一個專注於鴨鴨們的視頻頻道。
現在你的App看起來還不會和Twitter一樣,但是我們可以編輯一些內容。 讓我們看看如何編輯你的動態的簡短描述——或者是一個稍長的描述? 這取決於你。
// update the post’s caption
const post = await postsCollection.update(post.documentId, {
caption: "These ducks are MEGA cute",
});
上面的這些只是一個快速介紹,展示了如何在一個簡單地克隆抖音的App上調用一小部分的數據API。
05 下一步是什麼?
想要查看更多使用Stargate的REST、Document以及GraphQL的API的例子,點擊這裡查看更多動手教程。 看看這些教程,並且記得告訴我們你的想法。
有新的App的主意? 或者想要加入我們的狂歡? 你可以加入到我們的Stargate 社群中。
我們很期待看到你是如何改造你的克隆版的抖音,使它擁有更多值得炫耀的基於數據的功能。
或者你可以自行創建其他App的克隆版——我們會很樂意將你的App克隆版放到我們的範例程式庫,所以請通過DataStax活動小秘書與我們取得聯繫。
06 還想要知道更多細節?
如果你看到這兒了,估計你是在找更多的代碼。
沒問題。
讓我們展示一下如何創建node JS用戶端以及調用更多的數據API。 對於初學者,讓我們先看一下如何將你的用戶端連接到在Astra上的Stargate:
// npm install @astrajs/collections
const { createClient } = require("@astrajs/collections");
// create an Astra client
const astraClient = await createClient(
{ astraDatabaseId: process.env.ASTRA_DB_ID,
astraDatabaseRegion: process.env.ASTRA_DB_REGION,
username: process.env.ASTRA_DB_USERNAME,
password: process.env.ASTRA_DB_PASSWORD,
});
這非常之容易。
然後讓我們在我們的資料庫中創建一個使用者collection,用它來儲存我們的抖音使用者的documents。
// create the users collection in the app
const usersCollection = astraClient.namespace("tikTokClone").collection("users");
我們的抖音App中的使用者會有一些基本訊息:一個獨一無二的ID、一個名字、使用者名等等:
const userData = {
"id_3": "0",
"name": "Mo Farooq",
"username": "mofarooq32",
"avatar": "https://i.imgur.com/9KYq7VG.png"
};
然後讓我們把這個使用者添加到我們的collection中:
// create a new user
const user = await usersCollection.create(userData);
你可以通過讀取這個使用者的任意特性(比如使用者名)來確保這個使用者已經被存儲在資料庫中了:
// find our user by username
const users = await usersCollection.find({ username: { $eq:
"mofarooq32" } });
或者你可以根據使用者的documentId來查找任意使用者:
// get the user by document id
const user = await usersCollection.get(user.documentId);
最後,如果你想要刪除一個使用者:
// delete the user
const user = await usersCollection.delete(user.documentId);
想要查看完整代碼? 點擊這裡查看全部的代碼,並基於它改造你自己的版本。 如果你真的這樣做了,記得讓我們知道你的新動態,我們很樂意訂閱你的鴨鴨頻道。
謝謝你讀完整篇文章。 祝你敲代碼愉快!