Pengembangan Web: Tantangan Membuat Layanan Obrolan Handal

Page breadcrumbsEnd of page breadcrumbs

Fitur nyata dari aplikasi saat ini adalah obrolan waktu nyata. Saat ini, komunikasi dan jejaring sosial tidak hanya memungkinkan pengguna untuk berbicara satu sama lain di internet, tetapi percakapan sangat penting di sektor kesehatan, e-commerce, game, dan di banyak bidang lainnya.

Karena perubahan ini, banyak pengembang berkewajiban untuk menerapkan konversi dalam aplikasi mereka. Sebagai kepala platform dan kemudian CUS de Pusher, saya menjalani perjalanan ini dengan tim yang membuat Chatkit layanan obrolan waktu nyata kami.

Dari sudut pandang antarmuka, percakapan mungkin tampak sederhana, tetapi ada banyak tantangan desain perangkat lunak menarik yang menawarkan dukungan andal. Persyaratan penskalaan kami telah membuat masalah kami semakin tajam: ribuan pelanggan dan jutaan pengguna akhir mengandalkan produk kami dan mengharapkan kami untuk mengadopsi produk obrolan kami.

Dengan lebih dari 8.000 pengembang web Daftar Situs Judi Bola yang menggunakan layanan kami, kami senang mendapatkan beberapa wawasan tentang apa yang dapat dilakukan sistem untuk menangani aplikasi suara kelas atas.

Ada banyak kegunaan lain yang menghadirkan tantangan serupa, jadi memahami cara membuat aplikasi yang andal dan mudah dirawat dapat menjadi keterampilan yang berharga bagi setiap insinyur perangkat lunak.

Takeaways Kunci Teratas:

  • Terlepas dari kemajuan yang telah dicapai dalam desain sistem waktu nyata, masih banyak pekerjaan yang diperlukan untuk mengimplementasikan layanan seperti obrolan.
  • Ada beberapa database yang dapat mentransfer data untuk menskalakan pesan, sehingga aplikasi waktu nyata sering kali harus berbagi fungsionalitas untuk mengirim pembaruan dan membuat perubahan pada subsistem tertentu.
  • Logika aplikasi dapat disederhanakan jika layanan dasar memberikan pandangan yang koheren tentang keadaan. Menyediakan API obrolan yang koheren mengurangi jumlah pekerjaan integrasi untuk pelanggan kami.
  • Koordinasi dua atau lebih sistem memerlukan desain yang cermat untuk mencegah inkonsistensi dan kondisi balapan memasuki logika aplikasi.
  • Pembeli yang bertanggung jawab atas koordinasi cedera dapat meningkatkan biaya cedera dan pengembangan klaim. Seringkali, logika server dapat mengatasi masalah ini.

Waktu Nyata Tetap Menjadi Tantangan

Sejak membuat WebSocket IETF standar pada tahun 2011, aplikasi web real-time dan ponsel tidak pernah diimplementasikan. Membuat koneksi WebSocket lebih mudah melalui TLS, sangat meningkatkan keterlibatan pengguna.

Terlepas dari peningkatan pelanggan yang besar, insinyur perangkat lunak masih memiliki banyak pengalaman dalam mengintegrasikan logika bisnis real-time ke dalam mesin. Sistem real-time modern seringkali perlu didistribusikan secara luas, yang berarti pengembang ditantang oleh stabilitas perdagangan yang tersedia. Sebagian besar kompromi ini berisi database.

READ:   APA ITU PASARAN OVER UNDER (OU)

Karena banyaknya sistem manajemen basis data, insinyur perangkat lunak masih dapat mengagumi solusi yang mendukung pembaruan waktu nyata. Basis data relasional sangat cocok untuk banyak aplikasi, tetapi tidak dapat mengirim data ke setidaknya jutaan pengguna. Tidak ada opsi freelance yang sangat disarankan secara real time. RethinkDB adalah yang paling dekat untuk mencapai solusi penyimpanan real-time sejauh ini, tetapi mencoba untuk mendapatkan daya tarik dan tidak dipertahankan.

Secara teknis, masih dimungkinkan untuk membangun sistem obrolan dengan basis data yang tidak didukung untuk mengirim pembaruan secara real time.

Metode database real-time yang paling umum yang tidak diinginkan termasuk survei (server atau sisi server) dan signage (klien menerima pemberitahuan saat mereka perlu mengirimkan data). Sayangnya, meskipun analisisnya murni konseptual, pengubahan ukuran membutuhkan banyak biaya – dibutuhkan banyak siklus CPU, memori, dan bandwidth untuk menangani semua permintaan data.

Memperbarui atau Menggabungkan Kembali Pengembangan Web

Karena layanan obrolan kami harus berbasis tekanan dan database tidak dapat mengirim data ke kurir, kami ingin mengembangkan solusi penyimpanan yang membosankan.

Kami merasa bahwa sistem penyimpanan internal dapat ditulis yang dapat menangani data dengan andal untuk ribuan pelanggan, tetapi kami segera menyadari betapa tidak mungkinnya operasi ini. . Bulan-bulan yang dihabiskan untuk dasar-dasar layanan tidak cukup menarik bagi siapa pun.

Keputusan desain utama yang kami buat adalah membagi masalah menjadi dua tugas yang lebih kecil:

  • Pertama, kami ingin menemukan sistem yang dapat mengirimkan pesan ke pengguna akhir dengan janji latensi waktu nyata.
  • Kedua, kami harus menutup celah stabilitas, tetapi solusi arsip tidak berlaku untuk pembaruan bobot.

Untuk bagian waktu nyata, pilihannya mudah bagi kami: kami menggunakan Redis dalam produksi selama bertahun-tahun dan itu sangat sukses. Redis sangat baik untuk peningkatan berbiaya rendah, tetapi karena sifatnya yang dimaksudkan, itu tidak ideal untuk pengarsipan.

Kami memilih PostgreSQL untuk arsip jangka panjang, database lain yang dipahami dengan baik oleh teknisi kami. PostgreSQL dikenal dengan komitmen konsistensinya dan dalam kasus kami akan mengisi kesenjangan kelangsungan hidup data yang ditinggalkan oleh Redis.

READ:   5 Langkah Mudah Menang Over Under

Model data yang kami rancang untuk Redis dan Postgres selaras dengan baik, memungkinkan kami untuk memperluas layanan secara horizontal di masa mendatang.

Setelah kami yakin dapat menangani kedua sistem secara individual, tantangan berikutnya yang kami hadapi adalah mengintegrasikannya ke dalam paket obrolan terintegrasi.

Sinkronisasi Pengembangan Web

Kombinasi dua sistem sirkulasi selalu menimbulkan masalah sinkronisasi yang kompleks.

Saat layanan kami berbicara dengan database melalui jaringan, kami harus menghadapi dampak teorema CAP, yang berarti sistem kami harus menghindari konsistensi atau tersedia untuk pengguna. final selama partisi jaringan. Mari kita pertimbangkan juga teori PACELC – perpanjangan dari CAP – yang menyatakan bahwa tanpa pemisahan jaringan, sistem harus memberikan ketidakberpihakan atau konsistensi.

Setia pada filosofi desain API kami, kami telah memutuskan untuk meningkatkan kenyamanan pelanggan kami.

Penggunaan aman layanan obrolan kami untuk mengurangi jaminan konsistensi membutuhkan lebih banyak upaya, jadi kami memilih konsistensi dalam akses (dalam hal pemisahan jaringan) dan failover (ketika jaringan beroperasi penuh). ). Sementara jangkauan dan latensi terpenuhi, kami merasa bahwa pelanggan kami menghargai penulisan kode integrasi dan bahwa pelanggan mereka tidak akan melihat perbedaan dalam situasi kehidupan nyata.

Untuk mengilustrasikan kompromi, kami akan menjelaskan bagaimana aplikasi menerima pesan untuk ruang obrolan:

Setiap kali pengguna akhir membuka dialog di aplikasinya, kliennya harus menerima pesan historis dan berlangganan pesan baru. Seperti disebutkan di bagian sebelumnya, dua operasi ini tiba dalam dua sistem otonom: Pelanggan memulihkan pesan lama dari PostgreSQL dan menerima pesan baru di Redra. Ketentuan ini mencerminkan teori PAC dan PACELC dalam tiga cara: kehilangan data, duplikasi data, dan urutan yang salah.

Potensi kehilangan data berasal dari ketidakamanan sistem penerbitan Redis, di mana pesan yang diterima setelah keanggotaan tidak diterima oleh pelanggan. Jika pelanggan menerima data historis sebelum langganan Redis dibuat, tidak mungkin untuk mengetahui apakah ada pesan yang hilang.

Berlangganan Redis sebelum menerima pesan lama untuk menyelesaikan masalah, tetapi biarkan data duplikat dan perintah terbuka.

Masalah pesanan mudah dilihat: pelanggan mengirimkan kueri riwayat ke Postgres setelah menyiapkan langganan Redis, yang berarti permintaan akan kembali selama berjam-jam atau berhari-hari yang mungkin ada di sana. setelah pesan baru mulai mengalir melalui langganan. Ini mengharuskan klien untuk mengirim pesan secara real time sampai masalah historis berakhir.

READ:   Waspadalah terhadap semua penipuan kasino terkenal Malaysia Malaysian

Duplikasi lebih sulit untuk diperhatikan, karena membutuhkan beberapa pekerjaan yang harus diselesaikan dalam waktu singkat.

Setelah pelanggan mendaftar dengan Redis, itu akan mengirim permintaan ke pesan bersejarah untuk Postgres. Sementara pertanyaan itu mengambil data, pengguna lain dapat mengirim pesan di ruang obrolan yang sama. Chatkit menggunakan pengidentifikasi pesan yang sepenuhnya disesuaikan. Saat kueri historis kedaluwarsa dan daftar pesan didiskon oleh langganan Redis bersama dengan hasil permintaan, klien menggandakan dirinya sendiri dengan memeriksa pengidentifikasi pesan.

Ada banyak data aplikasi yang dapat dibuat atau dihancurkan oleh logika di atas, tetapi memang demikian, algoritme memastikan bahwa pelanggan kami menyediakan pembaruan streaming yang andal.

Ubah ke Server

Meskipun secara teknis dimungkinkan untuk menerapkan logika di atas ke jaringan dan pesan seluler, kami telah memutuskan untuk menekankan logika yang terdaftar di server. Akan ada beberapa alasan di balik keputusan ini yang umum untuk setiap implementasi percakapan, beberapa di antaranya khusus untuk kebutuhan kita.

Pertama, kami harus mendukung Chatkit di tiga platform: Web, iOS, dan Android. Masing-masing platform ini memiliki masalah sendiri, seperti berbagai API jaringan dan prioritas kepatuhan. Kami tidak hanya harus mengganti logika kompleks tiga kali, tetapi kami juga harus menyesuaikan semua lingkungan, sehingga lebih sulit bagi teknisi kami untuk memelihara perpustakaan.

Kedua, implementasi sisi klien akan jauh lebih buruk dari sudut pandang, terutama pada jaringan yang lambat. Diperlukan dua siklus siklus klien-server (API waktu-nyata, API tunggal, dan cache API) dan dua di sisi server (dari API waktu-nyata ke Redis, satu dari API arsip ke Postgres). Ketika logika terkoordinasi dipindahkan ke sisi server, klien dapat mengambil data historis dan mencatat pembaruan dalam waktu pengiriman yang tepat. Di jaringan seluler, ini dapat menghemat detik dari waktu pemuatan.

Ketiga, dengan menghapus logika ini dari API server, kita membiarkan pintu terbuka dengan banyak atraksi. Ada banyak area di mana buffer dan cache dapat meningkatkan jenis dan efektivitas masalah keanggotaan dan historis. Lebih mudah untuk mengontrol logika dan pengembangan sisi server, terutama dalam kasus kami, karena kami tidak dapat memaksa klien kami untuk memperbarui pustaka pesan dalam aplikasi mereka.