Back
Programmingไทย language flag ไทย

Batch Writes ทำให้ชีวิตเศร้า? ลอง BulkWriter แล้วจะติดใจ | [Firestore]

แชร์ประสบการณ์ตรงจาก 25 นาที เหลือ 2 นาที! เรียนรู้ความแตกต่างระหว่าง Batch Writes และ BulkWriter ใน Firestore เพื่อเขียนข้อมูลจำนวนมากได้เร็วขึ้น

Xaypanya Phongsa - Author profile picture

Xaypanya Phongsa

Software Engineer passionate about modern web technologies

Batch Writes ทำให้ชีวิตเศร้า? ลอง BulkWriter แล้วจะติดใจ | [Firestore] - Article header image

Batch Writes ทำให้ชีวิตเศร้า? ลอง BulkWriter แล้วจะติดใจ | [Firestore]

สวัสดีครับเพื่อนๆ Developer ทุกท่าน! วันนี้ผมจะมาแชร์ประสบการณ์ตรงที่เปลี่ยนชีวิตการเขียนข้อมูลลง Firestore ของผมไปตลอดกาล

เมื่อก่อนผมใช้ Batch Writes ในการเขียนข้อมูลลง Firestore เป็นประจำ เพราะคิดว่ามันก็โอเคอยู่แล้ว แต่พอต้องจัดการข้อมูลจำนวนมากๆเท่านั้นแหละครับ ถึงรู้ว่า Batch Writes มัน "หน่วง" ขนาดไหน!

เรื่องมันเริ่มจาก

ผมได้รับมอบหมายให้ Import ข้อมูลจาก CSV File ลง Firestore จำนวน 50,000 Documents ตอนแรกก็มั่นใจครับใช้ Batch Writes นี่แหละ เขียนวน Loop ไปเรื่อยๆ

// แบบเดิมที่ใช้ Batch Writes
const batch = db.batch();
const BATCH_SIZE = 500; // ขีดจำกัดของ Firestore
let operationCount = 0;
let batchCount = 0;

for (const item of data) {
  const docRef = db.collection('products').doc();
  batch.set(docRef, item);
  operationCount++;

  if (operationCount === BATCH_SIZE) {
    await batch.commit();
    console.log(`Batch ${++batchCount} committed`);
    operationCount = 0;
  }
}

// Commit ส่วนที่เหลือ
if (operationCount > 0) {
  await batch.commit();
}

ทำไปทำมา…ใช่ครับ 25 นาที! ผมแทบอยากจะร้องไห้ นี่มันยุค 5G แล้วนะ ทำไมการเขียนข้อมูลมันช้าขนาดนี้! ผมเริ่มรู้สึกว่าชีวิตมันเศร้าหมอง งานก็ไม่เสร็จสักที

จนกระทั่ง…เพื่อนร่วมทีมแนะนำให้ลองใช้ BulkWriter

Firestore BulkWriter Introduction

ผมก็แบบ "อะไรวะเนี่ย ไม่เคยได้ยิน" แต่ด้วยความที่หมดหวังมากๆ ก็เลยลองดู

ปรากฏว่า… ใช่ครับ 2 นาที! ข้อมูล 50,000 Documents ถูกเขียนลง Firestore เรียบร้อย! ตอนนั้นผมรู้สึกเหมือนเจอแสงสว่างที่ปลายอุโมงค์ชีวิตกลับมาสดใสอีกครั้ง

ตัวอย่างการใช้ BulkWriter สำหรับแทรกเอกสาร 50,000 รายการในคอลเลคชัน "Products"

const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();

// สร้าง BulkWriter สำหรับเขียนข้อมูลแบบ high-throughput
const bulkWriter = db.bulkWriter();

// จัดการ error: retry หากเกิดข้อผิดพลาดที่สามารถ retry ได้ (เช่น error code 10)
bulkWriter.onWriteError((error) => {
  console.error(`เขียนเอกสาร ${error.documentRef.id} ล้มเหลว:`, error);
  if (error.code === 10) {
    return true; // retry
  }
  return false;
});

const productsCollection = db.collection('Products');

// แทรกเอกสาร 50,000 รายการ
for (let i = 0; i < 50000; i++) {
  const docRef = productsCollection.doc(`product_${i}`);
  const productData = {
    name: `Product ${i}`,
    price: Math.floor(Math.random() * 100) + 1, 
    category: 'Category A',
    inStock: true,
    createdAt: admin.firestore.FieldValue.serverTimestamp()
  };
  bulkWriter.set(docRef, productData);
}

// วัดเวลาในการแทรกเอกสาร
console.time('BulkInsertProducts');

bulkWriter.close()
  .then(() => {
    console.timeEnd('BulkInsertProducts');
    console.log('แทรก 50,000 เอกสารในคอลเลคชัน Products สำเร็จ');
  })
  .catch((error) => {
    console.error('เกิดข้อผิดพลาดในการแทรกเอกสาร:', error);
  });

ตัวอย่างที่ Process จริงจาก Production

Firestore Production Example

BulkWriter มันดียังไง?

  • ความเร็ว: เร็วกว่า Batch Writes แบบคนละโลก! (จาก 25 นาที เหลือ 2 นาที นี่ไม่ต้องสืบ)
  • จัดการ Retry ให้เอง: ถ้าเขียนข้อมูลพลาดมัน Retry ให้เองอัตโนมัติ
  • ชีวิตง่ายขึ้น: เขียนโค้ดง่ายกว่า Batch Writes เยอะ ไม่ต้องมานั่งปวดหัวกับการแบ่ง Batch

จาก Firebase documentation แนะนำว่า

"For writing a large number of documents, consider using a bulk writer instead of the atomic batch writer." (สำหรับการเขียน documents จำนวนมาก ให้พิจารณาใช้ bulk writer แทน atomic batch writer)

BulkWriter เหมาะกับใคร?

  • คนที่ต้องเขียนข้อมูลจำนวนมากลง Firestore เป็นประจำ
  • คนที่ต้องการความเร็วในการเขียนข้อมูล
  • คนที่ขี้เกียจ Debug โค้ด (แบบผม 555)

หลังจากได้ลองใช้ BulkWriter ผมก็ไม่กลับไปใช้ Batch Writes อีกเลย ชีวิตการเขียนข้อมูลลง Firestore ของผมง่ายขึ้น เร็วขึ้น และมีความสุขมากขึ้นเยอะ!

ที่สำคัญคือ อย่าลืมศึกษา Best Practices จาก Firebase documentation เพื่อออกแบบและใช้งาน Firestore ได้อย่างมีประสิทธิภาพสูงสุดนะครับ (ผมก็พยายามอยู่เช่นกัน 5555)

Happy Coding 😊!

#Firestore #Firebase #BulkWriter #Batch Writes #Database #Performance