Latar Belakang
Saya sedang mengerjakan aplikasi untuk klien yang menyertakan beberapa fitur jejaring sosial. Saya awalnya mengembangkan front-end mobile, tetapi keadaan telah membuat saya bertanggung jawab untuk mengembangkan back-end juga.
Sebagai latar belakang umum, sistem kami memungkinkan pengguna untuk mengikuti pengguna lain dan menerima pemberitahuan tentang yang mereka ikuti, seperti yang Anda harapkan dari jejaring sosial. Peringatan adalah bahwa hanya sebagian kecil (paling sedikit beberapa ratus) pengguna akan dapat ditindaklanjuti, dengan harapan bahwa sebagian besar basis pengguna akan mengikuti setidaknya satu dari individu-individu ini.
Di sisi UI, kami akan memiliki tombol pemberitahuan dengan nomor di atasnya, dan mengklik tombol akan membawa Anda ke layar pemberitahuan.
Masalah
Saya telah meneliti strategi untuk mengimplementasikan notifikasi dan sebagian besar sumber daya yang saya temukan poin untuk membuat satu atau lebih tabel notifikasi dalam database. (Contoh yang saya suka adalah jawaban yang diterima di sini: /programming/9735578/building-a-notification-system ).
Hal yang membuat saya kecewa adalah bahwa sebagian besar strategi yang digerakkan oleh basis data untuk notifikasi memerlukan memasukkan satu baris untuk setiap notifikasi untuk setiap pengikut. Jadi, jika seribu orang mengikuti Sally, kami memasukkan seribu baris ke tabel yang sesuai. Apakah itu scalable? Apa yang terjadi jika kita sampai pada titik di mana puluhan atau ratusan ribu pengguna mengikuti Sally dan dia membuat beberapa lusin posting per hari?
Gagasan asli saya adalah menangani semuanya dengan kueri: angka pada tombol notifikasi akan diperoleh dengan meminta penghitungan baris pada konten yang diposting lebih baru daripada terakhir kali Anda mengunjungi layar notifikasi, sementara notifikasi individual akan dihasilkan dari kueri yang lebih terperinci ketika Anda mengunjungi layar notifikasi. Pendekatan ini tidak memerlukan penulisan atau penyimpanan tambahan, tetapi tidak fleksibel dan mungkin akan menghantam server dengan cukup keras.
MEMPERSIAPKAN
Backend (seperti yang dibuat oleh pengembang sebelumnya) menggunakan CodeIgniter dan database MySQL . Saat ini sedang berjalan di GoDaddy shared hosting account jelek, tapi saya berasumsi (harap?) Ini akan ditingkatkan sebelum kita masuk ke produksi dan paket hosting akan diskalakan dengan pertumbuhan pengguna.
Saat ini satu-satunya front-end kami adalah aplikasi seluler, tetapi kami berencana untuk kemudian membangun situs web juga. Saya tidak khawatir saat ini dengan mendapatkan pembaruan push real-time dari server tentang notifikasi.
TAMBAHAN
Saya tidak berspesialisasi dalam backend dan saya di atas kepala saya di departemen itu. Klien mengetahuinya, dan saya telah melakukan yang terbaik untuk mencoba menjelaskan ruang lingkup proyek semacam ini, tetapi mereka telah menjelaskan bahwa pada titik ini mereka tidak akan mempercayai orang lain untuk mengerjakan proyek tersebut. Kami mungkin memiliki satu bulan lagi pekerjaan yang harus dilakukan sebelum kami dapat mulai menambahkan penguji dan saya bisa mendapatkan segala jenis metrik kinerja. Saya benar-benar tidak dapat memperkirakan berapa banyak pengguna yang kami miliki atau perangkat keras apa yang mungkin kami pakai dalam 5 tahun ke depan, tetapi saya pikir klien mengharapkan ratusan ribu pengguna atau lebih.
Saya harap ini masalah yang cukup spesifik untuk diposting di sini; Saya bisa memperbaikinya jika perlu. Silakan tanyakan apakah Anda memiliki pertanyaan atau saya telah menghilangkan detail penting.
tl; dr
- Apakah sistem notifikasi berbasis database memiliki implikasi negatif untuk skalabilitas jangka panjang ketika semua pengguna hanya mengikuti beberapa dari beberapa ratus orang yang sama?
- Apakah ada cara untuk membuat basis data notifikasi digerakkan tanpa perlu baris pemberitahuan terpisah untuk setiap notifikasi untuk setiap pengikut?
- Apakah sistem notifikasi yang sepenuhnya didorong oleh permintaan dapat diskalakan, atau memiliki kelebihan selain tidak menulis data ke DB?
- Apakah saya terlalu banyak berpikir terlalu dini? Haruskah saya membangun sesuatu yang berfungsi untuk saat ini dan kita dapat khawatir tentang mengoptimalkannya jika itu menjadi masalah, mengingat klien memiliki anggaran terbatas dan kita belum tahu apakah produk akhir akan populer?
sumber
Jawaban:
Ya, asalkan tabel database diindeks dengan benar.
Anda akan menghasilkan beberapa lusin atau ratusan ribu catatan notifikasi per hari untuk Sally, dengan asumsi Anda ingin melacak setiap notifikasi selamanya. Persentase pengguna seperti Sally dengan lalu lintas semacam itu selalu sangat kecil.
Ini sepertinya tidak perlu rumit. Jika Anda membutuhkan statistik terperinci tentang pemberitahuan, cukup simpan pemberitahuan.
Itu sebabnya ini berhasil ... sejumlah kecil orang selalu menghasilkan sebagian besar lalu lintas.
Ya ... Jangan menyimpan notifikasi; cukup kirim email pemberitahuan, dengan gaya api-dan-lupakan. Atau, simpan notifikasi untuk jangka waktu tertentu, lalu buang. Atau, buang setiap pemberitahuan setelah dibaca.
Saya tidak yakin apa yang Anda maksudkan dengan ini. Jika Anda ingin meminta pemberitahuan, Anda harus menyimpannya di basis data. Kalau tidak, tidak ada yang ditanyakan.
Bicaralah dengan seseorang yang dapat membantu Anda merancang basis data yang diindeks dan dinormalkan dengan benar dengan tabel yang benar di dalamnya. Saya tidak melihat alasan mengapa database seperti itu tidak dapat secara efektif menangani skenario yang Anda gambarkan.
Contoh kehidupan nyata
Sejauh yang saya tahu, Stack Exchange menyimpan segala sesuatu untuk selamanya, termasuk semua notifikasi. Mereka menggunakan teknologi database yang mirip dengan MySql, dan beberapa teknologi caching. Sementara perangkat keras dan ruang penyimpanan mereka sangat besar, jumlah lalu lintas yang mereka dapatkan adalah masalah yang baik.
sumber