Apakah logika bisnis benar-benar milik server?

10

Tumpukan khas untuk aplikasi web adalah database, server dengan kode sisi server, dan pengguna dengan browser dengan HTML / CSS / JavaScript.

Sebelum AJAX ekstensif, MVC di mana pengontrolnya adalah kode sisi server dikenali. Server harus merutekan permintaan jawaban untuk halaman web dinamis (yaitu solusi html templated seperti JSP dan ASP). Server untuk mengoordinasikan panggilan ke database dan memutuskan halaman dinamis mana yang digunakan untuk menjawab permintaan halaman. Hasil dari semua ini adalah bahwa server akhirnya mengandung logika bisnis, meskipun logika bisnis tidak sangat terkait dengan ide melayani halaman.

Sekarang kita pindah ke "Web 2.0" server server halaman statis yang menggunakan JavaScript untuk mengisi sendiri dan mengubah apa yang mereka sajikan. Dapat di JavaScript. JavaScript sering mengimplementasikan layanan RESTful yang berarti menetapkan permintaan basis data.

Jadi server dibiarkan dengan peran melayani file aktual dan menjawab panggilan AJAX. Dan menjawab panggilan AJAX hanyalah manajemen sesi dan memberikan keamanan. Dan sungguh, apa yang seharusnya bisa dilihat oleh pengguna adalah data yang harus ditentukan dalam database.

Jadi dari sana, haruskah server diturunkan ke peran perantara bodoh yang hanya sesekali melakukan sesuatu seperti mengirim email atau mematikan layanan web? Bisakah logika bisnis semua hidup dalam JavaScript (ketika itu bukan rahasia) atau hidup dalam prosedur yang tersimpan ketika itu?

Apakah masuk akal untuk bahkan mungkin menggabungkan server dan database atau membuat solusi ERP seperti fungsi SAP sebagai server?

Joe
sumber

Jawaban:

14

Logika bisnis hampir selalu harus berjalan di server yang Anda kontrol, untuk alasan keamanan. Jika dengan "server" yang Anda maksud "server web", maka saya setuju, itu tidak perlu memiliki hampir semua logika bisnis. Tetapi Anda hampir selalu membutuhkan server aplikasi dengan logika bisnis, apakah itu di dalam database atau server web atau terpisah dan dipanggil oleh server web.

Ada aplikasi dunia nyata di mana server web tidak melakukan apa-apa selain mengekspos API dari server aplikasi melalui layanan web atau JSON.

Bahkan sebelum Web 2.0 dan AJAX itu benar-benar tidak dianggap sebagai praktik terbaik untuk mencampur logika bisnis Anda dengan halaman ASP. Itu dianggap lebih baik untuk memiliki logika bisnis independen dan memiliki bagian server dari logika presentasi dalam ASP, JSP, atau apa pun. Jadi perubahan nyata dari web 2.0 adalah bahwa lapisan presentasi dapat sepenuhnya dalam javascript. Saya lebih suka itu secara pribadi.

psr
sumber
Ya, saya setuju bahwa logika bisnis tidak boleh dalam ASP. Itu adalah poin dari MVC.
Joe
Jawaban ini berasal dari hampir dua tahun yang lalu, dan sekarang hal-hal seperti SproutCore adalah hal yang populer. Di situs web SproutCore, mereka secara eksplisit menyatakan tujuannya adalah untuk memindahkan logika bisnis ke browser (lihat: sproutcore.com/about ). Jadi ... sudahkah keadaan web berubah sekarang? Apakah logika bisnis pada klien (melalui JS pada browser khususnya) boleh atau bahkan mungkin lebih baik?
JoeCool
@ JoCool SproutCore memang ada saat itu. Dan pertimbangan keamanan menempatkan logika bisnis pada klien tidak berubah. Tetapi tidak semua aplikasi memiliki banyak masalah keamanan. Juga, "semua kemarahan" tampaknya terlalu berlebihan untuk SproutCore. Tetapi kelayakan melakukan lebih banyak pada klien terus meningkat - kecuali perangkat seluler terus mendapatkan keunggulan dan mereka tetap menantang kinerja-bijaksana untuk banyak aplikasi.
psr
@psr Diberikan - tetapi Anda tampaknya benar-benar menepis menggunakan logika bisnis di klien, padahal sebenarnya setidaknya beberapa teknologi populer saat ini sedang menuju ke arah itu.
JoeCool
6

JavaScript sering mengimplementasikan layanan RESTful yang berarti menetapkan permintaan basis data.

Di sinilah Anda salah. REST bukan CRUD.

Sumber daya yang diekspos oleh REST bukan catatan basis data Anda; mereka sepenuhnya dikelola objek yang berperilaku sesuai dengan logika bisnis Anda. Ketika server menerima POST atau PUT, itu seharusnya tidak hanya memvalidasi dan menyimpan. Itu harus melakukan apa pun yang sesuai untuk aplikasi.

Contoh sederhana: aplikasi seperti twitter menerima tweet sebagai pesan POST pada wadah yang diberikan. Server kemudian menganalisis konteks ("siapa Anda?", "Saluran apa ini?") Dan konten ("ada tagar?", Indeks teks, dll.) Dan menyimpan semua ini di antrian masing-masing. Mungkin menambahkan referensi langsung ke semua pengikut Anda.

Itu banyak pekerjaan di luar hanya menambahkan sumber daya ke wadah, itu semua ditentukan oleh logika bisnis Anda. Dan itu milik server.

Javier
sumber
2

Kekhawatiran saya dengan pendekatan ini mungkin karena kesalahpahaman desain Anda, jadi jangan ragu untuk menembak saya.

namun, pikirkan tentang skala, kemampuan perawatan, dan keamanan produk.

Jika produk Anda tumbuh secara besar-besaran, basis data menjadi penghambat, sehingga sementara "kinerja" menyarankan untuk memasukkan logika bisnis ke dalam prosedur yang tersimpan, basis data menempatkan beban CPU tambahan pada server basis data Anda, memajukan hari ketika server mencapai kapasitas maksimal. Tidak seperti server web, database ACID tidak mudah ditingkatkan dengan menggunakan perangkat keras paralel. Jika produk Anda tidak akan pernah sesukses itu, ini bukan masalah.

Memikirkan mempertahankan logika bisnis dalam javascript yang berjalan di webbrowswers, di mana browser yang berbeda akan memerlukan javascriopt yang berbeda, beberapa versi browser, dll ... Mengapa membuat masalah ini lebih rumit daripada yang sudah ada?

Seperti yang dikatakan Javiar, menggunakan pendekatan REST sebagai API basis data untuk produk Anda benar-benar tidak masuk akal. Manfaat dari antarmuka REST adalah bahwa orang lain akan memikirkan berbagai cara untuk menggunakan dan menanyakan antarmuka REST Anda. Namun ini adalah sumber daya logika bisnis pos publik dan bukan sumber daya catatan tabel tingkat rendah. Pikiran membuat permintaan data tingkat rendah seperti tersedia melalui api HTTP terdengar seperti mimpi buruk keamanan.

Michael Shaw
sumber
+1, untuk menyuap masalah kompatibilitas browser. Juga, menulis kode bisnis dalam JavaScript membutuhkan keterampilan tambahan dan tidak membiarkan Anda menggunakan metode di kelas bisnis Anda.
NoChance
2

Walaupun ada banyak aliran pemikiran tentang ini, dan tentu saja tidak ada satu cara yang dapat disebut "jalan yang benar" secara universal, sementara yang lain adalah "jalan yang salah" secara universal, ada sejumlah alasan untuk mengisolasi logika bisnis di sisi server , dan mengakses objek dan layanan tersebut melalui layanan RESTful.

Jawaban singkatnya adalah sebagian besar tentang manajemen risiko, serta pemantauan dan peningkatan kinerja.

Secara terperinci:

Alasan terpenting nomor 1 adalah keamanan. Klien tidak boleh dipercaya untuk mengirimkan apa pun selain sampah ke server, dan dengan menjaga sisi keamanan aspek server, Anda mengisolasi risiko potensial dari pengguna jahat yang merusak sistem Anda. Ingat, Javascript benar-benar sisi klien, dan mudah berubah, sehingga Anda TIDAK BISA PERCAYA OUTPUT.

Alasan nomor 2 adalah pemisahan keprihatinan. Programmer javascript Anda mungkin bukan pakar keamanan, dan guru keamanan Anda mungkin tidak terlalu hebat dalam Javascript. Dengan mengisolasi logika bisnis dari logika presentasi, Anda menghindari melintasi masalah ini, karena javascript tidak akan diizinkan untuk mengakses sumber daya di luar tingkat izinnya, dan diberikan kesalahan, yang penanganannya berada dalam ketentuan Script Programmer. Demikian juga, petugas Keamanan tidak akan men-debug Javascript untuk melihat bagaimana keamanan dipertahankan.

Alasan nomor 3 adalah kinerja. Logika bisnis berpotensi menuntut sumber daya server dan basis data. Dengan menjaga logika itu diisolasi dari elemen UI Anda, Anda kemudian dapat mengurangi sebagian aplikasi Anda, membuatnya lebih mudah untuk mengatasi kemacetan. Selain itu, jauh lebih mudah untuk mengisolasi proses bisnis mana yang memuat backend sistem atau database Anda jika proses bisnis dijalankan di server.

Akibat wajar di sini adalah bahwa seringkali beberapa proses bisnis akan menggunakan data yang sama, dan karenanya Anda dapat menerapkan caching di sisi server untuk mengurangi beban sistem secara keseluruhan yang mungkin tidak mungkin / aman untuk memberikan akses kode sisi klien.

Akhirnya, saya akan mengusulkan bahwa untuk mempertahankan standar ACID, Business Logic benar-benar perlu ada di server. Saya ingat mempertahankan produk penagihan yang berjalan di browser web, dengan hanya koneksi database ke server. Jika penagihan harian (yang bisa memakan waktu satu jam atau lebih pada hari yang baik!) Terputus, katakanlah, oleh browser yang ditutup atau mogok, mungkin butuh beberapa jam untuk memilah kekacauan yang dibuatnya dari database, yang tersisa dalam keadaan tidak konsisten. Ingat, ini juga melibatkan kartu kredit, jadi catatan tagihan juga harus diperiksa terhadap prosesor!

Logika bisnis sisi server sebagian besar sepele untuk memastikan pembaruan ACID, karena ada kerangka kerja untuk bahasa apa pun untuk mempertahankan transaksi, baik di tingkat aplikasi atau basis data. Jika Anda melakukan ini melalui beberapa pembaruan dari klien web ... Anda akan mendapatkan kondisi yang tidak konsisten di beberapa titik, dan itu kemungkinan akan mempengaruhi aplikasi Anda.

Meskipun tergoda untuk memikirkan layanan RESTful hanya sebagai cara untuk mengakses database, Anda tidak boleh jatuh ke dalam perangkap ini, karena itu adalah resep yang baik untuk bencana. Model objek yang Anda paparkan melalui layanan RESTful dapat terkait dengan database Anda, tetapi harus benar-benar merangkum logika bisnis Anda alih-alih hanya menggunakannya sebagai mesin CRUD.

SplinterReality
sumber
+1 untuk meningkatkan banyak poin bagus. Sistem penagihan yang Anda gunakan sebagai contoh memiliki desain paling aneh yang pernah saya dengar.
NoChance
Itu memiliki nama paling aneh yang pernah saya dengar juga, meskipun saya masih melihat referensi untuk itu berkeliaran. Itu disebut HURLnet ISP Admin, dan cukup kriteria untuk mempertahankan. Kami memiliki lisensi kode sumber lengkap, dan saya menggunakannya secara luas setelah mereka berhenti mendukungnya.
SplinterReality