Mengapa begitu banyak programmer benar-benar membenci lapisan prevalensi objek?

9

Prevalensi adalah teknik sederhana untuk menyediakan properti ACID ke model objek dalam-memori berdasarkan serialisasi biner dan pencatatan write-ahead. Ini berfungsi seperti ini:

  • Mulai dengan snapshot. Serialize model objek dan tulis ke file.
  • Buat file jurnal. Untuk setiap panggilan ke dalam model objek, serialkan panggilan dan argumennya.
  • Ketika jurnal menjadi terlalu besar, Anda mematikan, atau jika tidak nyaman, melakukan pos pemeriksaan: menulis snapshot baru dan memotong jurnal.
  • Untuk memutar kembali atau memulihkan dari gangguan daya, tekan snapshot terakhir dan jalankan kembali semua panggilan yang dicatat dalam jurnal.

Tindakan pencegahan yang diperlukan untuk membuat pekerjaan ini adalah:

  • Jangan biarkan referensi objek yang dapat berubah keluar atau masuk ke lapisan prevalensi. Anda memerlukan semacam proxy atau skema OID, seolah-olah Anda sedang melakukan RPC. (Ini adalah kesalahan pemula yang biasa dijuluki ' masalah baptisan '.)
  • Semua logika yang dapat dijangkau dari panggilan harus sepenuhnya deterministik, dan tidak boleh melakukan panggilan I / O atau OS yang bermakna logika bisnis. Menulis ke log diagnostik mungkin OK, tetapi mendapatkan waktu sistem atau meluncurkan delegasi asinkron umumnya tidak. Ini dimaksudkan agar jurnal diputar ulang secara identik meskipun dikembalikan pada mesin yang berbeda atau pada waktu yang berbeda. (Sebagian besar kode prevalensi menyediakan panggilan waktu alternatif untuk mendapatkan cap waktu transaksi.)
  • Concurrency penulis memperkenalkan ambiguitas dalam interpretasi jurnal, sehingga dilarang.

Apakah karena ...

  • orang mengembangkan rasa tidak enak bagi mereka setelah mencoba untuk menggunakan satu pada sebuah proyek yang tidak cocok * untuk itu?
  • Advokasi keras Klaus Wuestefeld mematikan orang ?
  • orang yang menyukai model pemrograman imperatif tidak suka memisahkan I / O dari perhitungan , lebih suka interleave perhitungan dengan I / O dan panggilan threading?
  • lapisan prevalensi sangat sederhana secara konseptual dan sangat erat terikat dengan karakteristik kerangka kerja yang mereka huni sehingga biasanya digulung untuk proyek, yang membuatnya terlalu asing / tidak standar / berisiko?
  • terlalu sulit untuk tetap lurus apa yang harus Anda berhati-hati untuk tidak lakukan?
  • kepala pemula sepertinya meledak ketika dihadapkan dengan sesuatu yang tidak sama dengan aplikasi berbasis dua tingkat yang mereka pelajari di sekolah? ;)

* The seluruh data yang ditetapkan cocok dalam RAM , Anda tidak perlu penulis concurrency, dan Anda tidak perlu melakukan ad-hoc query, pelaporan, atau ekspor ke data warehouse. Dengan permintaan maaf kepada SQLite, prevalensi adalah peningkatan pada file penyimpanan, bukan pengganti untuk Oracle.

Jeffrey Hantin
sumber
Aha. Saya bertanya-tanya apakah itu punya nama. Itu selalu masuk akal bagi saya, saya tidak pernah punya nama untuk itu.
greyfade
9
Apa yang kamu bicarakan?
TheLQ
Ini adalah pertama kalinya saya mendengar hal ini. Apa itu?
Jonn
Penjelasan ditambahkan.
Jeffrey Hantin
1
Ohhh .. Saya tahu konsepnya tapi saya belum pernah melakukan ini sebelumnya. Terlihat bagus bagiku. Saya cukup yakin itu bukan sesuatu yang banyak pengembang "benar-benar benci".
Jonn

Jawaban:

6

Saya pikir beberapa masalah adalah mereka memiliki kasus penggunaan yang SANGAT spesifik (alasan Anda tidak cocok). Saya telah membangun dan bekerja pada sistem yang menggunakan pendekatan ini dan ketika Anda memiliki masalah yang sebenarnya masalah ini bisa menjadi solusi yang bagus.

Bagian lain adalah bahwa itu tampak jauh seperti beberapa bit yang lebih menyakitkan dari penyimpanan data khusus yang Anda gunakan untuk menemukan lebih dari 10 tahun yang lalu dan memiliki beberapa jebakan yang sama (misalnya batch diperbarui btreive misalnya) yang membawa Anda Poin "terlalu adat", tetapi juga membuatnya sulit untuk menemukan bagian rak yang bekerja dengan sopan dengannya.

Bagian terakhir adalah mereka bisa sangat sulit untuk ditanyakan dalam banyak kasus dan orang-orang pada umumnya cukup terbiasa untuk mendapatkan jawaban mereka sekarang.

Tagihan
sumber
11

Saya pikir Anda harus terlebih dahulu menunjukkan bahwa begitu banyak pengembang benar-benar membenci mereka. Saya pikir bukan itu masalahnya. Pertimbangkan unggas itu, beberapa waktu lalu, memformalkan pola semacam ini di sini .

Steven Evers
sumber
Ya, saya agak bingung. Mereka terlihat seperti alat yang hebat jika Anda menggunakannya untuk alasan yang benar.
Matt Olenik
Saya hanya mengatakan ini karena saya merasakan kesedihan yang sangat luar biasa atas hal ini dari rekan kerja.
Jeffrey Hantin
1
@ Jeffrey Hantin: Mereka terdengar malas dan berpikiran tertutup.
Steven Evers
1
Oh, dan landasan sebenarnya dari pola ini adalah c2.com/cgi/wiki?TransactionTape
Jeffrey Hantin
4

Jawaban atas pertanyaannya adalah bahwa walaupun teorinya sederhana, praktiknya tidak.

Hanya menguji pengaturan semacam itu membutuhkan puluhan kasus uji, tambahkan proses mutli atau kode multi-ulir dan ini melompat ke ratusan kondisi yang mungkin perlu diuji, baik untuk kegigihan dan pemulihan.

Monitor transaksi apa pun seperti CICS, Tuxedo, Weblogic, Websphere, JBOSS atau .NET, akan menyediakan semua fasilitas ini secara bersih dan teruji. Dan setiap basis data akan memberikan "cukup" transaksional / kegigihan untuk sebagian besar aplikasi.

Sebagian besar kasus roda itu diciptakan dan disempurnakan sejak lama.

James Anderson
sumber
ini, dan kecenderungan banyak "arsitek" untuk memiliki satu "rasa" yang disukai yang mereka coba dorong ke apa pun, tidak peduli seberapa tidak pantasnya desain itu untuk masalah yang perlu dipecahkan.
jwenting
@jwenting Jadi, apakah itu termasuk dalam poin 'advokasi melengking'?
Jeffrey Hantin
2

Prasyarat terdengar agak sulit untuk dikodekan, terutama dengan sebagian besar sistem yang tidak memerlukan kepatuhan ACID saat berjalan di memori. Overhead terdengar agak buruk juga - ada banyak pelacakan negara yang terlibat di sana.

Wyatt Barnett
sumber