Mengapa pengembang harus menggunakan layanan web daripada koneksi langsung ke db? [Tutup]

94

Saya sedang mencari daftar "sepuluh besar" alasan mengapa kita harus terhubung ke database jarak jauh melalui layanan web daripada langsung menghubungkan ke db. Ini adalah debat internal sekarang dan saya pro-layanan web tetapi kalah argumen. Saya memiliki pemahaman dasar tentang WCF / layanan web, tidak ada orang lain yang memilikinya. Kita dapat melakukan apa pun yang kita inginkan, tetapi kita harus tetap dengan apa pun yang kita pilih sekarang.

Inilah yang saya dapatkan. Lagi?

  1. Layanan web WCF dapat, jika dikonfigurasi dengan benar, menjadi lebih aman.
  2. Perubahan pada DB hanya perlu dilakukan di tingkat layanan (file konfigurasi atau layanan kompilasi ulang).
  3. Setelah disiapkan dan dihosting, layanan web lebih mudah digunakan.
DenaliHardtail
sumber

Jawaban:

120
  1. Keamanan. Anda tidak memberikan akses DB kepada siapa pun kecuali server web / pengguna aplikasi.

    Ini sangat penting bila Anda memiliki banyak pengguna. Anda menghindari sakitnya pemeliharaan pengguna / peran di sisi DB.

  2. Pengurangan beban DB. Layanan web dapat menyimpan data yang diambil dari DB.

  3. Penyatuan koneksi database (hat / tip @Dogs).

    Layanan web dapat menggunakan kumpulan kecil koneksi DB yang dibuka secara permanen. Bantuan dalam berbagai cara:

    • Pool koneksi DB terbatas di sisi server database.

    • membuka koneksi DB baru SANGAT mahal (terutama ke server database).

  4. Kemampuan untuk toleransi kesalahan - layanan dapat beralih di antara sumber data primer / DR tanpa rincian kegagalan yang diimplementasikan oleh konsumen layanan.

  5. Skalabilitas - layanan dapat menyebarkan permintaan antara beberapa sumber data paralel tanpa rincian pengambilan sumber daya yang diimplementasikan oleh konsumen layanan.

  6. Enkapsulasi. Anda dapat mengubah implementasi DB yang mendasari tanpa memengaruhi pengguna layanan.

  7. Pengayaan data (ini mencakup apa saja mulai dari penyesuaian klien hingga pelokalan hingga internalisasi). Pada dasarnya semua ini mungkin berguna tetapi salah satunya adalah beban utama pada database dan seringkali sangat sulit untuk diterapkan di dalam DB.

  8. Mungkin atau mungkin tidak berlaku untuk Anda - keputusan arsitektur tertentu tidak ramah akses DB. Misalnya Server Java yang berjalan di Unix memiliki akses mudah ke database, sedangkan klien java yang berjalan di PC Windows tidak menyadari database dan Anda juga tidak menginginkannya.

  9. Portabilitas. Klien Anda mungkin tidak semuanya berada di platform / arsitektur / bahasa yang sama. Membuat ulang lapisan akses data yang baik di masing-masing lapisan itu lebih sulit (karena harus memperhitungkan masalah seperti failover yang disebutkan di atas / dll ...) daripada membuat lapisan konsumen untuk layanan web.

  10. Penyetelan kinerja. Dengan asumsi alternatifnya adalah klien menjalankan kueri mereka sendiri (dan bukan prosedur tersimpan yang sudah disiapkan sebelumnya), Anda bisa 100% yakin bahwa mereka akan mulai menggunakan kueri yang kurang optimal. Selain itu, jika layanan web membatasi kumpulan kueri yang diizinkan, ini dapat membantu penyetelan database Anda secara signifikan. Saya harus menambahkan bahwa logika ini sama-sama berlaku untuk prosedur tersimpan, tidak khusus untuk layanan web.

Daftar yang bagus juga dapat ditemukan di halaman ini: 'Mengenkapsulasi Akses Database: Praktik "Terbaik" yang Agile'

Untuk memperjelas - beberapa masalah ini mungkin tidak berlaku untuk SEMUA situasi. Beberapa orang tidak peduli dengan portabilitas. Beberapa orang tidak perlu khawatir tentang keamanan DB. Beberapa orang tidak perlu khawatir tentang skalabilitas DB.

DVK
sumber
26
Maaf, tidak setuju. 1. Jadi, Anda memberikan akses DB ke grup alih-alih satu kepala sekolah - tidak ada perbedaan. 2. Aplikasi apa pun dapat menyimpan data dalam cache. Jenis data yang dapat di-cache di beberapa pengguna biasanya akan menjadi data volume rendah dalam hal apa pun. 3. FT harus ditangani oleh database dalam hal apapun. 4. Ini bukan fitur out of the box, dan harus diprogram. 5. Lapisan akses data Anda harus melakukan enkapsulasi. 6. Hal yang sama. 7. Benarkah? JDBC tidak berjalan di klien? 8. Poin bagus, jika penting, yang jarang terjadi. 9. query vs. SP bukan bagian dari pertanyaan.
John Saunders
7
1. Coba kelola itu di 5000 pengguna dengan ratusan peran. Tidak berskala dengan baik lagi. 2. Tergantung sepenuhnya pada aplikasi. Kasus kami saat ini memiliki contoh hasil caching dari kueri yang dalam kasus yang dioptimalkan untuk uber membutuhkan waktu 20 menit untuk dijalankan dan yang perlu kami jalankan 100 kali sehari setidaknya dari aplikasi yang berbeda. 3. FT ditangani pada banyak level. Apa maksud Anda "harus ditangani oleh database"?
DVK
4
4. Tentu saja harus diprogram. Tapi itu bisa diprogram ke dalam layanan sekali, atau menjadi jutaan aplikasi klien di berbagai platform dengan kemampuan yang berbeda-beda. Ada perbedaan besar. Lupakan masalah manajemen konfigurasi untuk load balancing. 5. Alasan yang sama. Anda tidak perlu menerapkan ulang DAL. Faktanya, Anda bisa menganggap layanan web sebagai DAL portabel untuk menenangkan pikiran Anda. 7. Kami tidak ingin setiap klien membuka koneksi DB. Apakah itu hal yang besar untuk diminta? Sekali lagi, Anda melupakan poin 1-5.
DVK
2
8.> 1 arsitektur klien SANGAT sering terjadi. Sebenarnya saya tidak pernah mengerjakan sebuah proyek tanpa situasi seperti itu dalam hidup saya, tetapi saya berpusat pada dunia keuangan. 9. Ternyata tidak. Saya pada dasarnya bermain sebagai pengacara iblis.
DVK
2
Saya suka jawaban ini, tetapi menurut saya Anda melewatkan salah satu poin terpenting: Pengumpulan koneksi. Jika Anda memiliki 1.000.000 klien, Anda akan memiliki 1.000.000 koneksi terbuka, atau jutaan koneksi yang terus-menerus dibuka dan ditutup. Intuisi dasar tentang organisasi komputer memberi tahu kita kumpulan beberapa ratus koneksi berumur panjang yang disetel dengan baik secara astronomis lebih efisien daripada memiliki satu juta koneksi berumur panjang atau jutaan koneksi berumur pendek. HikariCP mendokumentasikan pekerjaan yang bagus untuk menguraikan gagasan ini: github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
Dogs
15

Menurut pendapat saya, Anda seharusnya tidak secara otomatis mengekspos database Anda sebagai layanan web. Jika ternyata Anda membutuhkan layanan untuk mengekspos data Anda, maka tulis satu, tetapi tidak semua akses database harus dilakukan melalui layanan web.

  1. Tidak ada alasan mengapa koneksi database tidak aman
  2. Anda dapat merangkum database dalam lapisan akses data (mungkin Entity Framework)
  3. Layanan web tidak lebih mudah dikonsumsi daripada lapisan akses data yang ditulis dengan baik.
John Saunders
sumber
Mengapa harus XML? Ada juga lebih ringan untuk mengurai JSON, CSV untuk data datar sederhana, dll ...
DVK
Ini bukan "tanpa alasan yang bagus". Seperti disebutkan tentang, tergantung pada kebutuhan dan keinginan Anda untuk pengembangan di masa depan, mungkin diperlukan untuk proyek Anda.
Chris Stewart
Saya menulis WS saya untuk mengonsumsi DAL. Di port mana Anda akan menyarankan untuk mengekspos DAL?
samis
@amus tidak masalah.
John Saunders
"Tidak ada alasan mengapa koneksi database tidak aman", baik, sulit misalnya untuk mengamankan koneksi antara klien Windows dan database. Sangat sulit untuk menerapkan koneksi aman!
NoChance
12
  • Layanan Web membentuk API, yang mendefinisikan interaksi yang diizinkan antara sistem eksternal dan data aplikasi.
  • Layanan Web memisahkan database dari interaksi eksternal dan memungkinkan lapisan data untuk dikelola secara independen dari pengaruh luar tersebut.
  • Mengizinkan akses hanya oleh Layanan Web memastikan bahwa logika aplikasi mendapat kesempatan untuk dieksekusi, melindungi integritas data.
  • Layanan Web memungkinkan tindakan otentikasi / otorisasi yang paling sesuai untuk diambil, sebagai lawan dari database yang membutuhkan nama pengguna dan kata sandi / hak istimewa tingkat tabel.
  • Layanan Web memberikan kesempatan untuk penemuan dan konfigurasi layanan otomatis yang akan digunakan.
  • Lalu lintas Layanan Web dapat dienkripsi untuk transit melalui jaringan yang tidak aman. Tidak tahu ada solusi koneksi DB langsung yang memungkinkan ...?

Sebagian besar poin ini berlaku untuk API formal apa pun, tidak secara khusus Layanan Web.

brabster
sumber
1
Ya, itulah yang akan saya katakan, jika Anda memiliki satu aplikasi yang mengakses database, semua poin Anda juga tersedia untuk API normal.
Ignacio Soler Garcia
"Layanan Web membentuk API, yang mendefinisikan interaksi yang diizinkan antara sistem eksternal dan data aplikasi." Anda juga dapat melakukannya dengan database.
Sepatu
"Mengizinkan akses hanya oleh Layanan Web memastikan bahwa logika aplikasi mendapat kesempatan untuk mengeksekusi, melindungi integritas data." - Saya berpendapat bahwa integritas data harus menjadi bagian dari DBMS saja.
Sepatu
@Shoe Sangat menyenangkan untuk menegakkan integritas sebanyak mungkin oleh DB, tetapi ketika data mulai mengisi dan mengekspos kekurangan, seperti kebutuhan untuk beberapa validasi input, senang untuk menegakkan ini di tingkat aplikasi (meskipun saya lebih suka menerapkan pada sisi klien, terkadang perlu ditangani di sisi server jika aturan validasi bergantung pada data yang hanya diketahui oleh server (disimpan dari aplikasi klien)). Apakah itu masalah besar untuk mengubah seperangkat aturan integritas DB, saya membayangkan itu bukan masalah sepele?
samis
2

Menulis layanan web yang hanya membungkus panggilan ke prosedur tersimpan tampaknya merupakan pendekatan yang salah arah untuk merancang DAL yang baik. Kemungkinan besar, prosedur tersimpan Anda adalah kode warisan yang tersisa dari sistem klien-server yang lebih lama, misalnya aturan bisnis yang terkubur di dalam SP. Jika itu masalahnya, Anda benar-benar berusaha membuat dompet sutra dari telinga babi.

Selain itu, Anda menambahkan lapisan protokol pesan SOAP yang menambahkan kinerja hit ke aplikasi web yang telah 'dipaksa' untuk berkencan dengan 'babi' ini. Saat ini saya sedang mengerjakan proyek di mana aplikasi MVC-4 baru kami telah diinstruksikan untuk menggunakan DAL semacam itu. Kami memiliki beban untuk mengubah baik tanda tangan WebMethod maupun tanda tangan SP setiap kali muncul cerita pengguna baru yang memerlukan perubahan tersebut; yang bagi kami adalah setiap sprint. Yang melekat dalam pendekatan passthru semacam itu adalah dua tingkatan yang sangat erat.

Sevasanakid
sumber
1
Web API mengatasi masalah mengasapi WCF / SOAP. Sekarang seperti kucing yang ringan, bugar, dan gesit; hanya apa yang dibutuhkan untuk melayani dengan tenang.
samis
Secara teori, tidak salah untuk memanggil procs tersimpan menggunakan layanan web.
NoChance
2

1) Sakit kepala dalam memelihara database berkurang dari sisi pengembang sehingga mereka hanya dapat fokus pada pengembangan.

2) Layanan web mendukung komunikasi dari berbagai platform (sistem operasi seperti windows, ios, android dll) dengan metode yang sangat mudah dan efektif. Misalnya mempertimbangkan situasi ketika aplikasi android & aplikasi ios ingin berkomunikasi ke situs web yang berbasis java sehingga untuk komunikasi ketiga hal webservice adalah solusi terbaik daripada memelihara tiga database yang berbeda.

Rohan
sumber
1

Secara umum

  1. Tingkat Layanan Web mempromosikan penggunaan kembali permintaan data umum untuk beberapa aplikasi
  2. Layanan Web dapat disiapkan dengan manajemen versi yang mengalihkan banyak masalah yang timbul dari pengembangan tingkat aplikasi. Misalnya jika saya baru dalam suatu proyek yang aplikasi yang sudah ada saya gunakan sebagai model yang baik untuk mengkonfigurasi aplikasi saya untuk menggunakan sumber database yang ada.
  3. Layanan Web telah berevolusi untuk memungkinkan opsi yang fleksibel untuk mengirim permintaan dan mendapatkan hasil respons kembali dalam format umum seperti JSON dengan menggunakan URI sederhana yang berarti bahwa aplikasi klien dapat dikembangkan menggunakan standar yang lebih umum yang mendorong antarmuka seragam yang dapat diandalkan.

Saya baru saja menatap ASP.NET Web Api dan berencana membuat layanan data terlebih dahulu.

Saya baru-baru ini berfokus pada aplikasi web .NET MVC dengan menggunakan kerangka entitas.

  1. Jika Anda sudah menggunakan MVC, Web Api juga menggunakan MVC dengan pengontrol Api sehingga kurva pembelajaran untuk membangun layanan tidak terlalu merepotkan.

Saya baru-baru ini menemukan diri saya dalam kesulitan yang membuat frustrasi dengan aplikasi web MVC yang saya buat awalnya berdasarkan prosedur tersimpan Oracle. Versi asli sebagai Oracle 9 atau bahkan sebelumnya yang menghadirkan masalah lain dengan Visual Studio 2012 mendorong pendekatan pabrik koneksi yang lebih modern dengan rakitan waktu muat menemukan file dll yang tepat untuk digunakan berdasarkan koneksi konfigurasi web dan nama TNS.

Upaya untuk menyambung ke database gagal dengan pesan kesalahan 'tidak lagi didukung'. Karena penasaran saya mengunduh Oracle 12c dan membuat beberapa koneksi tingkat aplikasi yang bekerja dengan baik dengan nama TNS saya dan dll perakitan beban dan saya dapat bekerja dengan Oracle tanpa masalah.

Ada beberapa layanan web yang dibangun yang bekerja dengan koneksi ke versi Oracle yang lebih lama. Mereka dibangun dengan metode yang secara khusus dipetakan ke tabel yang dipilih namun mengecewakan saya. Saya harus menulis sendiri.

Saya diberitahu bahwa grup yang bertanggung jawab untuk memelihara database Oracle bahwa mereka akan menulis prosedur tersimpan baru untuk menggantikan yang lama yang saya gunakan untuk mengabstraksi antarmuka klien dan lapisan logika bisnis.

Jadi pikiran pertama saya adalah bahwa semua permintaan data umum seperti mengisi daftar drop-down atau melengkapi otomatis dengan data luas perusahaan dilakukan melalui layanan data yang akan memanggil prosedur tersimpan Oracle. Mengapa mengulangi proses itu pada setiap aplikasi dan membuat setiap pengembang berjuang dengan konfigurasi dan perakitan versi / beban, masalah TNS?

begitu....

  1. Untuk beberapa masalah server database seperti menggunakan prosedur tersimpan Oracle di aplikasi .NET MVC yang mungkin biasanya menggunakan EF untuk penggunaan data SQL Server, mengapa tidak mendorong sakit kepala tersebut ke metode layanan Web Api di mana masalah konfigurasi tersebut dapat diisolasi.
  2. Sekali lagi antarmuka klien dapat dilakukan menggunakan JavaScript, JQuery dan JSON yang sudah Anda gunakan jika Anda melakukan ini menggunakan Api Web untuk membuat permintaan data SQL Server.

Saya seorang Pengembang Aplikasi / Analis dan bukan DBA, jadi perspektif saya adalah satu dari pengalaman dengan rasa frustrasi yang tidak pernah berakhir karena harus terus-menerus memodifikasi aplikasi ketika alat database berkembang.

Brian Quinn
sumber