د GET غوښتنې سمبالونکي ته ځي RandomRouteکوم چې په تصادفي ډول د سري شیانو تر مینځ پول یا لاره غوره کوي children. د دې صف هر عنصر په بدل کې یو سمبالونکی دی MissFailoverRoute، کوم چې به په حوض کې د هر سرور له لارې تیریږي تر هغه چې دا د معلوماتو سره ځواب ترلاسه کړي ، کوم چې پیرودونکي ته به بیرته راستون شي.
که موږ په ځانګړې توګه کارول MissFailoverRoute د دریو سرورونو د حوض سره، بیا ټولې غوښتنې به لومړی د میم کیچ شوي مثال ته راشي، او پاتې به د پاتې کیدو په اساس غوښتنې ترلاسه کړي کله چې هیڅ معلومات شتون نلري. دا ډول چلند به لامل شي په لیست کې په لومړي سرور کې ډیر بار، نو دا پریکړه وشوه چې درې حوضونه په مختلف ترتیبونو کې د ادرسونو سره رامینځته کړئ او په تصادفي ډول یې غوره کړئ.
نورې ټولې غوښتنې (او دا یو ریکارډ دی) په کارولو سره پروسس کیږي AllMajorityRoute. دا سمبالونکی په حوض کې ټولو سرورونو ته غوښتنې لیږي او لږترلږه د N/2 + 1 څخه ځوابونو ته انتظار کوي. د کارولو څخه AllSyncRoute د لیکلو عملیات باید پریښودل شي، ځکه چې دا طریقه مثبت ځواب ته اړتیا لري всех په ګروپ کې سرورونه - که نه نو دا به بیرته راشي SERVER_ERROR. که څه هم مایکروټر به موجود کیچونو کې ډاټا اضافه کړي ، د PHP فعالیت زنګ وهي یوه تېروتنه به راګرځوي او خبرتیا به پیدا کړي. AllMajorityRoute دومره سخت نه دی او اجازه ورکوي تر نیمایي پورې واحدونه پرته له دې چې پورته بیان شوي ستونزې له خدمت څخه لرې شي.
اصلي زیان دا سکیم دا دی چې که چیرې واقعیا په زیرمه کې هیڅ معلومات شتون نلري ، نو د پیرودونکي څخه د هرې غوښتنې لپاره N میم کیچ ته غوښتنې به واقعیا اجرا شي - ته ټول ته په حوض کې سرورونه. موږ کولی شو په حوضونو کې د سرورونو شمیر کم کړو، د بیلګې په توګه، دوه ته: د ذخیره کولو اعتبار قرباني کول، موږ ترلاسه کووоلوړ سرعت او لږ بار له غوښتنو څخه ورک شوي کیلي ته.
# php -a
Interactive mode enabled
php > # Проверяем запись и чтение
php > $m = new Memcached();
php > $m->addServer('mcrouter', 11211);
php > var_dump($m->set('test', 'value'));
bool(true)
php > var_dump($m->get('test'));
string(5) "value"
php > # Работает! Тестируем работу сессий:
php > ini_set('session.save_handler', 'memcached');
php > ini_set('session.save_path', 'mcrouter:11211');
php > var_dump(session_start());
PHP Warning: Uncaught Error: Failed to create session ID: memcached (path: mcrouter:11211) in php shell code:1
Stack trace:
#0 php shell code(1): session_start()
#1 {main}
thrown in php shell code on line 1
php > # Не заводится… Попробуем задать session_id:
php > session_id("zzz");
php > var_dump(session_start());
PHP Warning: session_start(): Cannot send session cookie - headers already sent by (output started at php shell code:1) in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Unable to clear session lock record in php shell code on line 1
PHP Warning: session_start(): Failed to read session data: memcached (path: mcrouter:11211) in php shell code on line 1
bool(false)
php >
د خطا د متن لټون کومه پایله نه ده ورکړې، مګر د پوښتنې لپاره "مایکروټر پی ایچ پی"په سر کې د پروژې ترټولو پخوانۍ نا حل شوې ستونزه وه - د ملاتړ نشتوالی memcached بائنری پروتوکول.
NB: په memcached کې د ASCII پروتوکول د بائنری په پرتله ورو دی، او د دوامداره کیلي هش کولو معیاري وسیله یوازې د بائنری پروتوکول سره کار کوي. مګر دا د یوې ځانګړې قضیې لپاره ستونزې نه رامینځته کوي.
چال په کڅوړه کې دی: ټول هغه څه چې تاسو یې باید وکړئ د ASCII پروتوکول ته لاړشئ او هرڅه به کار وکړي .... په هرصورت، پدې حالت کې، د ځوابونو په لټه کې عادت په php.net کې اسناد یوه ظالمانه ټوکه وکړه. تاسو به هلته سم ځواب ونه مومئ ... پرته لدې چې ، البته ، تاسو پای ته سکرول کړئ ، چیرې چې برخه کې وي "د کارونکي مرسته شوي یادښتونه" وفادار به وي په غیر عادلانه ډول رد شوی ځواب.
هو، د سم انتخاب نوم دی memcached.sess_binary_protocol. دا باید غیر فعال وي، وروسته لدې چې ناستې به کار پیل کړي. ټول هغه څه چې پاتې دي د مایکروټر سره کانټینر د PHP سره پوډ ته واچوئ!
پایلې
په دې توګه، یوازې د زیربنایي بدلونونو سره موږ د دې توان درلود چې ستونزه حل کړو: د memcached غلطی زغم مسله حل شوې، او د کیچ ذخیره کولو اعتبار ډیر شوی. د غوښتنلیک لپاره د څرګندو ګټو سربیره، دا په پلیټ فارم کې د کار کولو په وخت کې د چلولو لپاره ځای ورکړ: کله چې ټولې برخې ریزرو ولري، د مدیر ژوند خورا ساده دی. هو، دا طریقه هم خپل نیمګړتیاوې لري، دا ممکن د "کرچ" په څیر ښکاري، مګر که دا پیسې خوندي کړي، ستونزه له منځه یوسي او د نوي لامل نه شي - ولې نه؟