Pengaturcaraan WebSockets dan Sistem Masa Nyata · Pelajaran

Pengurusan Keadaan Teragih

Terokai penggunaan broker mesej luaran seperti Redis Pub/Sub dan Kafka untuk menyegerakkan keadaan merentas beberapa pelayan WebSocket.

Pelajaran 3 daripada 412 langkah

Pengurusan Keadaan Teragih ialah pelajaran Pengaturcaraan WebSockets dan Sistem Masa Nyata percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pengaturcaraan WebSockets dan Sistem Masa Nyata, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pengaturcaraan WebSockets dan Sistem Masa Nyata merangkumi sejumlah 4 pelajaran.

Cabaran Penskalaan: Keadaan Dikongsi

Anda telah mempelajari cara menskalakan aplikasi WebSocket dengan menjalankan beberapa tika pelayan di sebalik pengimbang beban. Namun, apakah yang berlaku apabila klien bersambung kepada Server A, dan klien lain yang bersambung kepada Server B perlu menghantar mesej kepada klien pertama?

Inilah cabaran pengurusan keadaan teragih: bagaimana pelayan-pelayan anda berkongsi maklumat dan menyelaras tindakan?

Mengapa Memusatkan Keadaan?

Bayangkan aplikasi sembang. Jika Klien 1 berada pada Server A dan Klien 2 berada pada Server B, lalu Klien 1 menghantar mesej, bagaimanakah Server A memberitahu Server B untuk menyampaikannya kepada Klien 2?

Tanpa cara untuk pelayan berkomunikasi, mesej atau kemas kini mungkin hanya sampai kepada klien yang bersambung kepada pelayan yang sama, sekali gus menjejaskan pengalaman masa nyata.

Memperkenalkan Perantara Mesej

Untuk menyelesaikan masalah ini, kita menggunakan perantara mesej. Anggaplah ia sebagai pejabat pos pusat untuk pelayan-pelayan anda.

  • Pelayan menghantar mesej kepada perantara.
  • Pelayan lain kemudiannya boleh menerima mesej daripada perantara.

Hal ini membolehkan semua pelayan WebSocket anda berkomunikasi secara tidak langsung tanpa perlu mengetahui kewujudan satu sama lain.

Corak Pub/Sub

Banyak perantara mesej menggunakan corak Penerbit-Pelanggan (Pub/Sub). Beginilah caranya:

  • Penerbit menghantar mesej kepada saluran atau topik tertentu.
  • Pelanggan menyatakan minat terhadap satu atau lebih saluran dan menerima semua mesej yang diterbitkan kepadanya.

Corak ini sesuai untuk menyiarkan data merentasi beberapa tika pelayan.

Contoh Pub/Sub Redis

Redis ialah stor data dalam memori sumber terbuka yang popular dan sering digunakan sebagai perantara mesej. Ciri Pub/Sub Redis pantas serta mudah digunakan.

Anda boleh mempunyai beberapa pelayan WebSocket Node.js yang semuanya bersambung kepada satu tika Redis dan menggunakannya untuk bertukar-tukar mesej.

Asas Pub/Sub Redis

Katakan anda mempunyai dua pelayan WebSocket, Server A dan Server B, yang kedua-duanya bersambung kepada Redis.

  • Apabila Server A menerima mesej yang perlu dikongsikan, pelayan itu menerbitkan mesej tersebut kepada saluran Redis (contohnya, 'global_chat').
  • Server B telah melanggan 'global_chat', jadi pelayan itu menerima mesej tersebut daripada Redis serta-merta.

Kemudian, Server B boleh memajukan mesej itu kepada kliennya sendiri yang bersambung.

Pelayan Menerbitkan kepada Redis

Berikut ialah contoh Node.js yang dipermudah untuk pelayan WebSocket yang menerbitkan mesej kepada saluran Redis. Kita akan menggunakan pustaka ws untuk WebSockets dan ioredis untuk Redis.

Pastikan Redis sedang berjalan dan ws serta ioredis telah dipasang (`npm i ws ioredis`).

const WebSocket = require('ws');
const Redis = require('ioredis');

const wss = new WebSocket.Server({ port: 8080 });
const publisher = new Redis(); // Connects to localhost:6379

wss.on('connection', ws => {
  console.log('Client connected to Server 1');

  ws.on('message', message => {
    const msg = message.toString();
    console.log(`Server 1 received: ${msg}`);
    // Publish message to 'chat_messages' channel
    publisher.publish('chat_messages', msg);
    ws.send(`You said: ${msg}`); // Echo back to sender
  });
});

console.log('Server 1 listening on ws://localhost:8080');

Pelayan Melanggan & Menyampaikan

Sekarang, berikut ialah satu lagi pelayan WebSocket Node.js (yang berjalan pada port berbeza) yang melanggan saluran Redis yang sama. Apabila menerima mesej daripada Redis, pelayan itu menyiarkannya kepada kliennya sendiri yang bersambung.

Anda akan menjalankannya dalam terminal berasingan daripada server1.js.

const WebSocket = require('ws');
const Redis = require('ioredis');

const wss = new WebSocket.Server({ port: 8081 });
const subscriber = new Redis(); // Connects to localhost:6379

// Subscribe to the 'chat_messages' channel
subscriber.subscribe('chat_messages', (err, count) => {
  if (err) console.error('Failed to subscribe:', err.message);
  else console.log(`Subscribed to ${count} channel(s)`);
});

// Handle messages received from Redis
subscriber.on('message', (channel, message) => {
  console.log(`Server 2 received from Redis [${channel}]: ${message}`);
  // Broadcast to all connected clients on Server 2
  wss.clients.forEach(client => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(`Global Chat: ${message}`);
    }
  });
});

wss.on('connection', ws => {
  console.log('Client connected to Server 2');
  ws.send('Welcome to Server 2!');
});

console.log('Server 2 listening on ws://localhost:8081');

Manfaat untuk Penskalaan

Menggunakan perantara mesej seperti Pub/Sub Redis memberikan kelebihan besar untuk menskalakan aplikasi WebSocket:

  • Pemisahan: Pelayan tidak perlu mengetahui secara langsung tentang satu sama lain. Pelayan hanya berinteraksi dengan perantara.
  • Kebolehskalaan Mendatar: Anda boleh menambah lebih banyak pelayan WebSocket dengan mudah apabila trafik meningkat, dan semuanya akan bersambung kepada perantara yang sama.
  • Siaran Global: Mesej boleh disiarkan dengan cekap kepada semua klien tanpa mengira pelayan yang menjadi tempat sambungan mereka.

Melangkaui Siaran: Kehadiran

Perantara mesej bukan hanya untuk menyiarkan mesej sembang. Perantara ini penting untuk menyegerakkan jenis keadaan teragih yang lain, seperti kehadiran pengguna.

Contohnya, apabila pengguna log masuk, pelayan yang disambunginya boleh menerbitkan status 'dalam talian' kepada saluran Redis. Pelayan lain melanggan saluran ini untuk memastikan senarai pengguna dalam talian mereka sentiasa dikemas kini.

Semakan Perantara Mesej

Bayangkan senario yang mempunyai beberapa pelayan WebSocket, dan mesej yang dihantar kepada satu pelayan perlu sampai kepada klien yang bersambung kepada pelayan lain. Corak manakah yang paling sesuai untuk menangani perkara ini?

Ulang Kaji: Keadaan Teragih

Kita telah mempelajari bahawa penskalaan aplikasi WebSocket memerlukan pengurusan keadaan teragih. Pembroker mesej seperti Redis, yang menggunakan corak Pub/Sub, amat penting untuk membolehkan beberapa pelayan WebSocket berkomunikasi dan menyegerakkan data, sekali gus memastikan semua klien menerima kemas kini yang berkaitan tanpa mengira pelayan yang disambungkan kepada mereka.

Hal ini menjadikan aplikasi anda lebih berdaya tahan dan mudah diskalakan apabila anda menambah lebih banyak tika pelayan.

Percuma untuk bermula

Pelajari Pengaturcaraan WebSockets dan Sistem Masa Nyata dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
47

Soalan Lazim

Adakah pelajaran “Pengurusan Keadaan Teragih” percuma?

Ya — teks penuh “Pengurusan Keadaan Teragih” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pengaturcaraan WebSockets dan Sistem Masa Nyata, tingkat taraf kepada CoddyKit PRO. Kursus Pengaturcaraan WebSockets dan Sistem Masa Nyata merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pengurusan Keadaan Teragih”?

Terokai penggunaan broker mesej luaran seperti Redis Pub/Sub dan Kafka untuk menyegerakkan keadaan merentas beberapa pelayan WebSocket. Anda berlatih Pengaturcaraan WebSockets dan Sistem Masa Nyata menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Pengaturcaraan WebSockets dan Sistem Masa Nyata?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Pengaturcaraan WebSockets dan Sistem Masa Nyata di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Pengurusan Keadaan Teragih” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pengaturcaraan WebSockets dan Sistem Masa Nyata ini?

Ya. Setiap pelajaran Pengaturcaraan WebSockets dan Sistem Masa Nyata menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Strategi Penskalaan Mendatar
  2. Pengimbangan Beban WebSockets
  3. Pengurusan Keadaan Teragih
  4. Backplane Pub/Sub dengan Redis
← Kembali ke Pengaturcaraan WebSockets dan Sistem Masa Nyata