ฉันกำลังเริ่มสร้างระบบแจ้งเตือนสไตล์ Facebook สำหรับหน้าของเรา (ประเภทเกมโซเชียล) และตอนนี้ฉันกำลังค้นคว้าว่าอะไรจะเป็นวิธีที่ดีที่สุดในการออกแบบระบบดังกล่าว ฉันไม่สนใจที่จะส่งการแจ้งเตือนไปยังผู้ใช้หรืออะไรทำนองนั้น (ตอนนี้ยัง) ฉันกำลังค้นคว้าวิธีการสร้างระบบบนเซิร์ฟเวอร์ (วิธีจัดเก็บการแจ้งเตือนตำแหน่งที่จะจัดเก็บพวกเขาวิธีการดึงข้อมูลพวกเขา ฯลฯ ... )
ดังนั้น ... ข้อกำหนดบางประการที่เรามี:
- ในช่วงเวลาเร่งด่วนเรามีผู้ใช้ที่เข้าสู่ระบบพร้อมกันประมาณ 1k (และแขกอีกหลายคน แต่พวกเขาไม่สำคัญที่นี่เพราะพวกเขาจะไม่มีการแจ้งเตือน) ที่จะสร้างกิจกรรมมากมาย
- จะมีการแจ้งเตือนประเภทต่างๆ (ผู้ใช้ A เพิ่มคุณเป็นเพื่อนผู้ใช้ B ได้แสดงความคิดเห็นในโปรไฟล์ของคุณผู้ใช้ C ชอบรูปของคุณผู้ใช้ D ทำให้คุณชนะในเกม X, ... )
- กิจกรรมส่วนใหญ่จะสร้างการแจ้งเตือน 1 รายการสำหรับผู้ใช้ 1 ราย (ผู้ใช้ X ชอบรูปของคุณ) แต่จะมีบางกรณีที่เหตุการณ์หนึ่งเหตุการณ์จะสร้างการแจ้งเตือนจำนวนมาก (เช่นวันเกิดของผู้ใช้ Y เป็นต้น)
- ควรจัดกลุ่มการแจ้งเตือนด้วยกัน ถ้าเช่นผู้ใช้สี่คนที่แตกต่างกันเช่นภาพบางภาพเจ้าของควรได้รับการแจ้งเตือนหนึ่งรายการซึ่งระบุว่าผู้ใช้สี่คนชอบภาพและไม่ใช่การแจ้งเตือนสี่แยกต่างหาก (เช่นเดียวกับ FB)
ตกลงดังนั้นสิ่งที่ฉันคิดคือฉันควรสร้างคิวบางประเภทที่ฉันจะเก็บเหตุการณ์เมื่อเกิดขึ้น จากนั้นฉันจะมีงานพื้นหลัง ( Gearman ?) ที่จะดูคิวนั้นและสร้างการแจ้งเตือนตามเหตุการณ์เหล่านั้น งานนี้จะจัดเก็บการแจ้งเตือนในฐานข้อมูลสำหรับผู้ใช้แต่ละคน (ดังนั้นหากเหตุการณ์มีผลกระทบต่อผู้ใช้ 10 คนจะมีการแจ้งเตือนแยกต่างหาก 10 รายการ) จากนั้นเมื่อผู้ใช้เปิดหน้ารายการการแจ้งเตือนฉันจะอ่านการแจ้งเตือนทั้งหมดสำหรับเขา (เราหวังว่าจะ จำกัด การแจ้งเตือนล่าสุดนี้ไว้ที่ 100 การแจ้งเตือนล่าสุด) และจัดกลุ่มการแจ้งเตือนเหล่านั้นเข้าด้วยกัน
สิ่งที่ฉันกังวลเกี่ยวกับวิธีการนี้:
- ซับซ้อนเหมือนนรก :)
- เป็นฐานข้อมูลที่เก็บข้อมูลที่ดีที่สุดที่นี่ (เราใช้ MySQL) หรือฉันควรใช้อย่างอื่น (สีแดงดูเหมือนว่าจะพอดีดีเกินไป)
- ฉันควรเก็บสิ่งใดไว้เป็นการแจ้งเตือน ID ผู้ใช้ ID ผู้ใช้ที่เริ่มต้นเหตุการณ์ประเภทของเหตุการณ์ (เพื่อให้ฉันสามารถจัดกลุ่มพวกเขาและแสดงข้อความที่เหมาะสม) แต่แล้วฉันก็ไม่รู้วิธีการจัดเก็บข้อมูลที่แท้จริงของการแจ้งเตือน (เช่น URL และชื่อของภาพที่ ถูกชอบ) ฉันควร "อบ" ข้อมูลนั้นเมื่อฉันสร้างการแจ้งเตือนหรือฉันควรจัดเก็บ ID ของบันทึก (รูปภาพโปรไฟล์ ... ) ได้รับผลกระทบและดึงข้อมูลออกจากฐานข้อมูลเมื่อแสดงการแจ้งเตือน
- ประสิทธิภาพควรจะตกลงที่นี่แม้ว่าฉันจะต้องดำเนินการแจ้งเตือน 100 รายการแบบทันทีขณะแสดงหน้าการแจ้งเตือน
- ปัญหาประสิทธิภาพที่เป็นไปได้ในทุกคำขอเพราะฉันจะต้องแสดงจำนวนการแจ้งเตือนที่ยังไม่ได้อ่านให้กับผู้ใช้ (ซึ่งอาจเป็นปัญหาในตัวเองตั้งแต่ฉันจะจัดกลุ่มการแจ้งเตือนด้วยกัน) สิ่งนี้สามารถหลีกเลี่ยงได้หากฉันสร้างมุมมองการแจ้งเตือน (ซึ่งจัดกลุ่มไว้) ในพื้นหลังและไม่ใช่แบบทันที
แล้วคุณคิดอย่างไรเกี่ยวกับวิธีแก้ไขปัญหาที่เสนอและข้อกังวลของฉัน โปรดแสดงความคิดเห็นหากคุณคิดว่าฉันควรพูดถึงสิ่งอื่นที่จะเกี่ยวข้องที่นี่
โอ้เรากำลังใช้ PHP สำหรับหน้าของเรา แต่นั่นไม่ควรเป็นปัจจัยใหญ่ที่ฉันคิด