דוגמה: אפליקציית Go App Engine

הדוגמה הזו היא אפליקציה של App Engine, שנכתבה ב-Go, שמספקת ממשק אינטרנט שמשתמש ב-Bigtable כדי לעקוב אחרי מספר הביקורים מחשבון Google שלכם. הוא פועל באופן מקומי בקונטיינר Docker או בענן בסביבה גמישה של App Engine. הקוד של האפליקציה הזו נמצא במאגר GitHub‏ GoogleCloudPlatform/golang-samples, בספרייה bigtable/usercounter.

סקירה כללית של דוגמת הקוד

כשמפעילים את דוגמת הקוד, נוצר לקוח ניהול ל-Bigtable. לאחר מכן, הוא משתמש בלקוח כדי לבדוק אם מופע Bigtable שצוין על ידי המשתמש מכיל טבלה בשם user-visit-counter, עם קבוצת עמודות אחת בשם emails. אם צריך, הוא יוצר את הטבלה ואת קבוצת העמודות:

adminClient, err := bigtable.NewAdminClient(ctx, project, instance)
if err != nil {
	log.Fatalf("Unable to create a table admin client. %v", err)
}
tables, err := adminClient.Tables(ctx)
if err != nil {
	log.Fatalf("Unable to fetch table list. %v", err)
}
if !sliceContains(tables, tableName) {
	if err := adminClient.CreateTable(ctx, tableName); err != nil {
		log.Fatalf("Unable to create table: %v. %v", tableName, err)
	}
}
tblInfo, err := adminClient.TableInfo(ctx, tableName)
if err != nil {
	log.Fatalf("Unable to read info for table: %v. %v", tableName, err)
}
if !sliceContains(tblInfo.Families, familyName) {
	if err := adminClient.CreateColumnFamily(ctx, tableName, familyName); err != nil {
		log.Fatalf("Unable to create column family: %v. %v", familyName, err)
	}
}
adminClient.Close()

לאחר מכן, דוגמת הקוד יוצרת לקוח Bigtable יחיד שמשמש לכל פעולות הקריאה והכתיבה הבאות:

client, err = bigtable.NewClient(ctx, project, instance)
if err != nil {
	log.Fatalf("Unable to create data operations client. %v", err)
}

לבסוף, דוגמת הקוד מוסיפה handler של HTTP לשורש של שרת App Engine. בכל בקשה, המטפל מבקש מהמשתמש להתחבר לחשבון אם יש צורך בכך. לאחר מכן המערכת עוקבת אחרי הביקור של המשתמש על ידי ביצוע פעולת Increment בשורה של כתובת האימייל של המשתמש:

tbl := client.Open(tableName)
rmw := bigtable.NewReadModifyWrite()
rmw.Increment(familyName, u.Email, 1)
row, err := tbl.ApplyReadModifyWrite(ctx, u.Email, rmw)
if err != nil {
	return &appError{err, "Error applying ReadModifyWrite to row: " + u.Email, http.StatusInternalServerError}
}

אחרי שהשורה גדלה, הפונקציה מציגה דף HTML עם המספר הכולל של הביקורים של המשתמש הנוכחי.