หากคุณเป็นผู้ใช้ Firebase คุณน่าจะชื่นชมความสามารถในตัวในตัวเช่นสแน็ปช็อตแบบเรียลไทม์ทริกเกอร์ Firestore และการรับรองความถูกต้อง ฉันเพิ่งอ่านเกี่ยวกับ คิว deno และตระหนักได้ว่าหลังจากหลายปีของการใช้ Firebase ฉันไม่เคยอ่านเกี่ยวกับคิว Firebase คิว Firebase อยู่ที่ไหน?
กรณีใช้คิว firebase คิว
Ayrshare ถูกสร้างขึ้นบนฐาน Firebase โดยใช้ฟังก์ชั่น Firebase อย่างหนัก Ayrshare เป็นโซเชียลมีเดีย API และเราอนุญาตให้ผู้ใช้เผยแพร่หรือได้รับการวิเคราะห์บนเครือข่ายสังคมออนไลน์ อย่างไรก็ตามเมื่อเราเติบโตขึ้นเราก็ตระหนักว่าวิธีที่เราประมวลผลโพสต์ตามกำหนดเวลานั้นไม่เหมาะและกำลังผลักดันขีด จำกัด ทางสถาปัตยกรรม
เมื่อใดก็ตามที่ผู้ใช้สร้างโพสต์กำหนดการโดยใช้ Social API ของเราเราจะสร้างรายการในคอลเลกชัน Firestore ซึ่งเป็นคิวที่บ้าน อัน ฟังก์ชั่น Firebase ที่กำหนด รันหนึ่งนาทีเพื่อประมวลผลโพสต์ที่รอดำเนินการทั้งหมด ซึ่งหมายความว่าโพสต์ที่กำหนดเวลาหลายรายการจะถูกประมวลผลเข้าด้วยกันข้อยกเว้นในโพสต์เดียวอาจส่งผลกระทบต่อโพสต์อื่น ๆ และฟังก์ชั่นมีการหมดเวลาสูงสุดเก้านาทีต่อขีด จำกัด ของ Firebase
การปรับปรุงที่ชัดเจนคือฟังก์ชั่นที่กำหนดเวลาจะประมวลผลเพียงโพสต์ทีละโพสต์ แต่นั่นหมายถึงการประมวลผลแบบซิงโครนัสซึ่งจะทำให้การเผยแพร่ช้าลงอย่างมาก ในขณะที่เราสามารถเอาชนะความท้าทายเหล่านี้ด้วยกรวดมากขึ้นในตอนท้ายของวันเราจะพัฒนากลไกคิวที่ซับซ้อนของเราเอง สิ่งที่เราต้องการวิธีการเข้าคิวฟังก์ชั่นและประมวลผลอย่างอิสระ
ฟังก์ชั่น enqueue พร้อมงานคลาวด์
หลังจากค้นหา “คิว firebase” จำนวนมากคุณจะได้รับสิ่งที่เรียกว่า “ฟังก์ชั่น enqueue พร้อมงานคลาวด์“. ตามที่ Firebase อธิบาย:
ฟังก์ชั่นคิวงานใช้ประโยชน์จาก Google งานเมฆ เพื่อช่วยให้แอปของคุณใช้งานที่ใช้เวลานานการใช้ทรัพยากรมากหรือแบนด์วิดท์ จำกัด งานแบบอะซิงโครนัสนอกแอปพลิเคชันหลักของคุณ
เมื่อมองแวบแรกสิ่งนี้อาจไม่เหมือนทางออกที่ถูกต้อง แต่การขุดลึกลงไปเล็กน้อยคุณจะเห็นว่ามันสมบูรณ์แบบถ้ามีคำตอบที่ซับซ้อนเล็กน้อย
หากต้องการใส่คำศัพท์คนธรรมดาคุณจะสร้างคิว Firebase เช่นงานคลาวด์เพิ่มข้อมูลลงในคิวและกระบวนการ Firebase อื่นจะทำงานสำหรับแต่ละรายการเช่นงานในคิว

วิธีใช้คิว Firebase
มาดำดิ่งลงไปในรหัสบางอย่างเกี่ยวกับวิธีการสร้างเพิ่มงานและประมวลผลงานเหล่านั้นในฐาน Firebase
สร้างและเพิ่มลงในคิว
เราจะเริ่มต้นด้วยการสร้างคิวและเพิ่มงาน
const { getFunctions } = require("firebase-admin/features");
const enqueueScheduledPosts = async () => {
log("Beginning enqueueScheduledPosts");
const posts = await gatherScheduledPosts();
const queue = getFunctions().taskQueue("postTask");
const targetUri = await getFunctionUrl("postTaskFunction");
const enqueues = ();
posts.forEach((publish) => {
enqueues.push(
queue.enqueue(publish, {
scheduleDelaySeconds: 1,
dispatchDeadlineSeconds: 60 * 8, // 8 minutes
uri: targetUri
})
);
});
await Promise.all(enqueues).catch((err) =>
el("Error with enqueues:", posts, err)
);
log("Ending enqueueScheduledPosts");
};
ฟังก์ชั่นแรกนี้ gatherScheduledPosts
รวบรวมโพสต์ทั้งหมดที่ต้องดำเนินการ
จากนั้นเราสร้างคิวชื่อ postTask
กับ getFunctions().taskQueue("postTask")
– โพสต์ทั้งหมดจะถูกเพิ่มเข้ามาในคิวนี้
ต่อไปเราจะได้รับไฟล์ targetUri
ของฟังก์ชั่นด้วย getFunctionUrl("postTaskFunction")
ที่จะดำเนินการแต่ละงานในคิว การค้นหาตำแหน่ง URI นั้นกล่าวถึงด้านล่าง
ตอนนี้เราสามารถ enqueue แต่ละงานด้วย queue.enqueue(information, choices)
– คุณส่งผ่านข้อมูลพารามิเตอร์ที่มีข้อมูลที่คุณต้องการประมวลผลและตัวเลือกคิว JSON ในตัวอย่างของเราเราส่ง:
scheduleDelaySeconds
– ระยะเวลาที่จะล่าช้าระหว่างการประมวลผลงานแต่ละครั้ง นี่เป็นทางเลือกdispatchDeadlineSeconds
– การหมดเวลาของฟังก์ชั่นการประมวลผลงาน นี่เป็นทางเลือกuri
– URI เป้าหมายของฟังก์ชั่นในการประมวลผลงาน สิ่งนี้จำเป็น
ที่ enqueue
ฟังก์ชั่นส่งคืนสัญญาเพื่อให้คุณสามารถประมวลผลได้ด้วย สัญญาทั้งหมด การทำงาน. เมื่อเสร็จสิ้นงานทั้งหมดจะอยู่ในคิวและพร้อมที่จะประมวลผล
ค้นหาฟังก์ชันคิว URI
ฟังก์ชั่น URI เป็นเพียง URL ของฟังก์ชั่นที่จะเรียกสำหรับแต่ละงาน: https://functionName-code-locId.a.run.app
ในขณะที่คุณสามารถกำหนดรหัส URI ของฟังก์ชั่นการประมวลผลงานได้ แต่ก็เป็นการดีกว่าสำหรับการใช้ซ้ำและการบำรุงรักษาเพื่อทำการค้นหาฟังก์ชั่น
const getFunctionUrl = async (identify, location = "us-central1") => {
const { GoogleAuth } = require("google-auth-library");
const gAuth = new GoogleAuth({
scopes: "https://www.googleapis.com/auth/cloud-platform"
});
const projectId = await gAuth.getProjectId();
const url =
"https://cloudfunctions.googleapis.com/v2beta/" +
`tasks/${projectId}/areas/${location}/features/${identify}`;
const consumer = await gAuth.getClient();
const res = await consumer.request({ url });
const uri = res.information?.serviceConfig?.uri;
if (!uri) {
throw new Error(`Unable to retreive uri for perform at ${url}`);
}
console.log("Perform URL for Job:", identify, uri);
return uri;
};
รหัสทั้งหมดนี้ดูว่า URI ของฟังก์ชั่น ตัวอย่างเช่นการค้นหาอาจกลับมา: https://postTaskFunction-93ks02p21-uc.a.run.app
ประมวลผลงานคิว
ขั้นตอนสุดท้ายคือการประมวลผลงานทั้งหมดในคิว
const { onTaskDispatched } = require("firebase-functions/v2/duties");
exports.processScheduledPosts = onTaskDispatched(
{
retryConfig: {
maxAttempts: 1
},
rateLimits: {
maxConcurrentDispatches: 25
},
timeoutSeconds: 480,
reminiscence: "2GiB"
},
async (req) => {
const { information } = req;
return processPost(information);
);
เราใช้ฟังก์ชั่น firebase ในตัว onTaskDispatched
เพื่อประมวลผลแต่ละงาน คุณดึงข้อมูลที่ส่งไปยังฟังก์ชั่นในวัตถุคำขอ req
และแยกไฟล์ information
วัตถุ. การประมวลผลสามารถทำได้ในชุดข้อมูลเช่น processPost
–
ที่ onTaskDispatched
งานต้องการพารามิเตอร์หลายตัว:
retryConfig
– มีการพยายามลองกี่ครั้งหากเกิดข้อผิดพลาดrateLimit
– จำนวนกระบวนการพร้อมกันที่อนุญาตtimeoutSeconds
– จำนวนวินาทีก่อนฟังก์ชั่นหมดเวลาreminiscence
– หน่วยความจำที่จัดสรรให้กับฟังก์ชั่นมากแค่ไหน โปรดดูฐาน Firebase การกำหนดราคาฟังก์ชันคลาวด์–
การบันทึกคิว Firebase ใน Log Explorer
ข้อได้เปรียบที่ยอดเยี่ยมอีกประการหนึ่งของการใช้คิวงานคลาวด์คือการแบ่งส่วนของบันทึกต่องาน
ใน Google Cloud Log Explorer ค้นหารายการที่งานบันทึก:

คลิกที่เส้นสีน้ำเงินสี่เส้น:

และเลือก“ รายการแสดงสำหรับการติดตามนี้” ตอนนี้คุณจะเห็นเฉพาะบันทึกสำหรับงานคลาวด์โดยเฉพาะ … ข้อได้เปรียบที่สำคัญในการพยายามถอดรหัสบันทึกผสม ตรวจสอบให้แน่ใจว่าได้ลบในฟิลด์ค้นหารายการยกเว้น“ hint = …”
คุณควรใช้งาน (และไม่ใช้) งาน Firebase enqueue เมื่อใด
หากคุณต้องการประมวลผลงานอย่างอิสระแบบอะซิงโครนัสและพร้อมกันคิว Firebase กับงานคลาวด์นั้นเหมาะสมมาก แม้ว่าคุณจะมีความต้องการในการเข้าคิวอย่างง่ายคุณก็สามารถใช้งานคลาวด์ได้ มันง่ายจริงๆเมื่อคุณได้รับการตั้งค่าทุกอย่าง
ค่าใช้จ่ายข้อแม้เป็นค่าใช้จ่าย เพราะคุณกำลังเรียกฟังก์ชั่น firebase สำหรับทุกงานคิวที่คุณจะต้องจ่ายสำหรับทุกการวิ่ง คุณจะต้องมีน้ำหนักค่าใช้จ่ายเทียบกับมูลค่าของงานคลาวด์เหล่านี้และคุณอาจพบคิว Firestore อย่างง่ายตามที่กล่าวไว้ในกรณีการใช้งานข้างต้นตรงกับความต้องการของคุณ
โดยรวมแล้ว Ayrshare เปลี่ยนไปใช้คิว Firebase ด้วยงานคลาวด์เป็นสถาปัตยกรรมใหม่ที่สมบูรณ์แบบซึ่งเพิ่มความยืดหยุ่นความเร็วและการบำรุงรักษาของเรา
เกี่ยวกับ Ayrshare
Ayrshare เป็น โซเชียลมีเดีย API ที่ช่วยให้คุณเผยแพร่โพสต์รับการวิเคราะห์จัดการความคิดเห็นและส่งข้อความโดยตรงบนเครือข่ายสังคมออนไลน์โดยตรงจากแพลตฟอร์มของคุณ เรียนรู้เพิ่มเติมใน เอกสาร API โซเชียลมีเดีย–