Saya punya aplikasi yang telah menghasilkan diskusi yang agak panas antara beberapa pengembang.
Pada dasarnya, itu dibagi menjadi lapisan web dan lapisan backend. Lapisan web mengumpulkan informasi dengan formulir web sederhana, menyimpan data ini sebagai dokumen JSON (secara harfiah file .json) ke dalam folder arloji yang digunakan oleh bagian belakang. Bagian belakang polling folder ini setiap beberapa detik, mengambil file, dan menjalankan fungsinya.
File-file itu sendiri sangat sederhana (yaitu semua data string, tidak ada sarang), dan sekitar 1-2k pada ukuran terbesarnya, dengan sistem menghabiskan sebagian besar waktunya menganggur (tetapi meledak hingga 100 pesan pada waktu tertentu). Langkah pemrosesan backend memakan waktu sekitar 10 menit per pesan.
Argumen muncul ketika salah satu pengembang menyarankan bahwa menggunakan sistem file sebagai lapisan pesan adalah solusi yang buruk, ketika sesuatu seperti database relasional (MySQL), database noSQL (Redis), atau bahkan panggilan API REST sederhana harus digunakan sebagai gantinya.
Perlu dicatat bahwa Redis digunakan di tempat lain dalam organisasi untuk penanganan pesan yang antri.
Argumen yang saya dengar rusak sebagai berikut
Dalam mendukung file datar:
File flat lebih dapat diandalkan daripada solusi lain, karena file hanya dipindahkan dari folder "watch", ke folder "processing" setelah diambil, dan akhirnya ke folder "selesai" ketika selesai. Tidak ada risiko hilangnya pesan kecuali bug tingkat sangat rendah yang akan memecah hal-hal lain.
File flat membutuhkan kecanggihan teknis yang lebih sedikit untuk mengerti - cukup
cat
itu. Tidak ada pertanyaan untuk ditulis, tidak ada risiko secara tidak sengaja muncul pesan dari antrian dan setelah itu hilang selamanya.Kode manajemen file lebih sederhana daripada API basis data dari sudut pandang pemrograman, karena itu bagian dari pustaka standar setiap bahasa. Ini mengurangi keseluruhan kompleksitas basis kode dan jumlah kode pihak ketiga yang harus dimasukkan.
The prinsip YAGNI menyatakan bahwa file flat bekerja dengan baik sekarang, ada tidak ada menunjukkan kebutuhan untuk berubah untuk solusi yang lebih rumit, jadi biarkan.
Dalam Mendukung database:
Lebih mudah untuk skala database dari direktori yang penuh dengan file
File flat memiliki risiko seseorang menyalin file "selesai" kembali ke direktori "watch". Karena sifat aplikasi ini (manajemen mesin virtual), ini dapat mengakibatkan hilangnya data yang sangat besar.
Membutuhkan kecanggihan teknis yang lebih untuk T / S aplikasi berarti bahwa staf yang tidak berpendidikan cenderung mengacaukan sesuatu dengan hanya menyodok sesuatu.
Kode koneksi DB, terutama untuk sesuatu seperti Redis, setidaknya sekuat fungsi manajemen file perpustakaan standar.
Kode koneksi DB terlihat (jika tidak secara fungsional) lebih sederhana dari sudut pandang pengembang, karena levelnya lebih tinggi daripada manipulasi file.
Dari apa yang saya lihat, kedua pengembang memiliki banyak poin yang valid.
Jadi dari dua orang ini, pengembang pro-file, atau pengembang basis data, mana yang lebih sesuai dengan praktik terbaik rekayasa perangkat lunak, dan mengapa?
Jawaban:
Beralih ke solusi yang melibatkan basis data atau sistem antrian yang disebutkan oleh Ewan
Memindahkan / mengganti nama file dalam volume tunggal dijamin bersifat atom pada semua OS saat ini, apa pun kesulitannya berkaitan dengan hal-hal seperti penguncian file / catatan. Manajemen hak tingkat OS harus memadai untuk mengunci yang tidak dicuci dan untuk mencegah manipulasi yang salah / tidak disengaja oleh operator yang berwenang (admin / pengembang). Oleh karena itu, basis data tidak memiliki apa pun untuk ditawarkan, asalkan kinerja solusi saat ini tidak berlaku.
Di perusahaan kami, kami telah menggunakan antarmuka berbasis file yang serupa selama beberapa dekade dengan sukses besar. Banyak hal lain telah datang dan pergi, tetapi antarmuka ini tetap karena kesederhanaan, keandalan dan kopling / ketergantungan minimal.
sumber
Saya tidak berpikir solusi mana pun secara inheren merupakan praktik buruk, jadi menjawab mana yang merupakan praktik terbaik mungkin sulit.
Saya tidak percaya kepala sekolah YAGNI berlaku di sini jika Anda berurusan dengan skala. "Bekerja" adalah relatif, jika Anda memiliki potensi kuat untuk kehilangan data bencana, dan sedikit kemampuan untuk menskalakan, saya tidak akan benar-benar menganggap itu berfungsi. Saya tidak begitu yakin skala yang Anda hadapi, tetapi jika Anda memiliki jumlah entri yang sangat banyak, itu hanya akan semakin sulit dengan masing-masing untuk beralih ke sistem baru. Jadi jika ini masalahnya, saya akan mengatakan database adalah praktik terbaik.
MongoDB atau redis (Saya tidak punya pengalaman dengan redis, hanya baca hal-hal baik) harus baik-baik saja karena data Anda harus sudah cocok dengan baik ke dalamnya (dokumen json sering berubah secara sepele menjadi dokumen BSON untuk MongoDB). Ini memiliki keuntungan tambahan juga menyimpan banyak data dalam memori daripada berpotensi sering membaca / menulis ke disk sepanjang waktu. Ini juga memastikan pembacaan / penulisan bersamaan tidak mengarah pada korupsi atau pemblokiran.
Jika kepala sekolah YAGNI berlaku di sini dan file-file tersebut tidak menjadi hambatan, mereka berskala dalam ruang lingkup, dan tidak memiliki masalah bencana, saya akan mengatakan tetap dengan file adalah "praktik terbaik". Tidak ada alasan untuk mengubah apa pun jika tidak ada masalah, mungkin menulis beberapa tes, menekankannya dan melihat di mana batas dan hambatan Anda.
Saya tidak yakin apakah database adalah solusi dalam konteks ini. Jika Anda berkomunikasi dengan hal-hal di server yang sama, semacam IPC bisa dilakukan, bukan?
sumber
Sementara yang baik menyimpan file dan menyalinnya ke dir selesai adalah pokok dari banyak lapisan komunikasi esp. dengan sistem bingkai utama yang lebih tua dan sejenisnya. Orang-orang 'anti' memang ada benarnya; karena memiliki banyak masalah dan kasus tepi. Yang sulit dihadapi jika Anda membutuhkan keandalan 100%, dan terjadi lebih sering saat Anda meningkatkan frekuensi dan volume file.
Jika Anda mengontrol kedua sisi transaksi, saya sarankan Anda melihat beberapa sistem antrian sederhana yang tersedia. ZeroMQ, RabbitMQ, MSMQ dll daripada database. Tapi seperti yang Anda maksudkan, jika itu tidak rusak ...
sumber
Solusi database adalah yang tepat. Ini memecahkan banyak ketergantungan pada host atau kondisi batas tertentu.
Keduanya merupakan solusi yang sama kecuali bahwa database tidak dihosting di host tertentu. Ini menghilangkan masalah firewall / akses dengan sistem unix. Kami memiliki kasus penghapusan "tidak disengaja" pada sistem file dan tidak ada yang bisa disalahkan.
Dengan database, Anda juga dapat memiliki masalah yang sama tetapi Anda dapat mengaudit atau hanya memasukkan logika untuk menghilangkan penghapusan.
Juga dalam sistem file jika Anda perlu meletakkan aplikasi dalam nama file misalnya OASIS, maka Anda perlu membuat file OASIS.john_doe.system1.20160202. Ini menjadi membosankan dan dapat direpresentasikan dengan lebih mudah dalam database. Anda bahkan dapat memiliki bidang nol dalam basis data dan logika berdasarkan itu
Juga mudah untuk memperbarui database daripada seluruh direktori file jika ada patch atau perbaikan yang mungkin ingin Anda lakukan pada tabel. Tentu saja Anda dapat melakukannya pada sistem file tetapi pembaruan basis data lebih intuitif.
Misalnya Anda ingin menjalankan kembali tetapi dengan sistem yang berbeda dari OASIS mengatakan DESERT dan john_doe melakukan do__smith dan tanggal dari 20160101 hingga 20151231
Mudah untuk menghasilkan baris untuk DESERT / doe_smith / 20151231 dari set asli daripada membuat file tersebut dengan skrip shell.
Jadi dari keterbacaan, ekstensi titik pandang solusi database lebih baik.
sumber