Aplikasi akan terus menerus (sekitar setiap detik) mengumpulkan lokasi pengguna dan menyimpannya.
Data ini terstruktur. Dalam database relasional, itu akan disimpan sebagai:
| user | timestamp | latitude | longitude |
Namun, terlalu banyak data. Akan ada 60 × 60 × 24 = 86.400 catatan per pengguna, setiap hari. Bahkan dengan 1000 pengguna, ini berarti 86.400.000 catatan setiap hari.
Dan tidak hanya 86.400.000 catatan setiap hari. Karena catatan ini akan diproses dan versi yang diproses akan disimpan juga. Jadi, kalikan jumlahnya dengan sekitar 2.
Bagaimana saya berencana menggunakan data
Pada dasarnya, saya berencana untuk membuat versi kasar dari data lokasi untuk konsumsi yang lebih mudah. Itu adalah:
- Sortir cap waktu data yang diterima.
- Berada di daftar ini secara berurutan, tentukan apakah lokasi telah berubah secara signifikan (dengan memeriksa seberapa banyak garis lintang dan garis bujur berubah)
- Mewakili perubahan lokasi yang tidak signifikan sebagai satu entri dalam output (karenanya, output adalah versi kasar dari data lokasi).
- Iterasi proses ini pada output, dengan memerlukan perubahan lintang dan bujur yang lebih besar untuk perubahan yang signifikan. Oleh karena itu, output yang akan dihasilkan dari output sebelumnya akan lebih berbutir kasar.
- Iterasi seluruh proses sebanyak yang diperlukan.
- Agregasikan serangkaian resolusi dan kirimkan ke pengguna. Juga, simpan semua resolusi data untuk konsumsi nanti.
Apa yang harus saya gunakan untuk menyimpan data ini? Haruskah saya menggunakan basis data relasional atau solusi NoSQL? Apa hal lain yang harus saya pertimbangkan ketika merancang aplikasi ini?
Jawaban:
Beberapa alternatif untuk menyimpan data ini:
Ini akan dioptimalkan untuk menulis dan membaca aliran data. Ini sangat ideal untuk mengumpulkan aliran data dalam format proses yang mudah, tetapi biasanya tidak dapat ditanyakan kecuali dengan membacakan aliran secara keseluruhan. Jadi, ini bisa untuk keperluan arsip, atau langkah menengah dalam perjalanan ke lapisan pemrosesan.
Anda bisa menuliskannya ke basis data, dan ketika volume melebihi kapasitas DB untuk ditangani, Anda dapat membuang basis data (= memiliki beberapa himpunan bagian dari data yang duduk di server basis data yang berbeda). Manfaat: Anda dapat menggunakan DB relasional dan tidak harus mempelajari hal baru. Kelemahan: semua kode yang berhubungan dengan DB harus mengetahui pada pecahan data mana yang hidup, permintaan agregat harus dilakukan dalam perangkat lunak aplikasi.
Anda menulis data Anda ke database NoSQL terdistribusi, dan secara otomatis akan mengirimkan data untuk Anda. Cassandra memungkinkan Anda untuk melakukan kueri di seluruh cluster, yang membutuhkan lebih sedikit kode aplikasi untuk kembali ke data. Manfaat: lebih cocok secara alami untuk data dalam jumlah besar, kerugian: akan membutuhkan keahlian khusus dan pemahaman mendalam tentang mekanisme bagaimana sistem ini bekerja untuk mencapai kinerja yang baik dan membuat data dapat ditanyakan sesuai dengan kebutuhan Anda. NoSQL bukan perbaikan kinerja ajaib, ini adalah satu set pertukaran yang harus dipahami untuk dinavigasi.
Data ditambahkan ke file yang didistribusikan secara otomatis di seluruh server oleh platform Hadoop, diproses pada server tersebut menggunakan alat-alat seperti M / R atau Apache Spark, dan akhirnya ditanyai (sebagai file) menggunakan mesin Hadoop SQL seperti Hive atau Impala.
Yang mana yang harus dipilih?
Pertukaran antara alternatif ini rumit, dan mereka sangat bergantung pada tulisan Anda dan pola bacaan Anda, jadi satu-satunya orang yang dapat memutuskan timbal balik ini adalah Anda. Jika Anda tidak memiliki waktu untuk membangun pemahaman yang mendalam tentang alternatif-alternatif ini, maka gunakan saja DB relasional dan cari solusi sharding saat Anda melanjutkan. Dalam semua kemungkinan, YAGNI .
sumber
Lihatlah persyaratan Anda sedikit lebih dalam. Ada cara untuk membuat ilusi posisi pelacakan setiap detik.
Jika Anda memiliki aplikasi yang mengetahui lokasi GPS Anda saat ini dan menulisnya ke basis data, mengapa Anda tetap menulis lokasi jika tidak berubah? Bahkan jika Anda memerlukan data, jika pengguna telah tertidur selama 7 jam, Anda secara program dapat mengisi slot waktu yang hilang dengan lokasi duplikat untuk melakukan perhitungan atau pemetaan Anda atau apa pun yang perlu Anda lakukan.
Jika Anda melacak lokasi setiap detik, apakah Anda harus menyimpan data ini selamanya? Anda bisa mengarsipkan catatan ke database lain untuk mencegah tabel saat ini menjadi terlalu besar. Atau Anda bahkan bisa menyimpan catatan di mana ada perubahan posisi. Ini biasa terjadi di gudang data.
sumber
Data Anda adalah serangkaian deret waktu. Anda telah memberikan set angka (dua per pengguna) yang berkembang seiring waktu. Biasanya, Anda TIDAK mencari segala jenis penyimpanan relasional, melainkan penyimpanan RRD. Penyimpanan ini sangat berfokus pada pengurangan pekerjaan I / O dari banyak penulisan kecil dengan buffering.
Penyimpanan relasional adalah bid'ah untuk seri waktu ini. Namun, berhati-hatilah bahwa pengembangan RRD tidak terlalu didukung dalam hal eksploitasi yang dapat diprogram dibandingkan dengan SQL. Anda mungkin melihat pekerjaan integrasi yang serius, tetapi sulit dihindari mengingat persyaratan Anda.
sumber