REST atau antrian pesan dalam sistem heterogen multi-tier?

9

Saya merancang API REST untuk sistem tiga tingkat seperti: Client application-> Front-end API cloud server-> user's home API server (Home).

Homeadalah perangkat rumah, dan seharusnya menjaga koneksi Front-endmelalui Websocket atau jajak pendapat yang panjang (ini adalah tempat pertama di mana kita melanggar REST. Semakin buruk nantinya) . Front-endsebagian besar Clientpermintaan terowongan untuk Homekoneksi dan menangani beberapa panggilan itu sendiri. Terkadang Homemengirim pemberitahuan ke Client.

Front-enddan Homepada dasarnya memiliki API yang sama; Clientmungkin terhubung Homesecara langsung, melalui LAN. Dalam hal ini, Homeperlu mendaftarkan beberapa Clienttindakan pada Front-enddirinya sendiri.

Kelebihan untuk REST dalam sistem ini adalah:

  • REST dapat dibaca oleh manusia;
  • REST memiliki pemetaan kata kerja yang didefinisikan dengan baik (seperti CRUD), kata benda dan kode respons terhadap objek protokol;
  • Ia bekerja melalui HTTP dan melewati semua proxy yang mungkin;

Kontras REST adalah:

  • Kami tidak hanya membutuhkan gaya komunikasi permintaan-respons, tetapi juga berlangganan-penerbitan;
  • Kode kesalahan HTTP mungkin tidak cukup untuk menangani kesalahan komunikasi tiga tingkat; Front-endmungkin kembali 202 Acceptedke beberapa panggilan async hanya untuk mengetahui bahwa Homekoneksi yang diperlukan terputus dan seharusnya ada 503;
  • Homeperlu mengirim pesan ke Client. Clientharus polling Front-endatau untuk menjaga koneksi.

Kami sedang mempertimbangkan WAMP / Autobahn melalui Websocket untuk mendapatkan fungsionalitas mempublikasikan / berlangganan, ketika saya menyadari bahwa itu sudah terlihat seperti antrian pesan.

Apakah layak mengevaluasi semacam antrian pengiriman pesan sebagai transportasi?

Sepertinya contra antrian pesan adalah:

  • Saya perlu mendefinisikan kata kerja CRUD dan kode kesalahan pada tingkat pesan.
  • Saya membaca sesuatu tentang "biaya perawatan yang lebih tinggi", tetapi apa artinya?

Seberapa serius pertimbangan ini?

Victor Sergienko
sumber
1
Mengapa Anda memiliki server cloud dalam campuran? Kedengarannya seperti itu redirect yang membuat saya berpikir itu harus masuk akal pada mesin yang sama dengan server rumah ...
Jimmy Hoffa
3
ketika Anda menganalisis antrian pesan, perhatikan bahwa sebagian besar dioptimalkan untuk LAN pribadi: latensi rendah, klien terkontrol, jaringan yang dilindungi, dll. mengekspos antrian ke internet dapat menjadi masalah keamanan yang sangat besar .
Javier
@Jimmy Hoffatitik valid, terima kasih. Itu benar, tetapi tidak sepenuhnya. Ini adalah database umum, penyimpanan, dan sebagainya. @Javierterima kasih, itu bagian yang baik dari sebuah jawaban.
Victor Sergienko
Apakah server Home seharusnya dijalankan di rumah pengguna dan front-end di cloud? Rumah terhubung ke front-end dan klien mengirim pesan ke rumah melalui front-end. Jika saya memahami desain Anda dengan benar, saya bisa memberikan jawaban yang bagus.
Michael Brown
@Mike Brownpersis. Silakan lakukan.
Victor Sergienko

Jawaban:

5

Jika Anda memiliki konektivitas, lanjutkan dengan antrian pesan - meskipun Anda harus mendefinisikan protokol Anda sendiri (bukan tugas yang sulit!) Untuk mengirim pesan dari struktur dan format tertentu.

Masalah dengan pemeliharaan adalah bahwa biasanya klien dan server dibangun secara terpisah sehingga Anda harus berhati-hati untuk menjaga kedua ujungnya menggunakan definisi pesan yang sama, tetapi jika Anda tidak cukup terorganisir, cukup gunakan XML yang sama yang akan Anda gunakan dalam REST Anda layanan.

Jika Anda memiliki masalah konektivitas melalui internet, dengan port 80 dan http saja dan komunikasi 'searah' maka sistem gaya REST mungkin yang terbaik. Kirim dan polling, atau dapatkan websocket untuk data panggilan balik, tetapi umumnya arsitek sistem Anda adalah klien / server. Jika Anda memiliki kemampuan untuk mendapatkan konektivitas, maka sistem pengiriman pesan sangat bagus.

Saya akan menggunakan ZeroMQ untuk sistem pengiriman pesan, yang cukup dapat dikonfigurasi untuk memutar semua skenario, termasuk yang toleran terhadap kesalahan. Saya tidak yakin bahwa itu berfungsi lebih dari http .

gbjbaanb
sumber
Terima kasih. Apa yang saya temukan setelah @Javierberkomentar: ØMQ tampaknya tidak mendukung enkripsi itu sendiri. Atm : zeromq.org/area:faq#toc8 melalui RabbitMQ: rabbitmq.com/ssl.html
Victor Sergienko
Saya tidak tahu apakah saya memiliki konektivitas. Homeadalah perangkat rumah pengguna, dan Clientmerupakan smartphone melalui Wi-Fi atau 3G. Salah satu bagian besar dari pertanyaan adalah ketidaktahuan saya tentang metode NAT traversal.
Victor Sergienko
5

Sepertinya Autobahn cocok dengan apa yang Anda coba lakukan. Ada alat lain yang tersedia juga. Lihat Windows Azure Service Bus (yang memiliki kerangka kerja klien untuk Java, .NET, PHP, Python, NodeJS, dan Ruby).

Sementara pesan built in rest berguna. Anda akan menemukan bahwa aplikasi Anda akan melampaui operasi CRUD dasar. Misalnya jika aplikasi Anda adalah sistem perbankan. Dari pada

Perbarui Acct 54321 Balance = Saldo - 20.00 Perbarui Acct 98765 Balance = Saldo + 20.00

Anda mungkin ingin satu pesan seperti

Transfer 20,00 dari akun 54321 ke akun 98765

Yang terbaik adalah Anda menemukan hambatan ini dengan REST sekarang daripada nanti. Lihat Pusat Acara Greg Young yang membahas cara membuat model yang lebih kaya untuk pengiriman pesan dalam aplikasi Anda.

Michael Brown
sumber
Terima kasih banyak. Memang kami mungkin melebihi CRUD, meskipun tidak segera, domain kami cukup sederhana sekarang. BTW bukunya belum diterbitkan, mencoba menemukan beberapa matherial di blog Greg ... Saya pikir bagus saya tidak perlu menggunakan teknologi Microsoft untuk itu.
Victor Sergienko
Tunggu bukunya masih belum keluar ... dia sudah membicarakannya begitu lama ... terdengar seperti penulis teknis lain yang saya tahu. : ">
Michael Brown
1
Sebagai catatan, pendekatan REST adalah memiliki sumber daya Transfer yang Anda buat. Atau bahkan TransferRequest yang dapat lulus atau tidak. REST menjadi rumit dalam beberapa kasus, tetapi ini bukan salah satunya.
Jacek Gorgoń