Mengelakkan Interleaving dalam Panggilan async_write
Dalam seni bina pelayan pelanggan, mengekalkan susunan panggilan async_write adalah penting untuk memastikan integriti data. Isu ini timbul apabila berbilang pelanggan menghantar mesej dengan pantas, menyebabkan operasi async_write seterusnya berjalin.
Penyelesaian: Beratur untuk Setiap Pelanggan
Untuk menyelesaikan masalah ini, disyorkan untuk menggunakan barisan keluar untuk setiap pelanggan. Barisan gilir berfungsi sebagai penimbal untuk mesej, memastikan ia diproses dan dihantar dalam urutan yang betul.
Cara Ia Berfungsi
Kod Contoh
Kod berikut menunjukkan pelaksanaan pelayan dengan baris gilir keluar:
class Connection { public: // ... void write(const std::string& message) { _strand.post([this, message] { writeImpl(message); }); } private: void writeImpl(const std::string& message) { _outbox.push(message); if (_outbox.size() > 1) return; write(); } void write() { const std::string& message = _outbox.front(); async_write(_socket, buffer(message), _strand.wrap( [this, err, bytesTransferred] { writeHandler(err, bytesTransferred); })); } void writeHandler(const std::error_code& error, size_t bytesTransferred) { _outbox.pop_front(); handle error or send next message if the queue is not empty. } private: boost::asio::strand _strand; std::deque<std::string> _outbox; };
Mata Utama
Dengan menggunakan ini langkah-langkah, pelayan secara berkesan mengelakkan interleaving panggilan async_write, memastikan susunan mesej yang betul untuk setiap pelanggan.
Atas ialah kandungan terperinci Bagaimana untuk Mencegah Interleaving dalam Operasi Tulis Asynchronous dalam Seni Bina Pelayan Pelanggan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!