ระบบแจ้งเตือนเครือข่ายสังคม


10

พื้นหลัง

ฉันกำลังทำงานกับแอพสำหรับลูกค้าที่มีคุณสมบัติเครือข่ายสังคมบางอย่าง ตอนแรกฉันพัฒนามือถือส่วนหน้า แต่สถานการณ์ก็ทำให้ฉันต้องรับผิดชอบด้านการพัฒนาด้านหลังเช่นกัน

ในฐานะที่เป็นพื้นหลังทั่วไประบบของเราอนุญาตให้ผู้ใช้ติดตามผู้ใช้รายอื่นและรับการแจ้งเตือนเกี่ยวกับสิ่งที่พวกเขากำลังติดตามดังที่คุณคาดหวังจากเครือข่ายสังคมออนไลน์ ข้อแม้คือว่าจะมีเพียงผู้ใช้ชุดย่อยขนาดเล็ก (อย่างน้อยไม่กี่ร้อย) โดยมีความคาดหวังว่าฐานผู้ใช้ส่วนใหญ่จะติดตามบุคคลเหล่านี้อย่างน้อยหนึ่งคน

ทางด้าน UI เราจะมีปุ่มแจ้งเตือนพร้อมตัวเลขและการคลิกปุ่มจะนำคุณไปยังหน้าจอการแจ้งเตือน

ปัญหา

ฉันค้นคว้ากลยุทธ์ในการใช้งานการแจ้งเตือนและทรัพยากรส่วนใหญ่ที่ฉันพบพบว่าสร้างตารางการแจ้งเตือนหนึ่งตารางขึ้นไปในฐานข้อมูล (ตัวอย่างที่ฉันชอบคือคำตอบที่ยอมรับได้ที่นี่: /programming/9735578/building-a-notification-system )

สิ่งที่ทิ้งฉันไปคือกลยุทธ์การขับเคลื่อนฐานข้อมูลส่วนใหญ่สำหรับการแจ้งเตือนจำเป็นต้องแทรกแถวสำหรับการแจ้งเตือนแต่ละรายการสำหรับผู้ติดตามแต่ละคน ดังนั้นหากคนนับพันติดตามแซลลี่เราจะแทรกหนึ่งพันแถวลงในตารางที่เกี่ยวข้อง ปรับขนาดได้หรือไม่ จะเกิดอะไรขึ้นถ้าเราไปถึงจุดที่ผู้ใช้หลายสิบหรือหลายแสนคนติดตาม Sally และเธอกำลังโพสต์ไม่กี่โหลต่อวัน

แนวคิดดั้งเดิมของฉันคือการจัดการทุกอย่างด้วยข้อความค้นหา: หมายเลขบนปุ่มแจ้งเตือนจะได้รับโดยขอจำนวนแถวของเนื้อหาที่โพสต์เร็วกว่าครั้งล่าสุดที่คุณเยี่ยมชมหน้าจอการแจ้งเตือนในขณะที่การแจ้งเตือนแต่ละรายการจะถูกสร้างขึ้น เมื่อคุณเยี่ยมชมหน้าจอการแจ้งเตือน วิธีนี้จะไม่ต้องมีการเขียนหรือการเก็บข้อมูลเพิ่มเติม แต่ยืดหยุ่นและอาจค้อนเซิร์ฟเวอร์ค่อนข้างยาก

ติดตั้ง

แบ็กเอนด์ (ตามที่กำหนดโดยผู้พัฒนาก่อนหน้านี้) ใช้CodeIgniterและฐานข้อมูลMySQL ขณะนี้กำลังทำงานบนบัญชีโฮสติ้งที่ใช้ร่วมกันแบบเส็งเคร็ง GoDaddy แต่ฉันคิดว่า (หวังว่า) สิ่งนี้จะได้รับการอัปเกรดก่อนที่เราจะเข้าสู่การผลิตและแพ็คเกจโฮสติ้งจะถูกปรับสัดส่วนตามการเติบโตของผู้ใช้

ปัจจุบันส่วนหน้าของเราคือแอพมือถือ แต่เราวางแผนที่จะสร้างเว็บไซต์ในภายหลัง ฉันไม่ได้กังวลเกี่ยวกับการได้รับการอัพเดตแบบพุชแบบเรียลไทม์จากเซิร์ฟเวอร์เกี่ยวกับการแจ้งเตือน

ภาคผนวก

ฉันไม่เชี่ยวชาญในแบ็กเอนด์และฉันอยู่ในหัวของฉันในแผนกนั้น ลูกค้ารู้และฉันพยายามอย่างเต็มที่ที่จะอธิบายขอบเขตของโครงการในลักษณะนี้ แต่พวกเขาทำให้มันชัดเจนว่า ณ จุดนี้พวกเขาจะไม่ไว้ใจคนอื่นให้ทำงานในโครงการ เราอาจมีงานอีกเดือนที่ต้องทำก่อนที่จะเริ่มเพิ่มผู้ทดสอบและฉันจะได้รับการวัดประสิทธิภาพใด ๆ ฉันไม่สามารถประมาณจำนวนผู้ใช้ที่เราอาจมีหรือฮาร์ดแวร์ที่เราอาจจะเปิดตัวในอีก 5 ปีข้างหน้า แต่ฉันคิดว่าลูกค้าหวังว่าจะมีผู้ใช้หลายแสนคนขึ้นไป

ฉันหวังว่านี่เป็นปัญหาเฉพาะที่ควรโพสต์ที่นี่ ฉันสามารถปรับแต่งได้ถ้าจำเป็นต้องเป็น โปรดถามว่าคุณมีคำถามใด ๆ หรือฉันไม่ได้ระบุรายละเอียดที่สำคัญ

TL; DR

  • ระบบการแจ้งเตือนที่ใช้ฐานข้อมูลมีผลกระทบเชิงลบต่อความสามารถในการขยายระบบในระยะยาวหรือไม่เมื่อผู้ใช้ทั้งหมดติดตามเพียงไม่กี่ร้อยคน
  • มีวิธีสร้างฐานข้อมูลการแจ้งเตือนโดยไม่ต้องการแถวการแจ้งเตือนแยกต่างหากสำหรับแต่ละการแจ้งเตือนสำหรับผู้ติดตามแต่ละคนหรือไม่
  • ระบบการแจ้งเตือนจากข้อความค้นหาทั้งหมดสามารถปรับขนาดได้หรือมีข้อได้เปรียบนอกเหนือจากการไม่เขียนข้อมูลใด ๆ ไปยังฐานข้อมูลหรือไม่
  • ฉันคิดอย่างนี้เร็วเกินไปไหม ฉันควรจะสร้างบางสิ่งที่ใช้งานได้ในตอนนี้และเราสามารถกังวลเกี่ยวกับการปรับให้เหมาะสมถ้าเป็นปัญหาเนื่องจากลูกค้ามีงบประมาณ จำกัด และเรายังไม่รู้ว่าผลิตภัณฑ์สุดท้ายจะได้รับความนิยมหรือไม่

คุณสามารถหมดอายุการแจ้งเตือนได้หรือไม่ ตัวอย่างเช่นลบอะไรที่มีอายุเกิน 2 สัปดาห์ นั่นควรจะทำให้สมดุลของขนาดของตารางที่ใช้มากขึ้นหรือน้อยลงเมื่อไซต์โตขึ้น
GrandmasterB

นั่นจะไม่เป็นปัญหาฉันกังวลมากขึ้นเกี่ยวกับประสิทธิภาพของการล็อกฐานข้อมูลที่เขียน 50,000 รายการในตารางการแจ้งเตือนทุกครั้งที่ผู้ใช้ที่เป็นที่นิยมโพสต์
45623

ฉันทำงานในโครงการที่มีระบบการแจ้งเตือนที่คล้ายกัน (แต่เล็กกว่า) ฉันมีกระบวนการพื้นหลังที่ดูคิวของโพสต์ใหม่และจัดการการแจ้งเตือน (ซึ่งในกรณีนี้คือการแทรกอีเมลในคิวที่สองเพื่อส่ง) มันไม่ใช่เวลาจริง แต่โดยทั่วไปแล้วมันจัดการทุกอย่างภายในสองสามนาที
GrandmasterB

คำตอบ:


10

ดังนั้นหากคนนับพันติดตามแซลลี่เราจะแทรกหนึ่งพันแถวลงในตารางที่เกี่ยวข้อง ปรับขนาดได้หรือไม่

ใช่จัดทำตารางฐานข้อมูลไว้อย่างเหมาะสม

จะเกิดอะไรขึ้นถ้าเราไปถึงจุดที่ผู้ใช้หลายสิบหรือหลายแสนคนติดตาม Sally และเธอกำลังโพสต์ไม่กี่โหลต่อวัน

คุณจะสร้างบันทึกการแจ้งเตือนไม่กี่สิบหมื่นหรือหลายแสนรายการต่อวันสำหรับ Sally โดยสมมติว่าคุณต้องการติดตามการแจ้งเตือนทุกครั้งในความเป็นอมตะ เปอร์เซ็นต์ของผู้ใช้อย่าง Sally ที่มีปริมาณการใช้งานน้อยมาก

แนวคิดดั้งเดิมของฉันคือการจัดการทุกอย่างด้วยข้อความค้นหา: หมายเลขบนปุ่มแจ้งเตือนจะได้รับโดยขอจำนวนแถวของเนื้อหาที่โพสต์เร็วกว่าครั้งล่าสุดที่คุณเยี่ยมชมหน้าจอการแจ้งเตือนในขณะที่การแจ้งเตือนแต่ละรายการจะถูกสร้างขึ้น เมื่อคุณเยี่ยมชมหน้าจอการแจ้งเตือน

ดูเหมือนจะซับซ้อนโดยไม่จำเป็น หากคุณต้องการสถิติโดยละเอียดเกี่ยวกับการแจ้งเตือนเพียงแค่จัดเก็บการแจ้งเตือน

ระบบการแจ้งเตือนที่ใช้ฐานข้อมูลมีผลกระทบเชิงลบต่อความสามารถในการขยายระบบในระยะยาวหรือไม่เมื่อผู้ใช้ทั้งหมดติดตามเพียงไม่กี่ร้อยคน

นั่นเป็นเหตุผลว่าทำไมมันใช้งานได้ ... มีคนจำนวนไม่มากที่สร้างปริมาณการเข้าชมเป็นจำนวนมากเสมอ

มีวิธีสร้างฐานข้อมูลการแจ้งเตือนโดยไม่ต้องการแถวการแจ้งเตือนแยกต่างหากสำหรับแต่ละการแจ้งเตือนสำหรับผู้ติดตามแต่ละคนหรือไม่

ใช่ ... อย่าเก็บการแจ้งเตือน เพียงส่งอีเมลแจ้งเตือนในรูปแบบไฟและลืม หรือเก็บการแจ้งเตือนในช่วงระยะเวลาหนึ่งแล้วละทิ้งการแจ้งเตือน หรือทิ้งแต่ละการแจ้งเตือนหลังจากอ่านแล้ว

ระบบการแจ้งเตือนจากข้อความค้นหาทั้งหมดสามารถปรับขนาดได้หรือมีข้อได้เปรียบนอกเหนือจากการไม่เขียนข้อมูลใด ๆ ไปยังฐานข้อมูลหรือไม่

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร หากคุณต้องการสอบถามการแจ้งเตือนคุณต้องเก็บไว้ในฐานข้อมูล มิฉะนั้นจะไม่มีอะไรให้ค้นหา

ฉันคิดอย่างนี้เร็วเกินไปไหม

พูดคุยกับใครบางคนที่สามารถช่วยคุณออกแบบฐานข้อมูลที่ทำดัชนีให้เป็นมาตรฐานได้อย่างถูกต้องพร้อมกับตารางที่ถูกต้อง ฉันไม่เห็นเหตุผลที่ฐานข้อมูลดังกล่าวไม่สามารถจัดการกับสถานการณ์ที่คุณอธิบายได้อย่างมีประสิทธิภาพ

ตัวอย่างชีวิตจริง

เท่าที่ฉันรู้ Stack Exchange จะเก็บทุกอย่างไว้ในความเป็นอมตะรวมถึงการแจ้งเตือนทั้งหมด พวกเขาใช้เทคโนโลยีฐานข้อมูลคล้ายกับ MySql และเทคโนโลยีแคชบางอย่าง ในขณะที่ฮาร์ดแวร์และพื้นที่เก็บข้อมูลของพวกเขาเป็นจำนวนมากปริมาณการรับส่งข้อมูลเป็นปัญหาที่ดี


ว้าวคุณพูดทุกอย่างของ friggin! ขอบคุณโรเบิร์ต! ฐานข้อมูลเป็นมาตรฐาน แต่ฉันยังไม่ได้ดูการจัดทำดัชนี น่าเสียดายที่ฉันไม่สามารถ "คุยกับคนที่สามารถช่วยฉันได้" เนื่องจากข้อกำหนดเข้มงวดว่าฉันไม่สามารถพูดคุยรายละเอียดที่เฉพาะเจาะจงของโครงการกับใครและลูกค้าได้รับจนถึงจุดที่พวกเขาจะไม่ไว้ใจใคร แต่ฉันในโครงการ ... ดีฉันควรจะสามารถทำวิจัยบางอย่างเกี่ยวกับการจัดทำดัชนี ขอบคุณ!
45623

1
กฎทั่วไปของหัวแม่มือสำหรับการจัดทำดัชนี: Foreign Key ทุกตัวควรทำดัชนีด้วยการทำซ้ำที่เป็นไปได้ คีย์หลักทุกตัวควรได้รับการจัดทำดัชนีแล้ว ฟิลด์ที่คุณจะต้องค้นหาหรือใช้คำสั่งย่อย WHERE ที่ควรทำดัชนี; เหล่านั้นควรจะน้อย
Robert Harvey

1
สิ่งนี้ไม่ถูกต้อง ไม่สามารถปรับขนาดได้ สำหรับ "แซลลี่" ทุกคนคุณกำลังสร้างแถว N แถวโดยที่ N คือจำนวนผู้ใช้ของคุณ สิ่งนี้จะกลายเป็นปัญหาอย่างรวดเร็วหากคุณมีผู้ใช้จำนวนพอสมควร 100 "Sallys" โพสต์ 10 ครั้งถึง 10,000 ผู้ใช้คือ 10 ล้านแถวต่อวัน - ฟังดูไม่ดีใช่มั้ย สิ่งที่คุณต้องการทำคือกลับด้านนี้และสร้างหนึ่งแถวต่อโพสต์ "Sally" และให้ผู้ใช้ทุกคนติดตาม Sally เหล่านี้แทนสำเนาส่วนตัวของพวกเขา ของหลักสูตรนี้จะทำให้เกิดปัญหาหากคุณต้องการตรรกะเฉพาะผู้ใช้ (เช่นการรวม) ...
Ben

1
... คำอธิบาย "หลีกเลี่ยงแถวต่อการโพสต์" ที่นี่เห็นได้ชัดว่าคนฟางเนื่องจากระบบส่วนใหญ่จะต้องโพสต์เหล่านี้ติดอยู่รอบ ๆ นอกจากนี้คุณไม่ควรหลีกเลี่ยงข้อความค้นหา "เพราะมันซับซ้อน" คุณหลีกเลี่ยงคำถามเหล่านี้เพราะจะทำให้เกิดค่าใช้จ่ายที่ไม่ยั่งยืนในขณะที่ระบบขยายขนาด
Ben
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.