無伺服器不僅是一種時尚,而且正在改寫軟體的擴展方式。
Netflix 在沒有伺服器的情況下播放數十億小時的內容。可口可樂無需基礎設施即可自動化工作流程。 Figma 和 T-Mobile 消除了停機時間。什麼是他們知道而你不知道的?
秘密是什麼?事件驅動的無伺服器程式碼。它是應用程式的支柱,可以立即擴展、降低成本並抵禦流量高峰。沒有伺服器。無需猜測。只是有反應的程式碼。
這不是炒作,而是藍圖。準備好建造更智慧了嗎?讓我們來分析一下事件驅動的無伺服器如何將可擴展性從挑戰轉變為反應。
劇透警告:伺服器仍然存在。
這個術語在網路上有多種定義,通常充滿複雜的術語。我喜歡定義它的最好方式是:
這是一種部署程式碼的“時尚”,您無需考慮執行程式碼的伺服器。
讓我們舉個例子:
以鮑伯為例。他建立了mytrashcode.com ,但對「伺服器設定」感到驚慌。他是一名開發人員,而不是系統管理員。相反,他將程式碼上傳到雲端提供者。他們處理安全性、擴展性和流量——他的網站上線了。沒有深夜伺服器崩潰。交通高峰時無需恐慌。完畢。
管理您自己的伺服器通常採用兩條路徑之一。您可以執行實體硬體(例如將舊筆記型電腦變成 DIY 伺服器),也可以從 DigitalOcean Droplets、Azure VM 或 AWS Lightsail 等供應商租用虛擬專用伺服器 (VPS)。這些屬於 IaaS(基礎設施即服務),其中雲端公司提供裸機基礎設施,但其餘的(更新、擴展、安全性)完全取決於您。
這是否意味著自我管理伺服器是不可能的?
一點也不。很多團隊仍然這樣做。但是管理自己的伺服器會帶來很多...挑戰,包括:
了解如何管理基礎架構/硬體。
設定自動縮放和縮小縮放。
定期應用系統修補程式和更新以避免暴露漏洞。
設定代理程式、SSL 憑證產生、網路設定等。
無伺服器程式碼不需要是單一的,即所有程式碼不需要位於同一位置。它可以是小型的、事件觸發的函數的集合。
函數只不過是執行特定任務的一組程式碼。當以無伺服器方式編寫整個程式碼時,您會發現可以將程式碼劃分為各種函數,每個函數處理應用程式的特定部分。讓我們透過一個例子更深入地理解這一點:
當 Bob 首次以新使用者身分登入mytrashcode.com時,系統會在重定向他之前觸發「發送歡迎電子郵件」功能。隨後的登入完全繞過此功能,直接將其引導至儀表板。這種分離有一個關鍵目的——雖然 99% 的用戶僅與儀表板交互,但隔離次要功能(如電子郵件觸發器)可以實現獨立擴展。
雖然在這個例子中微不足道,但成本影響隨著規模的擴大而急劇增加。每個解耦的功能都按照自己的資源分配曲線執行——儀表板存取等高頻功能需要一致的基礎設施,而一次性操作(歡迎電子郵件)可以在不活動期間縮小規模。即使在考慮具有數百個相互依賴功能的複雜系統之前,這種模組化方法也可以防止對很少觸發的事件進行過度配置。
好的,快速回顧一下——我們現在知道:
部署無伺服器非常棒!
將程式碼劃分為函數是模組化且可擴展的。
函數可以由事件觸發。
那麼,您在哪裡部署這個架構呢? AWS Lambda、Azure Functions 和 Google Cloud Functions 等領先平台都支援它,但我們將專注於 Appwrite Functions。
Appwrite 是一種開源後端即服務 (BaaS),它將身份驗證、資料庫、儲存和無伺服器功能捆綁到一個工具包中。這種緊密整合簡化了部署,Appwrite 集中了後端邏輯,而不是管理分散的雲端服務,讓您能夠以最小的開銷部署事件驅動的功能。對於優先考慮簡單性而不犧牲可擴展性的開發人員來說,這種統一的方法可顯著減少操作摩擦。
那麼,讓我們部署我們的函數吧!
在編寫程式碼之前,請在 Appwrite 上設定後端:
前往appwrite.io並註冊或登入。
建立一個組織(如果是新的)。
建立一個新專案。
複製您的專案 ID以供以後使用。
現在,讓我們使用node-appwrite
模擬一個伺服器端專案:
mkdir my-project
cd my-project
npm init -y
appwrite init
npm install dotenv node-appwrite
appwrite init function
對於執行時,我選擇了Node 20 ,但您可以選擇任何執行時。
src/main.js
中編寫主函數:import dotenv from "dotenv";
import { Account, Client, Users } from "node-appwrite";
dotenv.config();
const client = new Client();
client.setEndpoint("https://cloud.appwrite.io/v1");
client.setProject(process.env.PROJECT_ID);
const users = new Users(client);
const account = new Account(client);
const main = async () => {
await account.create(
"test-user",
"[email protected]",
"test@123",
"test",
);
const session = await account.createEmailPasswordSession(
"[email protected]",
"test@123",
);
console.log(session);
};
main();
在package.json
中新增start
腳本來執行node src/main.js
。
使用所需的環境變數建立.env
檔。
此函數模擬新用戶的建立和登錄,記錄會話詳細資訊。
注意:將電子郵件 ID 替換為實際電子郵件以接收電子郵件。
現在,讓我們設定函數邏輯。導航到您的函數所在的functions/your-function
。
對於此演示,我們將使用重新發送來發送電子郵件:
resend
髮包:npm install resend
src/main.js
:import { Resend } from 'resend';
// https://appwrite.io/docs/advanced/platform/events
export default async ({ res, req, log }) => {
const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
from: '[email protected]',
to: req.body.email,
subject: 'Hello!',
text: 'Hi, its nice to meet you!',
});
log('Email sent successfully');
return res.json({
success: true,
message: 'Email sent successfully',
});
};
您需要在 Resend 上設定帳戶才能取得 API 金鑰。重新發送也要求您連接到自己的網域才能發送電子郵件。您可以在重新傳送文件中閱讀更多相關資訊。
現在,讓我們使用以下命令將建立的函數推送到控制台:
appwrite push functions
最後一步是設定使用users.*.create
事件將兩段程式碼連接在一起的事件:
前往 Appwrite 控制台並導航到您建立的專案。
導航至“功能”標籤。
您應該在那裡看到新建立的函數 - 單擊它。
轉到其設定並在“事件”部分下。
新增一個事件來觸發此函數: users.*.create
。
而且...瞧!你的程式已經完成了。如果一切設定正確,執行主腳本應該向新建立的使用者發送邀請電子郵件。嘗試使用:
npm run start
總之,無伺服器架構不僅僅是一種短暫的趨勢,它是建立和擴展現代應用程式的變革性方法。
Appwrite 等平台進一步簡化了流程,提供了與無伺服器功能無縫整合的統一後端解決方案。無論您是像 Bob 這樣的獨立開發人員還是大型團隊的一員,採用無伺服器都可以將可擴展性從艱鉅的挑戰轉變為輕鬆的反應。
感謝您的閱讀!
您也可以在這裡與我聯絡:https: //www.chiragaggarwal.tech/
原文出處:https://dev.to/chiragagg5k/writing-event-driven-serverless-code-to-build-scalable-applications-2mol