Apakah whatsapp menggunakan rabbitmq
Apakah whatsapp menggunakan rabbitmq
Rabbitmq dibangun di atas Erlang bahasa pemrograman tujuan umum dan juga digunakan oleh whatsapp untuk mengirim pesan.
Ringkasan
Whatsapp menggunakan rabbitmq, yang dibangun di erlang, sebagai antrian pesan untuk pengiriman pesan.
Saat merancang sistem obrolan real-time, penting untuk mempertimbangkan antrian yang digunakan oleh platform pesan populer seperti WhatsApp dan Facebook Messenger. Meskipun mungkin tampak logis untuk memiliki antrian per orang atau kafka-topic untuk setiap pengguna, mengingat miliaran pengguna di platform ini, pendekatan ini akan membutuhkan jumlah antrian atau topik yang tidak praktis. Namun, telah diamati bahwa whatsapp dan facebook messenger menggunakan antrian yang disebut “iris” (mirip dengan kafka) untuk pengiriman pesan.
Ada sistem internal di tempat yang mengisi basis data (seperti HBase dan MyRocks) dari antrian pesan, tetapi database ini bukan sistem pengiriman utama.
Pertanyaan dan jawaban
1. Apa yang dibangun rabbitmq?
Rabbitmq dibangun di atas bahasa pemrograman ERlang umum.
2. Bagaimana whatsapp menggunakan rabbitmq?
Whatsapp menggunakan rabbitmq sebagai antrian pesan untuk pengiriman pesan.
3. Apa tujuan dari antrian pesan?
Antrian pesan digunakan untuk memisahkan komponen suatu sistem, memungkinkan pesan untuk dikirim di antara mereka secara tidak sinkron.
4. Dapatkah antrian per orang digunakan untuk pengiriman pesan di whatsapp atau facebook messenger?
Sementara antrian per orang mungkin tampak logis, itu akan membutuhkan jumlah antrian yang tidak praktis yang diberikan miliaran pengguna di platform ini.
5. Antrian apa yang digunakan oleh whatsapp dan facebook messenger untuk pengiriman pesan?
Whatsapp dan facebook messenger menggunakan antrian yang disebut “iris” untuk pengiriman pesan. “Iris” mirip dengan kafka.
6. Apa saja basis data yang digunakan oleh WhatsApp untuk menyimpan pesan?
WhatsApp menggunakan database seperti HBase dan MyRocks untuk menyimpan pesan. Basis data ini diisi dari antrian pesan.
7. Adalah rabbitmq sistem pengiriman utama untuk whatsapp?
Tidak, Rabbitmq bukan sistem pengiriman utama untuk whatsapp. Ini digunakan sebagai antrian pesan untuk pengiriman pesan.
8. Adalah pengiriman pesan di whatsapp dan facebook messenger sinkron atau asinkron?
Pengiriman Pesan di WhatsApp dan Facebook Messenger tidak sinkron, artinya pesan dikirim dan diterima secara independen.
9. Apa manfaat menggunakan antrian pesan seperti Rabbitmq?
Menggunakan antrian pesan seperti RabbitMQ memungkinkan untuk decoupling komponen, peningkatan skalabilitas, dan komunikasi asinkron antara elemen sistem.
10. Dapatkah rabbitmq menangani volume pesan tinggi?
Ya, RabbitMQ dirancang untuk menangani volume pesan yang tinggi dan mampu mengirimkannya secara efisien dan andal.
11. Apa alternatif RabbitMQ untuk menerapkan antrian pesan?
Beberapa alternatif untuk RabbitMQ termasuk Apache Kafka, ActiveMQ, dan Redis Streams.
12. Apakah ada batasan untuk menggunakan antrian pesan seperti rabbitmq?
Beberapa keterbatasan menggunakan antrian pesan seperti RabbitMQ mencakup kebutuhan untuk mengkonfigurasi dan menyetelnya dengan benar untuk kinerja yang optimal, potensi kehilangan pesan jika tidak dikonfigurasi dengan benar, dan kebutuhan untuk infrastruktur tambahan untuk mendukung antrian pesan pesan pesan.
13. Dapatkah rabbitmq digunakan untuk keperluan lain selain pengiriman pesan?
Ya, RabbitMQ dapat digunakan untuk keperluan lain selain pesan, seperti penjadwalan tugas, arsitektur berbasis acara, dan streaming data.
14. Apakah rabbitmq mendukung persistensi pesan?
Ya, RabbitMQ mendukung persistensi pesan, memungkinkan pesan disimpan dan diambil bahkan jika terjadi kegagalan sistem.
15. Bagaimana RabbitMQ memastikan keandalan pengiriman pesan?
RabbitMQ memastikan keandalan pengiriman pesan melalui fitur seperti pengakuan pesan, penerbit mengonfirmasi, dan ketahanan antrian.
Apakah whatsapp menggunakan rabbitmq
Rabbitmq dibangun di atas Erlang bahasa pemrograman tujuan umum dan juga digunakan oleh whatsapp untuk mengirim pesan.
Antrian digunakan dalam whatsapp atau fb messenger
Sambil memikirkan desain sistem untuk obrolan real-time, saya penasaran dengan antrian apa yang digunakan whatsapp atau fb messenger di sisi server untuk mengirimkan pesan ke penerima. Apa yang saya pikirkan adalah ada antrian per orang/kafka-topic, jadi ketika pesan baru perlu dikirim ke pengguna A, pesannya adalah enqueue ke antrian A. Namun, mungkin ada miliaran pengguna (FB memiliki 2 miliar pengguna), apakah itu berarti kita membutuhkan 2 miliar antrian/topik (dalam istilah kafka)? Jika demikian, antrian mana yang dapat menangani ini dengan performa. Komentar apa pun diterima! Terima kasih!
Ditanya 25 Juni 2019 jam 16:44
1.669 8 8 Lencana Emas 23 23 Lencana Perak 37 37 Lencana Perunggu
Anda dapat menemukan dokumentasi bahwa Messager dibangun di atas HBase, dan sekarang myrocks. Ada sistem internal yang akan mengisi basis data tersebut dari antrian, ya, tapi itu bukan sistem pengiriman utama. kode.fb.com/core-data/…
26 Juni 2019 jam 3:08
@cricket_007 Terima kasih atas komentarnya. Yeap, sepertinya fb menggunakan iris (kafka like) sebagai antrian untuk pengiriman.
Alifzl/Yomkippur
Komit ini bukan milik cabang apa pun di repositori ini, dan mungkin milik garpu di luar repositori.
Beralih cabang/tag
Tag cabang
Tidak bisa memuat cabang
Tidak ada yang bisa ditampilkan
Tidak bisa memuat tag
Tidak ada yang bisa ditampilkan
Nama sudah digunakan
Tag sudah ada dengan nama cabang yang disediakan. Banyak perintah git menerima nama tag dan cabang, jadi menciptakan cabang ini dapat menyebabkan perilaku yang tidak terduga. Apakah Anda yakin ingin membuat cabang ini?
Batalkan Buat
- Lokal
- Codespaces
Https github cli
Gunakan git atau checkout dengan SVN menggunakan URL Web.
Bekerja cepat dengan CLI resmi kami. Pelajari lebih lanjut tentang CLI.
Masuk
Silakan masuk untuk menggunakan codespaces.
Meluncurkan Github Desktop
Jika tidak ada yang terjadi, unduh desktop github dan coba lagi.
Meluncurkan Github Desktop
Jika tidak ada yang terjadi, unduh desktop github dan coba lagi.
Meluncurkan Xcode
Jika tidak ada yang terjadi, unduh xcode dan coba lagi.
Meluncurkan kode studio visual
Codespace Anda akan dibuka setelah siap.
Ada masalah mempersiapkan codespace Anda, coba lagi.
Komit terbaru
Statistik git
File
Gagal memuat informasi komit terbaru.
Pesan komit terbaru
Melakukan waktu
Baca aku.md
Yom Kippur adalah alat otomatisasi whatsapp yang bertujuan untuk menjadi solusi yang konsisten dan permanen untuk penggunaan non-komersial WhatsApp sebagai bot otomatis.
Apa yang dilakukannya?
- Send/Receve Single Message Dalam aplikasi WhatsApp yang telah dikonfigurasi sebelumnya di AVD (perangkat virtual Android)
- Buat daftar kontak di AVD dan gunakan untuk barang pengiriman/penerima
- Secara harfiah itu dapat melakukan segalanya dengan AVD (itu menciptakan banyak kemungkinan untuk dibujuk)
Pada awalnya, saya melihat Yowsup satu -satunya pilihan saya, tetapi karena masalah yang tercantum di bawah ini saya berubah pikiran untuk menerapkannya dengan cara lain:
- Berbagai masalah komunitas (ditautkan di sini)
- Yosup adalah jenis API yang tidak sinkron yang berinteraksi dengan WhatsApp Restapi, mengenai pertimbangan keamanan tinggi WhatsApp, itu datang sangat sensitif tentang sesi aktif saat ini dari setiap pengguna dan tidak akan terlalu ramah dengan solusi sinkron sinkron. (Seperti yang mungkin Anda ketahui pembatasan menggunakan pandangan web dari WhatsApp yang mengatakan bahwa kita harus memiliki koneksi internet aktif yang konsisten di ponsel secara bersamaan)
- kemalasan saya dan juga menantang diri saya untuk melakukannya dengan cara yang sulit
Nah, ketergantungan dalam proyek ini, mereka agak banyak! Pertama dari Anda harus memiliki kebutuhan ini puas:
Installer Windows Dibenarkan, tetapi bisa menjadi impment di Linux atau MacOS Machine (keduanya tidak diuji)
Ketergantungan | Deskripsi / Unduh Tautan |
---|---|
Studio Android | Studio Android dengan API Android 28 |
JAWA | Java JDK 11 |
Mysql | Komunitas Pemasang MySQL 8.X atau lebih |
Python 2.7 | Python 2.7 |
Appium | V1.10 atau lebih |
Rabbitmq | Versi terbaru RabbitMQ |
Tukang pos | Versi Postman Terbaru |
Pertimbangan: Anda dapat menggunakan conda virenv untuk Python 2.7, tapi itu membuat saya sakit kepala yang serius (tidak disarankan)
Alasan utama yang saya gunakan Python 2 untuk proyek ini adalah bahwa Appium, MySQL Connector Client dan RabbitMQ tidak kompatibil bersama dalam versi 3.
Pertama -tama, bersabarlah di bagian ini. Butuh darah dan air mata saya untuk menyeka dorongan untuk melakukan tugas yang sederhana ini.
1.Perangkat virtual android
Manajer AVD Luanch dari Android Studio, mengatur perangkat dengan Android 9.0 dengan API 28 (Pilih dan Nama yang sesuai untuk AVD karena kita membutuhkannya dalam langkah lebih lanjut).
Perhatikan bahwa Anda harus menginstal WhatsApp melalui AVD itu sendiri, jadi pilih versi yang didukung PlayStore.
Periksa Anda memiliki variabel lingkungan ini di akun Anda:
Nama variabel | Nilai variabel |
---|---|
Android_home | C: \ Users \ fzl \ AppData \ Local \ Android \ SDK |
Java_home | C: \ Program Files \ Java \ JDK-11.0.2 |
Pythonpath | C: \ python27; c: \ python27 \ lib \ paket situs; c: \ python27 \ lib; c: \ python27 \ dlls; c: \ python27 \ skrip |
Tambalan | C: \ python27; c: \ python27 \ skrip; c: \ python27 \ lib \ paket situs; c: \ file program \ java \ jdk-11.0.2; C: \ Program Files \ Java \ JDK-11.0.2 \ bin; |
Maka Anda harus memulai AVD Anda, menginstal WhatsApp di dalamnya, dan juga mengesahkan ADB dengan perangkat Anda (wajib)
Untuk melakukan itu, Anda harus menjalankan perangkat ADB atau ADB USB untuk memeriksa autorisasi AVD.
C:\ USers\FZl\Appdata\ LOcal\Android\SDK\PLatform-Tools: Perangkat ADB Daftar perangkat yang dilampirkan Emulator-5554 Device
Jika Anda melihat hasil yang tidak sah, Anda harus mengikuti tautan ini.
2.Konfigurasi RabbitMQ
Setelah menginstal raabitmq, Anda harus menjalankan rabbitmq-plugins memungkinkan rabbitmq_management di direktori rabbitmq sbin untuk memungkinkan web-gui dari sistem manajemen rabbitmq rabbitmq. membatasi layanan rabbitmq mungkin diperlukan.
Setelah ini, Anda harus dapat mengakses RabbitMQ Web-Gui dengan http: // localhost: 15672/#/alamat di mesin lokal Anda. Jika ya, buat pengguna baru dengan perintah di bawah ini dan buat administrasi:
Rabbitmqctl Add_user Nama Pengguna Kata Sandi # Ini membuat pengguna menjadi administrator Rabbitmqctl set_user_tag Administrator Nama Pengguna # Ini menetapkan izin untuk pengguna rabbitmqctl set_permissions -p / username ".*" ".*" ".*"
Masuk dengan kredensial yang baru dibuat dan impor spesifikasi antrian yang sudah terlampir dalam repo ini yang disebut rabbitmq_confonf.json di bagian definisi impor di bawah ikhtisar Menue.
itu akan membuat konfigurasi yang diperlukan untuk RabbitMQ dan memungkinkan hak istimewa yang dibutuhkan.
3.Appium
Cukup jalankan server Appium dengan pengaturan default. Appium –Default-Capability ” sudah tertanam dalam kode. Tl; dr: tidak ada hal yang bisa dilakukan dalam langkah ini.
4.Mysql
Instal Edisi Komunitas MySQL, buat akun DB yang sesuai dan atur Layanan yang dijalankan secara otomatis saat OS dimulai.
5.Pasang dependensi Python
Cukup jalankan Pip Install –R Dependensi.txt untuk menyelesaikan ketergantungan perpustakaan yang digunakan.
Anda mungkin menghadapi versi yang sudah usang dari perpustakaan MySQLDB yang dapat dipecahkan dengan menginstal ini dan ini. Jaga menginstal Python 2.X Versi perpustakaan yang disebutkan.
6.Buat direktori untuk file log
Buat direktori dan file saat itu’S disebutkan di bawah:
# direktori C:\ Var\ lOG [direktori] C:\ Var\ log\ wHatsapp_api [direktori] # file log C:\ Var\ log\Api.Log C:\ Var\ log\ wHatsapp_single_consumer.Log C:\ Var\ log\ wHatsapp_single_worker.Log C:\ Var\ lOG \
7.Atur yom kippur’file konfigurasi S
Pergi ke Yomkippur-Master \ Configs \ Config.CFG dan masukan berikut.
(Jangan mengubah Esle apa pun kecuali Anda tahu apa yang Anda lakukan)
[mysql] host = 127.0.0.1 nama pengguna ='Nama pengguna MySQL Anda' Kata sandi ='Kata Sandi MySQL Anda' database = whatsapp [rabbitmq] ip = 127.0.0.1 ipqueueName = ipaddr.Antrian nama pengguna ='Nama pengguna RabbitMQ Anda' Kata sandi ='Kata Sandi RabbitMQ Anda' [queue_name] single_message = whatsapp_singlemessage_queue broadcast_message = whatsapp_broadcastmessage_queue add_contact = whatsapp_newcontact_listener_queue listen_message = whatsapp_messagelistener_queue
Jalankan utama.py dan add_new_contact_producer.PY dalam dua lingkungan terminal/CMD terpisah.
Jika Anda tidak melihat kesalahan, Anda siap melakukannya.
- Pastikan server mysql sedang berjalan
- Pastikan Rabbitmq Sever adalah Runnig
- Jalankan Appium dengan Pengaturan Defualt
- Jalankan skrip ini
Python Main.py Python add_new_contact_producer.py Python single_message_producer.py
- Jalankan tukang pos dan buat perintah pos yang diinginkan dari daftar di bawah ini:
Menambahkan kontak di aplikasi Google Contacts
Mengirim pesan tunggal melalui whatsapp
Pengembangan dan berkontribusi?
Ingin berkontribusi? Besar! Jangan ragu untuk menjatuhkan saya di a.fazeli95 [at] gmail [dot] com atau hanya membuat permintaan tarik.
Semua komponen yang digunakan dalam proyek ini adalah open-source dan memiliki lisensi MIT dan dapat digunakan dalam produk non-komersial apa pun
Tentang
Pialang Pesan WhatsApp dengan RabbitMQ, AVD dan Appium
Pengantar Rabbitmq
Di sini kita akan belajar apa itu RabbitMQ, Penggunaan RabbitMQ dan mengapa kita perlu menggunakan RabbitMQ dalam aplikasi kita dengan contoh.
Apa itu RabbitMQ?
Rabbitmq adalah AMQP Pialang Pesan dan itu adalah broker pesan open source dan cross-platform paling populer.
RabbitMQ juga merupakan cara untuk bertukar data antara berbagai aplikasi platform seperti pesan yang dikirim dari .Bersih Aplikasi dapat dibaca oleh a Node.JS aplikasi atau Jawa aplikasi.
Rabbitmq dibangun di atas Erlang bahasa pemrograman tujuan umum dan juga digunakan oleh whatsapp untuk mengirim pesan.
Apa itu amqp?
Protokol antrian pesan canggih (AMQP) adalah protokol lapisan aplikasi standar terbuka untuk berorientasi pada pesan dan fitur AMQP adalah orientasi pesan, antrian, perutean (termasuk point-to-point dan menerbitkan dan berlangganan), keandalan dan keamanan.
Ini dikembangkan oleh JPMorgan dan Imatix Corporation. AMQP dirancang dengan karakteristik utama berikut sebagai tujuan:
- Keamanan
- Keandalan
- Interoperabilitas
- Standar
- Membuka
RabbitMQ ringan dan mudah digunakan di tempat yang tersedia dan mendukung beberapa protokol pesan. RabbitMQ dapat digunakan dalam konfigurasi terdistribusi dan federasi untuk memenuhi persyaratan skala tinggi dan ketersediaan tinggi.
Berikut ini adalah representasi bergambar tentang bagaimana RabbitMQ akan bertindak sebagai mediator antara pengirim dan konsumen dalam aplikasi kami.
Mengapa dan kapan menggunakan rabbitmq?
Sekarang hari kebanyakan orang akan melakukan beberapa tugas dalam aplikasi tunggal seperti mengirim email atau SMS, laporan dan itu akan membuat beban berat pada aplikasi jadi jika Anda memisahkan tugas ini, maka kami akan mendapatkan lebih banyak ruang (memori) untuk melayani lebih banyak permintaan lebih banyak permintaan.
Dengan menggunakan RabbitMQ, kami dapat menghapus beberapa pekerjaan berat dari aplikasi web kami seperti mengirim laporan dalam format Excel atau PDF’s atau mengirim email, SMS atau tugas lain seperti memicu beberapa aplikasi lain untuk mulai memproses.
Rabbitmq adalah broker pesan open source dan cross-platform’mudah digunakan dengan banyak bahasa seperti .Net, Java, Python, Ruby, Node.JS.
Rabbitmq mendukung perpustakaan klien
RabbitMQ akan mendukung beberapa sistem operasi dan bahasa pemrograman. RabbitMQ telah menyediakan berbagai perpustakaan klien untuk mengikuti bahasa pemrograman.
- .Bersih
- Jawa
- Kerangka kerja musim semi
- Rubi
- Python
- Php
- Objective-C dan Swift
- Javascript
- PERGI
- Perl
Desain Sistem: Whatsapp
Ayo Desain WhatsApp seperti layanan pesan instan, mirip dengan layanan seperti WhatsApp, Facebook Messenger, dan WeChat.
Apa itu whatsapp?
Whatsapp adalah aplikasi obrolan yang menyediakan layanan pesan instan kepada penggunanya. Ini adalah salah satu aplikasi seluler yang paling banyak digunakan di planet ini yang menghubungkan lebih dari 2 miliar pengguna di 180+ negara. Whatsapp juga tersedia di web.
Persyaratan
Sistem kami harus memenuhi persyaratan berikut:
Persyaratan fungsional
- Harus mendukung obrolan satu-satu.
- Obrolan grup (maks 100 orang).
- Harus mendukung berbagi file (gambar, video, dll.).
Persyaratan non-fungsional
- Ketersediaan tinggi dengan latensi minimal.
- Sistem harus terukur dan efisien.
Persyaratan yang diperluas
- Dikirim, dikirimkan, dan baca tanda terima pesan.
- Tunjukkan waktu yang terakhir terlihat dari pengguna.
- Pemberitahuan dorong.
Estimasi dan Kendala
Mari kita mulai dengan estimasi dan kendala.
Catatan: Pastikan untuk memeriksa skala atau asumsi terkait lalu lintas dengan pewawancara Anda.
Lalu lintas
Mari kita asumsikan kita memiliki 50 juta pengguna aktif harian (DAU) dan rata -rata setiap pengguna mengirim setidaknya 10 pesan ke 4 orang yang berbeda setiap hari. Ini memberi kami 2 miliar pesan per hari.
50 m i l l i o n × 20 m e s a g e s = 2 b i l l i o n / d a y 50 \ space Million \ kali 20 \ pesan ruang = 2 \ ruang miliar / hari 50 mi ll i o n × 20 m ess a g es = 2 bi ll i o n / d a y o n × 20 m ess a g es = 2 bi ll i o n / d a y
Pesan juga dapat berisi media seperti gambar, video, atau file lainnya. Kami dapat berasumsi bahwa 5 persen pesan adalah file media yang dibagikan oleh pengguna, yang memberi kami 200 juta file tambahan yang perlu kami simpan.
5 P e r c e n t × 2 b i l l i o n = 200 m i l l i o n / d a y 5 \ ruang persen \ kali 2 \ ruang miliar = 200 \ ruang juta / hari 5 p erce n t × 2 bi ll i o n = 200 mi ll i o n / d a y
Apa permintaan per detik (RPS) untuk sistem kami? 2 miliar permintaan per hari diterjemahkan ke dalam permintaan 24k per detik.
2 b i l l i o n (24 h r s × 3600 s e c o n d s) = ∼ 24 k r e q u e s t s / s e c o n d \ frac<2 \space billion> <(24 \space hrs \times 3600 \space seconds)>= \ SIM 24K \ Ruang Permintaan / Kedua (24 H Rs × 3600 Seco N D S) 2 Bi Ll I O N = ∼ 24 K Re Qu Es T S / SECO N D2>
### Penyimpanan Jika kami menganggap setiap pesan rata -rata adalah 100 byte, kami akan membutuhkan sekitar 200 GB penyimpanan basis data setiap hari.
2 b i l l i o n × 100 b y t e s = ∼ 200 g b / d a y 2 \ ruang miliar \ kali 100 \ byte ruang = \ sim 200 \ ruang gb / hari 2 bi ll i o n × 100 b y t es = ∼ 200 gb / d a y t a y
Sesuai persyaratan kami, kami juga tahu bahwa sekitar 5 persen dari pesan harian kami (100 juta) adalah file media. Jika kami menganggap setiap file rata -rata 50 kb, kami akan membutuhkan 10 TB penyimpanan setiap hari.
100 m i l l i o n × 100 k b = 10 t b / d a y 100 \ spasi juta \ kali 100 \ ruang kb = 10 \ ruang tb / hari 100 mi ll i o n × 100 k b = 10 tb / d a y
Dan selama 10 tahun, kami akan membutuhkan sekitar 38 PB penyimpanan.
(10 t b + 0.2 t b) × 10 y e a r s × 365 d a y s = ∼ 38 p b (10 \ ruang tb + 0.2 \ ruang tb) \ kali 10 \ ruang tahun \ kali 365 \ spasi hari = \ sim 38 \ ruang pb (10 tb + 0.2 TB) × 10 Ye A RS × 365 D A YS = ∼ 38 pb
### Bandwidth saat sistem kami menangani 10.2 TB masuk setiap hari, kami akan membutuhkan bandwidth minimum sekitar 120 mb per detik.
10.2 T B (24 H R S × 3600 S E C O N D S) = ∼ 120 m b / s e c o n d \ frac<10.2 \space TB> <(24 \space hrs \times 3600 \space seconds)>= \ SIM 120 \ Space Mb/Second (24 H Rs × 3600 Seco N D S) 10.2 tb = ∼ 120 mb / seco n d10.2>
### Perkiraan tingkat tinggi di sini adalah perkiraan tingkat tinggi kami:
Jenis | Memperkirakan |
---|---|
Pengguna Aktif Harian (DAU) | 50 juta |
Permintaan per detik (RPS) | 24k/s |
Penyimpanan (per hari) | ~ 10.2 tb |
Penyimpanan (10 tahun) | ~ 38 pb |
Bandwidth | ~ 120 mb/s |
Desain Model Data
Ini adalah model data umum yang mencerminkan persyaratan kami. Kami memiliki tabel berikut: pengguna Tabel ini akan berisi informasi pengguna seperti nama, fonenumber, dan detail lainnya. pesan Seperti namanya, tabel ini akan menyimpan pesan dengan properti seperti tipe (teks, gambar, video, dll.), konten, dan cap waktu untuk pengiriman pesan. Pesan tersebut juga akan memiliki chatid atau groupid yang sesuai . obrolan Tabel ini pada dasarnya mewakili obrolan pribadi antara dua pengguna dan dapat berisi banyak pesan. Users_chats Tabel ini memetakan pengguna dan obrolan karena banyak pengguna dapat memiliki beberapa obrolan (hubungan n: m) dan sebaliknya. kelompok Tabel ini mewakili grup antara banyak pengguna. Users_groups Tabel ini memetakan pengguna dan grup sebagai beberapa pengguna dapat menjadi bagian dari beberapa grup (hubungan n: m) dan sebaliknya.
Database jenis apa yang harus kita gunakan?
Meskipun model data kami tampaknya cukup relasional, kami tidak perlu menyimpan semuanya dalam satu database, karena ini dapat membatasi skalabilitas kami dan dengan cepat menjadi hambatan. Kami akan membagi data antara berbagai layanan yang masing -masing memiliki kepemilikan di atas tabel tertentu. Kemudian kita dapat menggunakan database relasional seperti PostgreSQL atau database NoSQL terdistribusi seperti Apache Cassandra untuk kasus penggunaan kami.
Desain API
Mari kita lakukan desain API dasar untuk layanan kami:
Dapatkan semua obrolan atau grup
API ini akan mendapatkan semua obrolan atau grup untuk pengguna yang diberikan .
dapat semua(identitas pengguna: UUID): Mengobrol[] | Kelompok[]
Masukkan mode layar penuh
Keluar dari mode layar penuh
Parameter ID Pengguna (UUID): ID dari pengguna saat ini. Kembali Hasil (obrolan [] | grup []): Semua obrolan dan grup yang menjadi bagian dari pengguna.
Dapatkan pesan
Dapatkan semua pesan untuk pengguna yang diberikan ChannelId (obrolan atau ID grup).
GetMessages(identitas pengguna: UUID, channelid: UUID): Pesan[]
Masukkan mode layar penuh
Keluar dari mode layar penuh
Parameter ID Pengguna (UUID): ID dari pengguna saat ini. ID Saluran (UUID): ID saluran (obrolan atau grup) dari mana pesan perlu diambil. Kembali Pesan (pesan []): Semua pesan dalam obrolan atau grup yang diberikan.
Mengirim pesan
Kirim pesan dari pengguna ke saluran (obrolan atau grup).
mengirim pesan(identitas pengguna: UUID, channelid: UUID, pesan: Pesan): Boolean
Masukkan mode layar penuh
Keluar dari mode layar penuh
Parameter ID Pengguna (UUID): ID dari pengguna saat ini. Saluran ID (UUID): ID dari saluran (obrolan atau grup) pengguna ingin mengirim pesan ke. Pesan (pesan): Pesan (teks, gambar, video, dll.) bahwa pengguna ingin mengirim. Kembali Hasil (boolean): mewakili apakah operasi itu berhasil atau tidak.
Bergabunglah atau tinggalkan grup
Kirim pesan dari pengguna ke saluran (obrolan atau grup).
bergabung dengan grup(identitas pengguna: UUID, channelid: UUID): Boolean meninggalkan grup(identitas pengguna: UUID, channelid: UUID): Boolean
Masukkan mode layar penuh
Keluar dari mode layar penuh
Parameter ID Pengguna (UUID): ID dari pengguna saat ini. ID Saluran (UUID): ID saluran (obrolan atau grup) Pengguna ingin bergabung atau pergi. Kembali Hasil (boolean): mewakili apakah operasi itu berhasil atau tidak.
Desain tingkat tinggi
Sekarang mari kita lakukan desain tingkat tinggi dari sistem kita.
Arsitektur
Kami akan menggunakan arsitektur Microservices karena akan membuatnya lebih mudah untuk skala horizontal dan memisahkan layanan kami. Setiap layanan akan memiliki kepemilikan atas model datanya sendiri. Mari kita coba membagi sistem kita menjadi beberapa layanan inti. Layanan Pengguna Ini adalah layanan berbasis HTTP yang menangani kekhawatiran terkait pengguna seperti otentikasi dan informasi pengguna. Layanan obrolan Layanan obrolan akan menggunakan websockets dan membuat koneksi dengan klien untuk menangani obrolan dan grup fungsionalitas terkait pesan. Kami juga dapat menggunakan cache untuk melacak semua koneksi aktif seperti sesi yang akan membantu kami menentukan apakah pengguna online atau tidak. Layanan Pemberitahuan Layanan ini hanya akan mengirim pemberitahuan push kepada pengguna. Itu akan dibahas secara rinci secara terpisah. Layanan Kehadiran Layanan kehadiran akan melacak status yang terakhir terlihat dari semua pengguna. Itu akan dibahas secara rinci secara terpisah. Layanan Media Layanan ini akan menangani media (gambar, video, file, dll.) mengunggah. Itu akan dibahas secara rinci secara terpisah. Bagaimana dengan komunikasi antar-layanan dan penemuan layanan? Karena arsitektur kami berbasis layanan mikro, layanan akan berkomunikasi satu sama lain juga. Secara umum, istirahat atau http berkinerja baik tetapi kami dapat lebih meningkatkan kinerja menggunakan GRPC yang lebih ringan dan efisien. Penemuan layanan adalah hal lain yang harus kita pertimbangkan. Kami juga dapat menggunakan jala layanan yang memungkinkan komunikasi yang dikelola, dapat diamati, dan aman antara layanan individu. Catatan: Pelajari lebih lanjut tentang istirahat, graphql, grpc dan bagaimana mereka membandingkan satu sama lain.
Pesan real-time
Bagaimana kita secara efisien mengirim dan menerima pesan? Kami memiliki dua opsi berbeda: Tarik Model Klien dapat secara berkala mengirim permintaan HTTP ke server untuk memeriksa apakah ada pesan baru. Ini dapat dicapai melalui sesuatu seperti jajak pendapat yang panjang. Model Push Klien membuka koneksi berumur panjang dengan server dan setelah data baru tersedia, ia akan didorong ke klien. Kami dapat menggunakan WebSockets atau Events-Sent Events (SSE) untuk ini. Pendekatan Model Tarik tidak dapat diukur karena akan membuat overhead permintaan yang tidak perlu di server kami dan sebagian besar waktu responsnya akan kosong, sehingga membuang -buang sumber daya kami. Untuk meminimalkan latensi, menggunakan model push dengan websockets adalah pilihan yang lebih baik karena kami dapat mendorong data ke klien setelah tersedia tanpa penundaan mengingat koneksi terbuka dengan klien. Juga, websockets menyediakan komunikasi dupleks penuh, tidak seperti acara server-sent (SSE) yang hanya searah. Catatan: Pelajari lebih lanjut tentang pemungutan suara panjang, websockets, acara server-sent (SSE).
Terakhir terlihat
Untuk mengimplementasikan fungsionalitas yang terakhir terlihat, kita dapat menggunakan mekanisme detak jantung, di mana klien dapat secara berkala melakukan ping secara berkala server yang menunjukkan livesnya. Karena ini harus menjadi overhead serendah mungkin, kita dapat menyimpan cap waktu aktif terakhir dalam cache seperti berikut:
Kunci | Nilai |
---|---|
Pengguna a | 2022-07-01T14: 32: 50 |
Pengguna b | 2022-07-05T05: 10: 35 |
Pengguna c | 2022-07-10T04: 33: 25 |
Ini akan memberi kita terakhir kali pengguna aktif. Fungsionalitas ini akan ditangani oleh Layanan Kehadiran yang dikombinasikan dengan Redis atau memcached sebagai cache kami. Cara lain untuk mengimplementasikan ini adalah dengan melacak tindakan terbaru pengguna, setelah kegiatan terakhir melintasi ambang batas tertentu, seperti “Pengguna belum melakukan tindakan apa pun dalam 30 detik terakhir”, Kami dapat menunjukkan kepada pengguna sebagai offline dan terakhir terlihat dengan cap waktu yang direkam terakhir. Ini akan lebih merupakan pendekatan pembaruan yang malas dan mungkin bermanfaat bagi kita karena detak jantung dalam kasus -kasus tertentu.
Pemberitahuan
Setelah pesan dikirim dalam obrolan atau grup, pertama -tama kami akan memeriksa apakah penerima aktif atau tidak, kami bisa mendapatkan informasi ini dengan mengambil koneksi aktif pengguna dan terakhir dilihat menjadi pertimbangan. Jika penerima tidak aktif, layanan obrolan akan menambahkan acara ke antrian pesan dengan metadata tambahan seperti platform perangkat klien yang akan digunakan untuk merutekan pemberitahuan ke platform yang benar nanti. Layanan pemberitahuan kemudian akan mengkonsumsi acara dari antrian pesan dan meneruskan permintaan ke Firebase Cloud Messaging (FCM) atau Apple Push Notification Service (APNs) berdasarkan platform perangkat klien (Android, iOS, Web, dll). Kami juga dapat menambahkan dukungan untuk email dan SMS. Mengapa kami menggunakan antrian pesan? Karena sebagian besar antrian pesan memberikan pemesanan upaya terbaik yang memastikan bahwa pesan umumnya disampaikan dalam urutan yang sama seperti yang dikirim dan bahwa sebuah pesan dikirim setidaknya sekali yang merupakan bagian penting dari fungsionalitas layanan kami. Meskipun ini tampak seperti kasus penggunaan yang berlangganan publikasi klasik, sebenarnya tidak seperti perangkat seluler dan browser masing-masing memiliki cara mereka sendiri untuk menangani pemberitahuan push. Biasanya, pemberitahuan ditangani secara eksternal melalui Firebase Cloud Messaging (FCM) atau Apple Push Notification Service (APNs) tidak seperti Fan-Out Pesan yang biasa kita lihat di Layanan Backend. Kita dapat menggunakan sesuatu seperti Amazon SQS atau RabbitMQ untuk mendukung fungsi ini.
Baca tanda terima
Menangani tanda terima baca bisa rumit, untuk kasus penggunaan ini kita bisa menunggu semacam pengakuan (ACK) dari klien untuk menentukan apakah pesan tersebut dikirim dan memperbarui bidang pengiriman yang sesuai. Demikian pula, kami akan menandai pesan pesan yang terlihat begitu pengguna membuka obrolan dan memperbarui bidang timestamp SeePingat yang sesuai.
Desain
Sekarang kami telah mengidentifikasi beberapa komponen inti, mari kita lakukan draf pertama dari desain sistem kami.
Desain yang rinci
Saatnya membahas keputusan desain kami secara rinci.
Partisi Data
- Partisi berbasis hash
- Partisi berbasis daftar
- Partisi berbasis rentang
- Partisi Komposit
Pendekatan di atas masih dapat menyebabkan data yang tidak merata dan distribusi beban, kami dapat menyelesaikan ini menggunakan hashing yang konsisten.
Caching
Dalam aplikasi pesan, kami harus berhati -hati dalam menggunakan cache karena pengguna kami mengharapkan data terbaru, tetapi banyak pengguna akan meminta pesan yang sama, terutama dalam obrolan grup. Jadi, untuk mencegah lonjakan penggunaan dari sumber daya kami, kami dapat menyimpan pesan yang lebih lama.
Beberapa obrolan grup dapat memiliki ribuan pesan dan mengirimkan bahwa melalui jaringan akan benar -benar tidak efisien, untuk meningkatkan efisiensi kami dapat menambahkan pagination ke API sistem kami. Keputusan ini akan bermanfaat bagi pengguna dengan bandwidth jaringan terbatas karena mereka tidak perlu mengambil pesan lama kecuali diminta.
Kebijakan Penggusuran Cache mana yang akan digunakan?
Kita dapat menggunakan solusi seperti Redis atau memcached dan cache 20% dari lalu lintas harian tetapi jenis kebijakan penggusuran cache apa yang paling sesuai dengan kebutuhan kita?
Paling baru -baru ini digunakan (LRU) dapat menjadi kebijakan yang baik untuk sistem kami. Dalam kebijakan ini, kami membuang kunci yang paling baru digunakan baru -baru ini.
Cara menangani cache miss?
Setiap kali ada cache miss, server kami dapat menekan database secara langsung dan memperbarui cache dengan entri baru.
Untuk detail lebih lanjut, lihat caching.
Akses dan Penyimpanan Media
Seperti yang kami ketahui, sebagian besar ruang penyimpanan kami akan digunakan untuk menyimpan file media seperti gambar, video, atau file lainnya. Layanan media kami akan menangani akses dan penyimpanan file media pengguna.
Tapi di mana kita bisa menyimpan file dalam skala? Nah, penyimpanan objek adalah yang kami cari. Object Store memecah file data menjadi potongan -potongan yang disebut objek. Itu kemudian menyimpan objek -objek tersebut dalam satu repositori, yang dapat tersebar di beberapa sistem jaringan. Kami juga dapat menggunakan penyimpanan file terdistribusi seperti HDFS atau GLUSTERFS.
Fakta menyenangkan: whatsapp menghapus media di servernya setelah diunduh oleh pengguna.
Kami dapat menggunakan toko objek seperti Amazon S3, Azure Blob Storage, atau Google Cloud Storage untuk kasing ini.
Jaringan Pengiriman Konten (CDN)
Jaringan Pengiriman Konten (CDN) meningkatkan ketersediaan konten dan redundansi sambil mengurangi biaya bandwidth. Umumnya, file statis seperti gambar, dan video disajikan dari CDN. Kami dapat menggunakan layanan seperti Amazon Cloudfront atau Cloudflare CDN untuk kasus penggunaan ini.
API Gateway
Karena kami akan menggunakan beberapa protokol seperti HTTP, WebSocket, TCP/IP, menggunakan beberapa L4 (Lapisan Transport) atau L7 (Lapisan Aplikasi) Jenis penyeimbang beban secara terpisah untuk setiap protokol akan mahal akan mahal. Sebaliknya, kita dapat menggunakan gateway API yang mendukung banyak protokol tanpa masalah apa pun.
API Gateway juga dapat menawarkan fitur -fitur lain seperti otentikasi, otorisasi, pembatasan tingkat, pelambatan, dan versi API yang akan meningkatkan kualitas layanan kami.
Kami dapat menggunakan layanan seperti Amazon API Gateway atau Azure API Gateway untuk kasus penggunaan ini.
Mengidentifikasi dan menyelesaikan hambatan
Mari kita identifikasi dan selesaikan kemacetan seperti satu titik kegagalan dalam desain kami:
- “Bagaimana jika salah satu layanan kami macet?”
- “Bagaimana kami akan mendistribusikan lalu lintas kami di antara komponen kami?”
- “Bagaimana kita bisa mengurangi beban pada database kita?”
- “Cara meningkatkan ketersediaan cache kami?”
- “Bukan API Gateway menjadi satu titik kegagalan?”
- “Bagaimana kita bisa membuat sistem pemberitahuan kita lebih kuat?”
- “Bagaimana kita bisa mengurangi biaya penyimpanan media”?
- “Apakah layanan obrolan memiliki terlalu banyak tanggung jawab?”
Untuk membuat sistem kami lebih tangguh, kami dapat melakukan hal berikut:
- Menjalankan beberapa contoh dari masing -masing layanan kami.
- Memperkenalkan penyeimbang beban antara klien, server, database, dan server cache.
- Menggunakan beberapa replika baca untuk database kami.
- Beberapa contoh dan replika untuk cache terdistribusi kami.
- Kami dapat memiliki replika siaga dari API Gateway kami.
- Persis setelah pengiriman dan pemesanan pesan menantang dalam sistem terdistribusi, kami dapat menggunakan broker pesan khusus seperti Apache Kafka atau Nats untuk membuat sistem pemberitahuan kami lebih kuat.
- Kami dapat menambahkan kemampuan pemrosesan media dan kompresi ke layanan media untuk mengompres file besar yang mirip dengan whatsapp yang akan menghemat banyak ruang penyimpanan dan mengurangi biaya.
- Kami dapat membuat layanan grup yang terpisah dari layanan obrolan untuk memisahkan layanan kami lebih lanjut.
Artikel ini adalah bagian dari kursus desain sistem open source saya yang tersedia di GitHub.
Karanpratapsingh / System-Design
Pelajari cara merancang sistem dalam skala dan mempersiapkan wawancara desain sistem
Kursus Desain Sistem
Hei, selamat datang di kursus. Saya harap kursus ini memberikan pengalaman belajar yang hebat.
Kursus ini juga tersedia di situs web saya dan sebagai ebook di LeanPub. Silakan tinggalkan motivasi jika ini membantu!
Daftar isi
- Mulai
- Apa itu Desain Sistem?
- AKU P
- Model OSI
- TCP dan UDP
- Sistem Nama Domain (DNS)
- Penyeimbang beban
- Kekelompokan
- Caching
- Jaringan Pengiriman Konten (CDN)
- Proxy
- Ketersediaan
- Skalabilitas
- Penyimpanan
- Database dan DBMS
- Database SQL
- Database NoSQL
- Database SQL vs NoSQL
- Replikasi basis data
- Indeks
- Normalisasi dan Denormalisasi
- Model konsistensi asam dan basa
- Cap Theorem
- Teorema Pacelc
- Transaksi
- Transaksi terdistribusi
- Sharding
- Hashing yang konsisten
- Federasi Database
- Arsitektur N-tier
- Broker pesan
- Antrian pesan
- Publikasikan berlangganan
- Enterprise Service Bus (ESB)
- Monolit dan layanan mikro
- Arsitektur yang digerakkan oleh acara (EDA)
- Sumber Acara
- Segregasi Tanggung Jawab Perintah dan Permintaan (CQRS)
- API Gateway
- Istirahat, graphql, grpc
- Polling panjang, websockets, acara server-sent (SSE)