Bagaimana cara menyusun data yang dikirim dari server ke pengguna?
Gunakan pola olahpesan . Yah, Anda sudah menggunakan protokol pengiriman pesan, tapi maksud saya struktur perubahan sebagai pesan ... khusus acara. Ketika sisi server berubah, itu menghasilkan peristiwa bisnis. Dalam skenario Anda, pandangan klien Anda tertarik dengan acara ini. Peristiwa harus berisi semua data yang relevan dengan perubahan itu (tidak harus semua data tampilan). Halaman klien kemudian harus memperbarui bagian tampilan yang dipertahankan dengan data acara.
Misalnya, jika Anda memperbarui ticker saham dan AAPL berubah, Anda tidak ingin menekan semua harga saham atau bahkan semua data tentang AAPL (nama, deskripsi, dll). Anda hanya akan mendorong AAPL, delta, dan harga baru. Pada klien, Anda hanya akan memperbarui harga saham itu pada tampilan.
Haruskah saya mengirim acara seperti "sumber ini telah diperbarui dan Anda harus memuatnya kembali melalui panggilan AJAX" atau mendorong data yang diperbarui dan mengganti data sebelumnya yang dimuat melalui panggilan AJAX awal?
Saya akan mengatakan tidak. Jika Anda mengirim acara, silakan dan kirim data yang relevan dengannya (bukan data seluruh objek). Beri nama untuk jenis acara itu. (Penamaan dan data apa yang relevan dengan peristiwa itu berada di luar lingkup kerja mekanis sistem. Ini lebih berkaitan dengan bagaimana logika bisnis dimodelkan.) Tampilan Anda para pemberi pembaruan perlu tahu cara menerjemahkan setiap peristiwa spesifik ke dalam perubahan tampilan yang tepat (yaitu hanya perbarui apa yang berubah).
Bagaimana cara mendefinisikan kerangka yang koheren dan skalabel untuk data yang dikirim? apakah ini pesan pembaruan model atau pesan "ada kesalahan dengan blahblahblah"
Saya akan mengatakan ini adalah pertanyaan besar dan terbuka yang harus dipecah menjadi beberapa pertanyaan lain dan diposting secara terpisah.
Secara umum, sistem back-end Anda harus membuat dan mengirimkan peristiwa untuk kejadian penting pada bisnis Anda. Itu bisa datang dari feed eksternal atau dari aktivitas di back-end itu sendiri.
Bagaimana tidak mengirim data tentang semuanya dari mana saja di backend?
Gunakan pola terbitkan / berlangganan . Ketika SPA Anda memuat halaman baru yang tertarik untuk menerima pembaruan waktu-nyata, halaman tersebut harus berlangganan hanya acara-acara yang dapat digunakan, dan memanggil logika pembaruan tampilan saat peristiwa-peristiwa itu masuk. Anda mungkin perlu pub / sub logika server untuk mengurangi beban jaringan. Perpustakaan ada untuk pub / sub Websocket, tapi saya tidak yakin apa yang ada di ekosistem Rails.
Bagaimana cara mengurangi duplikasi logika bisnis di server dan di sisi klien?
Sepertinya Anda harus memperbarui data tampilan di klien dan server. Dugaan saya adalah Anda memerlukan data tampilan sisi server sehingga Anda memiliki snapshot untuk memulai klien real-time. Karena ada dua bahasa / platform yang terlibat (Ruby dan Javascript), logika pembaruan tampilan harus ditulis dalam keduanya. Selain dari transpiling (yang memiliki masalah sendiri), saya tidak melihat jalan keluarnya.
Poin teknis: Manipulasi data (tampilan pembaruan) bukan logika bisnis. Jika yang Anda maksud validasi use case, maka itu tampaknya tidak dapat dihindari karena validasi klien diperlukan untuk pengalaman pengguna yang baik, tetapi pada akhirnya tidak bisa dipercaya oleh server.
Inilah cara saya melihat hal seperti itu terstruktur dengan baik.
Pandangan Klien:
- Meminta snapshot tampilan dan nomor acara yang terakhir dilihat
- Ini akan mempopulasikan tampilan sehingga klien tidak harus membangun dari awal.
- Bisa lebih dari HTTP GET untuk kesederhanaan
- Membuat koneksi websocket dan berlangganan ke acara tertentu, mulai dari nomor acara terakhir tampilan.
- Menerima acara melalui websocket dan memperbarui tampilan berdasarkan tipe acara / data.
Perintah Klien:
- Minta perubahan data (HTTP PUT / POST / DELETE)
- Respons hanya berhasil atau gagal + kesalahan
- (Acara yang dihasilkan oleh perubahan akan muncul di websocket dan memicu pembaruan tampilan.)
Sisi server sebenarnya dapat dipecah menjadi beberapa komponen dengan tanggung jawab terbatas. Satu yang hanya memproses permintaan masuk dan membuat acara. Yang lain bisa mengelola langganan klien, mendengarkan acara (katakanlah dalam proses) dan meneruskan acara yang sesuai kepada pelanggan. Anda dapat memiliki pihak ketiga yang mendengarkan acara dan memperbarui tampilan sisi server - mungkin ini bahkan terjadi sebelum pelanggan menerima acara tersebut.
Apa yang saya jelaskan adalah bentuk CQRS + Messaging , dan strategi khas untuk mengatasi jenis masalah yang Anda hadapi.
Saya tidak memasukkan Sourcing Acara ke dalam deskripsi ini karena saya tidak yakin apakah itu sesuatu yang ingin Anda ambil atau jika Anda membutuhkannya. Tetapi ini adalah pola yang terkait.