{"id":108485,"date":"2025-05-11T06:46:16","date_gmt":"2025-05-11T03:16:16","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/"},"modified":"2025-05-11T06:46:16","modified_gmt":"2025-05-11T03:16:16","slug":"javaraft-raft-based-distributed-key-value-store-5h0a","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/","title":{"rendered":"Javaraft: \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u0627\u0631\u0632\u0634 \u06a9\u0644\u06cc\u062f\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0642\u0627\u06cc\u0642"},"content":{"rendered":"<div data-article-id=\"2393497\" id=\"article-body\">\n<p>\u062f\u0631 \u062d\u06cc\u0646 \u062a\u062d\u0635\u06cc\u0644 \u062f\u0631 \u0645\u0635\u0627\u062d\u0628\u0647 \u0647\u0627\u06cc \u0637\u0631\u0627\u062d\u06cc \u0633\u06cc\u0633\u062a\u0645 \u060c \u062f\u0627\u0646\u0634 \u0627\u0633\u0627\u0633\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0645 \u0648 \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0647\u0627\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0639\u0644\u0627\u0642\u0647 \u0645\u0646\u062f \u0634\u062f\u0645. \u0628\u0639\u062f \u0627\u0632 \u0628\u0631\u062e\u06cc \u0645\u0637\u0627\u0644\u0639\u0627\u062a \u060c \u0645\u0646 \u0647\u0646\u0648\u0632 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0631\u0627 \u06a9\u0645\u06cc \u0627\u0646\u062a\u0632\u0627\u0639\u06cc \u0648 \u062f\u0633\u062a \u0648 \u0645\u0648\u062c \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0645. \u0628\u0631\u0627\u06cc \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u062a\u062c\u0631\u0628\u0647 \u062f\u0633\u062a\u06cc \u060c \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u06cc\u06a9 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u0627\u0631\u0632\u0634 \u06a9\u0644\u06cc\u062f\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u0627\u062c\u0645\u0627\u0639 \u0642\u0627\u06cc\u0642 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0628\u0633\u0627\u0632\u0645.<\/p>\n<p>\u0686\u0646\u062f \u0647\u0641\u062a\u0647 \u0637\u0648\u0644 \u06a9\u0634\u06cc\u062f \u062a\u0627 \u0645\u0642\u0627\u0644\u0647 \u0642\u0627\u06cc\u0642 \u0631\u0627 \u0628\u0647 \u0637\u0648\u0631 \u06a9\u0627\u0645\u0644 \u062f\u0631\u06a9 \u06a9\u0646\u0645 \u0648 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u0627\u0635\u0644\u06cc \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0645. \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a \u060c \u0645\u0646 \u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u062f\u0631 \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0628\u0631\u062e\u06cc \u0627\u0632 \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u0627\u0631\u0632\u0634 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0628\u0627 \u0627\u0631\u0632\u0634 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0642\u0627\u06cc\u0642 \u060c \u0645\u062c\u062f\u062f\u0627\u064b \u062a\u0623\u06a9\u06cc\u062f \u06a9\u0646\u0645.<\/p>\n<div class=\"ltag-github-readme-tag\">\n<div class=\"readme-overview\">\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%DB%8C%DA%A9_%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87_%D8%A8%D8%A7_%D8%A7%D8%B1%D8%B2%D8%B4_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C_%D8%AA%D9%88%D8%B2%DB%8C%D8%B9_%D8%B4%D8%AF%D9%87_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85_%D8%A7%D8%AC%D9%85%D8%A7%D8%B9_%D9%82%D8%A7%DB%8C%D9%82_%D9%88_%D9%85%D9%88%D8%AA%D9%88%D8%B1_%D8%B0%D8%AE%DB%8C%D8%B1%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_LSM_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C\" >\u06cc\u06a9 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u0628\u0627 \u0627\u0631\u0632\u0634 \u06a9\u0644\u06cc\u062f\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u0627\u062c\u0645\u0627\u0639 \u0642\u0627\u06cc\u0642 \u0648 \u0645\u0648\u062a\u0648\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc LSM \u0633\u0641\u0627\u0631\u0634\u06cc<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D9%85%D9%82%D8%AF%D9%85%D9%87\" >\u0645\u0642\u062f\u0645\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D9%88%DB%8C%DA%98%DA%AF%DB%8C\" >\u0648\u06cc\u0698\u06af\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87\" >\u0627\u0633\u062a\u0641\u0627\u062f\u0647<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84_1\" >\u062a\u0631\u0645\u06cc\u0646\u0627\u0644 1<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84_2\" >\u062a\u0631\u0645\u06cc\u0646\u0627\u0644 2<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84_3\" >\u062a\u0631\u0645\u06cc\u0646\u0627\u0644 3<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D9%86%D9%82%D8%A7%D8%B7_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C\" >\u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA_%D8%B9%D9%85%D9%84\" >\u062f\u0631\u06cc\u0627\u0641\u062a \u0639\u0645\u0644:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8%D8%A7%D8%AA_%D8%B1%D9%87%D8%A8%D8%B1_55_%D9%BE%D9%88%D9%86%D8%AF\" >\u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0631\u0647\u0628\u0631 (5\/5 \u067e\u0648\u0646\u062f):<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%AA%DA%A9%D8%AB%DB%8C%D8%B1_%D9%88%D8%B1%D9%88%D8%AF_%D8%A8%D9%87_%D8%B3%DB%8C%D8%B3%D8%AA%D9%85_55\" >\u062a\u06a9\u062b\u06cc\u0631 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 (5\/5)):<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%A7%D8%B7%D9%85%DB%8C%D9%86%D8%A7%D9%86_%D8%A7%D8%B2_%D9%85%D8%B9%D9%86%D8%A7%D8%B4%D9%86%D8%A7%D8%B3%DB%8C_%D9%82%D8%A7%D8%A8%D9%84_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87\" >\u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0645\u0639\u0646\u0627\u0634\u0646\u0627\u0633\u06cc \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%A7%D8%B7%D9%85%DB%8C%D9%86%D8%A7%D9%86_%D8%A7%D8%B2_%D9%85%D8%B9%D9%86%D8%A7%D8%B4%D9%86%D8%A7%D8%B3%DB%8C_%D9%82%D8%A7%D8%A8%D9%84_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_2\" >\u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0645\u0639\u0646\u0627\u0634\u0646\u0627\u0633\u06cc \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 2<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/javaraft-raft-based-distributed-key-value-store-5h0a\/#%D8%AA%D8%AF%D8%A7%D9%88%D9%85\" >\u062a\u062f\u0627\u0648\u0645<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%DB%8C%DA%A9_%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87_%D8%A8%D8%A7_%D8%A7%D8%B1%D8%B2%D8%B4_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C_%D8%AA%D9%88%D8%B2%DB%8C%D8%B9_%D8%B4%D8%AF%D9%87_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85_%D8%A7%D8%AC%D9%85%D8%A7%D8%B9_%D9%82%D8%A7%DB%8C%D9%82_%D9%88_%D9%85%D9%88%D8%AA%D9%88%D8%B1_%D8%B0%D8%AE%DB%8C%D8%B1%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_LSM_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C\"><\/span>\n<p>      \u06cc\u06a9 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u0628\u0627 \u0627\u0631\u0632\u0634 \u06a9\u0644\u06cc\u062f\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u0627\u062c\u0645\u0627\u0639 \u0642\u0627\u06cc\u0642 \u0648 \u0645\u0648\u062a\u0648\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc LSM \u0633\u0641\u0627\u0631\u0634\u06cc<br \/>\n    <span class=\"ez-toc-section-end\"><\/span><\/h3>\n<\/p><\/div>\n<div class=\"ltag-github-body\">\n<div id=\"readme\" class=\"md\" data-path=\"README.md\">\n<article class=\"markdown-body entry-content container-lg\" itemprop=\"text\">\n<p><h2 class=\"heading-element\" dir=\"auto\"><span class=\"ez-toc-section\" id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\"><\/span>\u0645\u0642\u062f\u0645\u0647<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<\/p>\n<p dir=\"auto\">\u0641\u06cc\u0644\u0645 \u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc.<\/p>\n<p dir=\"auto\">\u0627\u06cc\u0646 \u067e\u0633\u062a \u0648\u0628\u0644\u0627\u06af \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u062f \u0642\u062f\u0645 \u0645\u06cc \u0632\u0646\u062f.<\/p>\n<p dir=\"auto\">\u0627\u06cc\u0646 \u06cc\u06a9 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u0628\u0627 \u0627\u0631\u0632\u0634 \u06a9\u0644\u06cc\u062f\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u0627\u062c\u0645\u0627\u0639 RAFT \u0648 \u0645\u0648\u062a\u0648\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc LSM \u0633\u0641\u0627\u0631\u0634\u06cc \u0627\u062c\u0631\u0627 \u0634\u062f\u0647 \u0627\u0633\u062a \u060c \u06cc\u06a9 \u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0628\u0627 \u0627\u0631\u0632\u0634 \u06a9\u0644\u06cc\u062f \u0633\u0627\u062f\u0647 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0628\u0647 \u06af\u0648\u0646\u0647 \u0627\u06cc \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u062a\u062d\u0645\u0644 \u06af\u0633\u0644 \u0628\u0627\u0634\u062f (\u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0627\u06a9\u062b\u0631 \u06af\u0631\u0647 \u0647\u0627 \u0632\u0646\u062f\u0647 \u0647\u0633\u062a\u0646\u062f) \u0648 \u0642\u0627\u0628\u0644 \u062e\u0637\u0648\u0646\u062f \u0627\u0633\u062a. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u062f\u0631 \u062c\u0627\u0648\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Boot Spring \u0628\u0627 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc Lombok \u0648 SLF4J \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p><h2 class=\"heading-element\" dir=\"auto\"><span class=\"ez-toc-section\" id=\"%D9%88%DB%8C%DA%98%DA%AF%DB%8C\"><\/span>\u0648\u06cc\u0698\u06af\u06cc<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<\/p>\n<ul dir=\"auto\">\n<li>\u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0631\u0647\u0628\u0631 (5.2 \u067e\u0648\u0646\u062f)<\/li>\n<li>\u062a\u06a9\u062b\u06cc\u0631 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 (5.3 \u067e\u0648\u0646\u062f)<\/li>\n<li>\u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a (45.4.1)<\/li>\n<li>\u0627\u0631\u062a\u06a9\u0627\u0628 \u0645\u062f\u062e\u0644 \u0627\u0632 \u0634\u0631\u0627\u06cc\u0637 \u0642\u0628\u0644\u06cc (45.4 \u00a7)<\/li>\n<li>\u062a\u0635\u0627\u062f\u0641\u0627\u062a \u067e\u06cc\u0631\u0648 \u0648 \u0646\u0627\u0645\u0632\u062f (5\/5 \u067e\u0648\u0646\u062f)<\/li>\n<li>\u0627\u062c\u0631\u0627\u06cc \u0645\u0639\u0627\u0646\u06cc \u0642\u0627\u0628\u0644 \u062a\u063a\u06cc\u06cc\u0631 (8)<\/li>\n<\/ul>\n<p><h2 class=\"heading-element\" dir=\"auto\"><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87\"><\/span>\u0627\u0633\u062a\u0641\u0627\u062f\u0647<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<\/p>\n<p dir=\"auto\">API \u0627\u0631\u0632\u0634 \u06a9\u0644\u06cc\u062f \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u062f.<\/p>\n<p dir=\"auto\">\u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06af\u0631\u0647 \u0647\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0631\u062f\u0647 \u0648 \u0634\u06cc\u0634\u0647 \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f (\u062a\u0633\u062a \u0647\u0627\u06cc \u067e\u0631\u0634):<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"mvn clean package -DskipTests\">\n<pre class=\"notranslate\"><code>mvn clean package -DskipTests\n<\/code><\/pre>\n<\/div>\n<p><h3 class=\"heading-element\" dir=\"auto\"><span class=\"ez-toc-section\" id=\"%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84_1\"><\/span>\u062a\u0631\u0645\u06cc\u0646\u0627\u0644 1<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"java -jar target\/distributed_key_value_store-0.0.1-SNAPSHOT.jar --spring.profiles.active=node1\">\n<pre class=\"notranslate\"><code>java -jar target\/distributed_key_value_store-0.0.1-SNAPSHOT.jar --spring.profiles.active=node1\n<\/code><\/pre>\n<\/div>\n<p><h3 class=\"heading-element\" dir=\"auto\"><span class=\"ez-toc-section\" id=\"%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84_2\"><\/span>\u062a\u0631\u0645\u06cc\u0646\u0627\u0644 2<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"java -jar target\/distributed_key_value_store-0.0.1-SNAPSHOT.jar --spring.profiles.active=node2\">\n<pre class=\"notranslate\"><code>java -jar target\/distributed_key_value_store-0.0.1-SNAPSHOT.jar --spring.profiles.active=node2\n<\/code><\/pre>\n<\/div>\n<p><h3 class=\"heading-element\" dir=\"auto\"><span class=\"ez-toc-section\" id=\"%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84_3\"><\/span>\u062a\u0631\u0645\u06cc\u0646\u0627\u0644 3<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"java -jar target\/distributed_key_value_store-0.0.1-SNAPSHOT.jar --spring.profiles.active=node3\">\n<pre class=\"notranslate\"><code>java -jar target\/distributed_key_value_store-0.0.1-SNAPSHOT.jar --spring.profiles.active=node3\n<\/code><\/pre>\n<\/div>\n<p><h2 class=\"heading-element\" dir=\"auto\"><span class=\"ez-toc-section\" id=\"%D9%86%D9%82%D8%A7%D8%B7_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C\"><\/span>\u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<\/p>\n<p dir=\"auto\">\u06a9\u0644\u06cc\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u0628\u0627\u06cc\u062f \u0628\u0647 \u06af\u0631\u0647 \u0631\u0647\u0628\u0631 \u0627\u0631\u0633\u0627\u0644 \u0634\u0648\u062f. \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631 \u0627\u062c\u0631\u0627 \u0646\u0645\u06cc \u0634\u0648\u062f \u060c \u0648 \u062e\u0648\u0627\u0646\u062f\u0646\/\u0646\u0648\u0634\u062a\u0646 \u067e\u06cc\u0631\u0648\u0627\u0646 \u0645\u0633\u062f\u0648\u062f \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p><h3 class=\"heading-element\" dir=\"auto\"><span class=\"ez-toc-section\" id=\"%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA_%D8%B9%D9%85%D9%84\"><\/span>\u062f\u0631\u06cc\u0627\u0641\u062a \u0639\u0645\u0644:<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u2026<\/p>\n<\/article>\n<\/div><\/div>\n<\/div>\n<p>\u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0627\u062c\u0631\u0627\u06cc \u0645\u0646 \u0628\u0647 \u062f\u0648\u0631 \u0627\u0632 \u062a\u0648\u0644\u06cc\u062f \u0622\u0645\u0627\u062f\u0647 \u0627\u0633\u062a \u060c \u0647\u062f\u0641 \u0645\u0646 \u0633\u0627\u062e\u062a\u0646 \u0633\u06cc\u0633\u062a\u0645\u06cc \u0628\u0648\u062f \u06a9\u0647 \u062f\u0631 \u0634\u0631\u0627\u06cc\u0637 \u0627\u0633\u0627\u0633\u06cc \u06a9\u0627\u0631 \u06a9\u0646\u062f \u0648 \u0627\u06cc\u062f\u0647 \u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u0631\u0627 \u0646\u0634\u0627\u0646 \u062f\u0647\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0645\u0631\u06a9\u0632 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u060c \u0645\u0646 \u0628\u0647 \u06a9\u062f \u062e\u0637 \u0628\u0647 \u062e\u0637 \u06cc\u0627 \u062a\u0639\u0627\u0645\u0644 \u0631\u06cc\u0632 \u062f\u0627\u0646\u0647 \u0628\u06cc\u0646 \u0627\u062c\u0632\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0646\u0645\u06cc \u0631\u0648\u0645. \u062f\u0631\u0639\u0648\u0636 \u060c \u0645\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0645\u0631\u0648\u0631 \u06a9\u0644\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0627\u062c\u0631\u0627\u06cc \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 Raft Core \u060c \u0642\u062f\u0645 \u0645\u06cc \u0632\u0646\u0645.<\/p>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8%D8%A7%D8%AA_%D8%B1%D9%87%D8%A8%D8%B1_55_%D9%BE%D9%88%D9%86%D8%AF\"><\/span>\n<p>  \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0631\u0647\u0628\u0631 (5\/5 \u067e\u0648\u0646\u062f):<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0645\u0627\u0698\u0648\u0644 \u06a9\u0647 \u0645\u0646 \u062a\u0648\u0633\u0639\u0647 \u062f\u0627\u062f\u0645 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0631\u0647\u0628\u0631 \u0627\u0633\u062a. \u062f\u0631 \u0642\u0627\u06cc\u0642 \u060c \u0647\u0645\u0647 \u06af\u0631\u0647 \u0647\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u067e\u06cc\u0631\u0648\u0627\u0646 \u0634\u0631\u0648\u0639 \u0645\u06cc \u0634\u0648\u0646\u062f \u0648 \u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062a\u0627\u06cc\u0645\u0631 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u067e\u06cc\u0631\u0648\u0627\u0646 \u0645\u0646\u0642\u0636\u06cc \u0645\u06cc \u0634\u0648\u062f \u060c \u06cc\u06a9 \u0631\u0647\u0628\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0627\u0645\u0631 \u060c \u0645\u0646 \u06cc\u06a9 \u062a\u0627\u06cc\u0645\u0631 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a\u06cc \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f\u0645 \u06a9\u0647 \u067e\u0633 \u0627\u0632 \u0627\u0646\u0642\u0636\u0627 \u060c \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0631\u0627 \u0622\u063a\u0627\u0632 \u0645\u06cc \u06a9\u0646\u062f. \u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u06af\u0631\u0647 \u062d\u0627\u0644\u062a \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u067e\u06cc\u0631\u0648\u0627\u0646 \u0645\u0646\u062a\u0642\u0644 \u0645\u06cc \u06a9\u0646\u062f \u060c \u0646\u0627\u0645\u06cc\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"c1\">\/\/ If election timeout elapses without receiving AppendEntries RPC from current leader or granting vote to candidate:<\/span>\n<span class=\"c1\">\/\/ convert to candidate (\u00a75.2)<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">reset<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n    <span class=\"n\">cancel<\/span><span class=\"o\">();<\/span>\n\n    <span class=\"kt\">long<\/span> <span class=\"n\">minTimeout<\/span> <span class=\"o\">=<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">getElectionTimeoutMillisMin<\/span><span class=\"o\">();<\/span>\n    <span class=\"kt\">long<\/span> <span class=\"n\">maxTimeout<\/span> <span class=\"o\">=<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">getElectionTimeoutMillisMax<\/span><span class=\"o\">();<\/span>\n    <span class=\"kt\">long<\/span> <span class=\"n\">timeout<\/span> <span class=\"o\">=<\/span> <span class=\"n\">minTimeout<\/span> <span class=\"o\">+<\/span> <span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"na\">nextInt<\/span><span class=\"o\">((<\/span><span class=\"kt\">int<\/span><span class=\"o\">)(<\/span><span class=\"n\">maxTimeout<\/span> <span class=\"o\">-<\/span> <span class=\"n\">minTimeout<\/span><span class=\"o\">));<\/span>\n\n    <span class=\"n\">electionFuture<\/span> <span class=\"o\">=<\/span> <span class=\"n\">scheduler<\/span><span class=\"o\">.<\/span><span class=\"na\">schedule<\/span><span class=\"o\">(()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">electionManager<\/span><span class=\"o\">.<\/span><span class=\"na\">startElection<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">},<\/span> <span class=\"n\">timeout<\/span><span class=\"o\">,<\/span> <span class=\"nc\">TimeUnit<\/span><span class=\"o\">.<\/span><span class=\"na\">MILLISECONDS<\/span><span class=\"o\">);<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06a9\u0644\u0627\u0633 ElectionManager \u0634\u0627\u0645\u0644 \u062f\u0648 \u0631\u0648\u0634 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a: StartElection () \u0648 HandleVoterEquest (). \u0631\u0648\u0634 startelection () \u0628\u0631 \u0627\u0633\u0627\u0633 \u062a\u0639\u062f\u0627\u062f \u0647\u0645\u0633\u0627\u0644\u0627\u0646 \u060c \u0645\u0648\u0636\u0648\u0639\u0627\u062a \u0631\u0627 \u0627\u0632 \u0627\u0633\u062a\u062e\u0631 \u0627\u062e\u062a\u0635\u0627\u0635 \u0645\u06cc \u062f\u0647\u062f \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0622\u0631\u0627\u0621 \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \/\u062f\u0631\u062e\u0648\u0627\u0633\u062a Vote \u0628\u0647 \u0647\u0631 \u067e\u06cc\u0631\u0648\u0627\u0646 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u0633\u067e\u0633 \u060c \u0645\u0648\u0636\u0648\u0639 \u0627\u0635\u0644\u06cc \u0628\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u062c\u062f\u062f \u062a\u0627\u06cc\u0645\u0631 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u060c \u0631\u0648\u0634 \u0631\u0627 \u062a\u06a9\u0645\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u060c \u06cc\u06a9 \u0632\u0645\u0627\u0646\u0628\u0646\u062f\u06cc \u060c \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u0647 \u062f\u0631 Resttemplate \u060c \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u067e\u0627\u0633\u062e \u0647\u0627 \u062f\u0631 \u0645\u062f\u062a \u0632\u0645\u0627\u0646 \u06a9\u0648\u062a\u0627\u0647\u062a\u0631 \u0627\u0632 \u062a\u0627\u06cc\u0645\u0631 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0648\u0627\u0631\u062f \u0645\u06cc \u0634\u0648\u0646\u062f \u0648 \u0627\u0632 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0647\u0645\u067e\u0648\u0634\u0627\u0646\u06cc \u062f\u0631 \u0647\u0645\u0627\u0646 \u06af\u0631\u0647 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u067e\u0627\u0633\u062e \u0647\u0645\u0633\u0627\u0644\u0627\u0646 \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 \u0627\u0635\u0637\u0644\u0627\u062d \u0628\u0627\u0644\u0627\u062a\u0631\u06cc \u0628\u0627\u0634\u062f \u060c \u06af\u0631\u0647 \u0628\u0644\u0627\u0641\u0627\u0635\u0644\u0647 \u0628\u0647 \u062d\u0627\u0644\u062a \u067e\u06cc\u0631\u0648\u0627\u0646 \u067e\u0627\u06cc\u06cc\u0646 \u0645\u06cc \u0622\u06cc\u062f \u0648 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0646\u062a\u06cc\u062c\u0647 \u0645\u06cc \u06af\u06cc\u0631\u062f. \u0627\u06af\u0631 \u06a9\u0645\u062a\u0631 \u0627\u0632 \u0627\u06a9\u062b\u0631 \u067e\u0627\u0633\u062e \u0647\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0634\u0648\u062f \u060c \u062a\u0627\u06cc\u0645\u0631 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u062a\u0646\u0638\u06cc\u0645 \u0645\u062c\u062f\u062f \u0645\u06cc \u0634\u0648\u062f. \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u060c \u06af\u0631\u0647 \u0628\u0647 \u06cc\u06a9 \u0631\u0647\u0628\u0631 \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc \u0634\u0648\u062f \u060c \u062a\u0627\u06cc\u0645\u0631 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0631\u0627 \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u062c\u062f\u06cc\u062f \u0644\u063a\u0648 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0634\u0631\u0648\u0639 \u0628\u0647 \u0627\u0631\u0633\u0627\u0644 \u0636\u0631\u0628\u0627\u0646 \u0642\u0644\u0628 \u0628\u0647 \u06af\u0631\u0647 \u0647\u0627\u06cc \u067e\u06cc\u0631\u0648 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u062c\u0631\u0627\u06cc \u0631\u0648\u0634 HandleVoterEquest \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0627\u063a\u0630 \u0642\u0627\u06cc\u0642 \u0633\u0627\u062f\u0647 \u0627\u0633\u062a \u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u067e\u0631\u0634 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"cm\">\/**\n * On conversion to candidate, start election:\n * Increment currentTerm, vote for self, reset election timer, send RequestVote RPCs to all other servers.\n *\/<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">startElection<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentRole<\/span><span class=\"o\">()<\/span> <span class=\"o\">==<\/span> <span class=\"nc\">Role<\/span><span class=\"o\">.<\/span><span class=\"na\">LEADER<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">return<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">setCurrentRole<\/span><span class=\"o\">(<\/span><span class=\"nc\">Role<\/span><span class=\"o\">.<\/span><span class=\"na\">CANDIDATE<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">incrementTerm<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">setVotedFor<\/span><span class=\"o\">(<\/span><span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getNodeId<\/span><span class=\"o\">());<\/span>\n\n        <span class=\"kt\">int<\/span> <span class=\"n\">currentTerm<\/span> <span class=\"o\">=<\/span> <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentTerm<\/span><span class=\"o\">();<\/span>\n        <span class=\"kt\">int<\/span> <span class=\"n\">lastLogIndex<\/span> <span class=\"o\">=<\/span> <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">getLastIndex<\/span><span class=\"o\">();<\/span>\n        <span class=\"kt\">int<\/span> <span class=\"n\">lastLogTerm<\/span> <span class=\"o\">=<\/span> <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">getLastTerm<\/span><span class=\"o\">();<\/span>\n\n        <span class=\"nc\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">CompletableFuture<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">VoteResponseDto<\/span><span class=\"o\">&gt;&gt;<\/span> <span class=\"n\">voteFutures<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ArrayList<\/span><span class=\"o\">&lt;&gt;();<\/span>\n        <span class=\"nc\">ExecutorService<\/span> <span class=\"n\">executor<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Executors<\/span><span class=\"o\">.<\/span><span class=\"na\">newCachedThreadPool<\/span><span class=\"o\">();<\/span>\n\n        <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">peerUrl<\/span> <span class=\"o\">:<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">getPeerUrls<\/span><span class=\"o\">().<\/span><span class=\"na\">values<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n            <span class=\"nc\">CompletableFuture<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">VoteResponseDto<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">voteFuture<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">CompletableFuture<\/span>\n                    <span class=\"o\">.<\/span><span class=\"na\">supplyAsync<\/span><span class=\"o\">(()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">requestVote<\/span><span class=\"o\">(<\/span>\n                            <span class=\"n\">currentTerm<\/span><span class=\"o\">,<\/span>\n                            <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getNodeId<\/span><span class=\"o\">(),<\/span>\n                            <span class=\"n\">lastLogIndex<\/span><span class=\"o\">,<\/span>\n                            <span class=\"n\">lastLogTerm<\/span><span class=\"o\">,<\/span>\n                            <span class=\"n\">peerUrl<\/span>\n                    <span class=\"o\">),<\/span> <span class=\"n\">executor<\/span><span class=\"o\">)<\/span>\n                    <span class=\"o\">.<\/span><span class=\"na\">orTimeout<\/span><span class=\"o\">(<\/span><span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">getElectionRpcTimeoutMillis<\/span><span class=\"o\">(),<\/span> <span class=\"nc\">TimeUnit<\/span><span class=\"o\">.<\/span><span class=\"na\">MILLISECONDS<\/span><span class=\"o\">)<\/span>\n                    <span class=\"o\">.<\/span><span class=\"na\">exceptionally<\/span><span class=\"o\">(<\/span><span class=\"n\">throwable<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\n                        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">VoteResponseDto<\/span><span class=\"o\">(<\/span><span class=\"n\">currentTerm<\/span><span class=\"o\">,<\/span> <span class=\"kc\">false<\/span><span class=\"o\">);<\/span>\n                    <span class=\"o\">});<\/span>\n            <span class=\"n\">voteFutures<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"n\">voteFuture<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"kt\">int<\/span> <span class=\"n\">majority<\/span> <span class=\"o\">=<\/span> <span class=\"o\">(<\/span><span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">getPeerUrls<\/span><span class=\"o\">().<\/span><span class=\"na\">size<\/span><span class=\"o\">()<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"o\">)<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">2<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"o\">;<\/span>\n        <span class=\"nc\">AtomicInteger<\/span> <span class=\"n\">voteCount<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">AtomicInteger<\/span><span class=\"o\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">);<\/span>\n\n        <span class=\"c1\">\/\/ If votes received from majority of servers: become leader (\u00a75.2).<\/span>\n        <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"nc\">CompletableFuture<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">VoteResponseDto<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">future<\/span> <span class=\"o\">:<\/span> <span class=\"n\">voteFutures<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">future<\/span><span class=\"o\">.<\/span><span class=\"na\">thenAccept<\/span><span class=\"o\">(<\/span><span class=\"n\">response<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\n                <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n                <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n                    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentRole<\/span><span class=\"o\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"nc\">Role<\/span><span class=\"o\">.<\/span><span class=\"na\">CANDIDATE<\/span> <span class=\"o\">||<\/span> <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentTerm<\/span><span class=\"o\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"n\">currentTerm<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n                        <span class=\"k\">return<\/span><span class=\"o\">;<\/span>\n                    <span class=\"o\">}<\/span>\n                    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">response<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">response<\/span><span class=\"o\">.<\/span><span class=\"na\">isVoteGranted<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n                        <span class=\"kt\">int<\/span> <span class=\"n\">newVoteCount<\/span> <span class=\"o\">=<\/span> <span class=\"n\">voteCount<\/span><span class=\"o\">.<\/span><span class=\"na\">incrementAndGet<\/span><span class=\"o\">();<\/span>\n                        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">newVoteCount<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"n\">majority<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n                            <span class=\"n\">stateManager<\/span><span class=\"o\">.<\/span><span class=\"na\">becomeLeader<\/span><span class=\"o\">();<\/span>\n                        <span class=\"o\">}<\/span>\n                    <span class=\"o\">}<\/span>\n                <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\n                    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n                <span class=\"o\">}<\/span>\n            <span class=\"o\">});<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"n\">stateManager<\/span><span class=\"o\">.<\/span><span class=\"na\">resetElectionTimer<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AA%DA%A9%D8%AB%DB%8C%D8%B1_%D9%88%D8%B1%D9%88%D8%AF_%D8%A8%D9%87_%D8%B3%DB%8C%D8%B3%D8%AA%D9%85_55\"><\/span>\n<p>  \u062a\u06a9\u062b\u06cc\u0631 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 (5\/5)):<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0648\u0645\u06cc\u0646 \u0645\u0627\u0698\u0648\u0644 \u06a9\u0647 \u0645\u0646 \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f\u0645 \u060c \u062a\u06a9\u062b\u06cc\u0631 log \u0627\u0633\u062a. \u0628\u0627 \u062a\u0648\u062c\u0647 \u0628\u0647 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0627\u06cc\u0646 \u0645\u0646\u0637\u0642 \u060c \u0645\u0646 \u0645\u0633\u0626\u0648\u0644\u06cc\u062a \u0647\u0627 \u0631\u0627 \u0628\u0647 \u0633\u0647 \u06a9\u0644\u0627\u0633 \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u062a\u0642\u0633\u06cc\u0645 \u06a9\u0631\u062f\u0645: \u06cc\u06a9\u06cc \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0646\u0648\u0634\u062a\u0646 \u0645\u0634\u062a\u0631\u06cc \u060c \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u062a\u06a9\u062b\u06cc\u0631 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0648 \u062f\u0631 \u0622\u062e\u0631 \u0628\u0631\u0627\u06cc \u067e\u0631\u062f\u0627\u0632\u0634 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u0636\u0645\u06cc\u0645\u0647.<\/p>\n<blockquote>\n<p>emendentrieshandler.java<br \/>ClientRequestHandler.java<br \/>logReplicator.java<br \/>raftreplicationManager.java<\/p>\n<\/blockquote>\n<p>\u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u06cc\u0646 \u0641\u0639\u0644 \u0648 \u0627\u0646\u0641\u0639\u0627\u0644\u0627\u062a \u060c \u0645\u0646 \u0627\u0632 \u0627\u0644\u06af\u0648\u06cc \u0637\u0631\u0627\u062d\u06cc \u0646\u0645\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645 \u0648 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0645\u062a\u0645\u0631\u06a9\u0632 ReplicationManager \u0631\u0627 \u0628\u0631\u0627\u06cc \u062a\u0641\u0648\u06cc\u0636 \u062a\u0645\u0627\u0633 \u0647\u0627 \u0628\u0647 \u06a9\u0644\u0627\u0633 \u0647\u0627\u06cc \u0645\u0646\u0627\u0633\u0628 \u0645\u0639\u0631\u0641\u06cc \u06a9\u0631\u062f\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"o\">...<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">RaftReplicationManager<\/span> <span class=\"o\">{<\/span>\n    <span class=\"o\">...<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">handleClientRequest<\/span><span class=\"o\">(<\/span><span class=\"nc\">LogEntry<\/span> <span class=\"n\">entry<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">clientRequestHandler<\/span><span class=\"o\">.<\/span><span class=\"na\">handle<\/span><span class=\"o\">(<\/span><span class=\"n\">entry<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">startLogReplication<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">logReplicator<\/span><span class=\"o\">.<\/span><span class=\"na\">start<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"nc\">AppendEntriesResponseDTO<\/span> <span class=\"nf\">handleAppendEntries<\/span><span class=\"o\">(<\/span><span class=\"nc\">AppendEntriesDTO<\/span> <span class=\"n\">dto<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">appendEntriesHandler<\/span><span class=\"o\">.<\/span><span class=\"na\">handle<\/span><span class=\"o\">(<\/span><span class=\"n\">dto<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">initializeIndices<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">logReplicator<\/span><span class=\"o\">.<\/span><span class=\"na\">initializeIndices<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0641\u0631\u0622\u06cc\u0646\u062f \u062a\u06a9\u062b\u06cc\u0631 \u0628\u0627 \u0631\u0648\u0634 start () \u062f\u0631 \u06a9\u0644\u0627\u0633 LogReplicator \u0622\u063a\u0627\u0632 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0628\u0647 \u0686\u0646\u062f\u06cc\u0646 \u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u062f\u0647 \u06a9\u0644\u06cc\u062f\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 RAFT \u0645\u062a\u06a9\u06cc \u0627\u0633\u062a: NextIndex[] \u0648 MatchIndex[]\u060c \u06a9\u0647 \u067e\u06cc\u0634\u0631\u0641\u062a \u062a\u06a9\u062b\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0647\u0631 \u067e\u06cc\u0631\u0648\u0627\u0646 \u062f\u0646\u0628\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f \u060c \u0648 \u06cc\u06a9 \u0646\u0633\u062e\u0647 \u062f\u0631 \u0627\u0646\u062a\u0638\u0627\u0631[] \u0646\u0642\u0634\u0647 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0638\u0627\u06cc\u0641 \u062a\u06a9\u0631\u0627\u0631 \u0645\u062f\u0627\u0648\u0645. <\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u06cc\u06a9 \u06af\u0631\u0647 \u067e\u0633 \u0627\u0632 \u067e\u06cc\u0631\u0648\u0632\u06cc \u062f\u0631 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0631\u0647\u0628\u0631 \u0634\u062f \u060c \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0628\u06cc\u0634 \u0627\u0632 \u0647\u0645\u0647 \u067e\u06cc\u0631\u0648\u0627\u0646 \u062f\u0631 \u0645\u0648\u0631\u062f \u062a\u06a9\u06cc\u0647 \u0631\u0627 \u062a\u06a9\u0631\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f[] \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0648\u0636\u0648\u0639\u0627\u062a \u0645\u0648\u062c\u0648\u062f \u0627\u0632 \u06cc\u06a9 \u0627\u0633\u062a\u062e\u0631 \u0646\u062e \u062b\u0627\u0628\u062a \u060c \u062a\u06a9\u062b\u06cc\u0631 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u0622\u0646\u0647\u0627 \u062f\u0631 \u0635\u0648\u0631\u062a \u0639\u062f\u0645 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u060c \u0646\u0642\u0634\u0647 \u0648 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"c1\">\/\/ Upon election: send initial empty AppendEntries RPCs (heartbeat) to each server; repeat during idle periods<\/span>\n<span class=\"c1\">\/\/ to prevent election timeouts (\u00a75.2)<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">start<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentRole<\/span><span class=\"o\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"nc\">Role<\/span><span class=\"o\">.<\/span><span class=\"na\">LEADER<\/span><span class=\"o\">)<\/span> <span class=\"k\">return<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">peer<\/span> <span class=\"o\">:<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">getPeerUrls<\/span><span class=\"o\">().<\/span><span class=\"na\">values<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">pendingReplication<\/span><span class=\"o\">.<\/span><span class=\"na\">getOrDefault<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">,<\/span> <span class=\"kc\">false<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">pendingReplication<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">,<\/span> <span class=\"kc\">true<\/span><span class=\"o\">);<\/span>\n            <span class=\"n\">executor<\/span><span class=\"o\">.<\/span><span class=\"na\">submit<\/span><span class=\"o\">(()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">replicateLoop<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">));<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u0647\u0631 \u067e\u06cc\u0631\u0648 \u060c \u06cc\u06a9 \u0645\u0648\u0636\u0648\u0639 \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u0631\u0648\u0634 Replicateloop () \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0631\u0648\u0634 \u06cc\u06a9 \u062d\u0644\u0642\u0647 \u0645\u062f\u062a\u06cc \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0645\u062f\u0627\u0648\u0645 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0628\u0647 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \/Appenidentries \u0627\u0632 \u067e\u06cc\u0631\u0648\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u060c \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0631\u0627 \u062f\u0631 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u06af\u0645\u0634\u062f\u0647 \u062c\u0644\u0628 \u0645\u06cc \u06a9\u0646\u062f \u060c \u06cc\u0627 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u062e\u0627\u0644\u06cc \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0636\u0631\u0628\u0627\u0646 \u0642\u0644\u0628 \u0628\u0631\u0627\u06cc \u062d\u0641\u0638 \u0631\u0647\u0628\u0631\u06cc \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0648\u0631\u0647 \u0628\u0631\u06af\u0634\u062a \u062d\u0644\u0642\u0647 \u0628\u0627 \u0641\u0627\u0635\u0644\u0647 \u0636\u0631\u0628\u0627\u0646 \u0642\u0644\u0628 \u0647\u0645\u0627\u0647\u0646\u06af \u0627\u0633\u062a.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"c1\">\/\/ Sends heartbeats\/log entries to peer, adjusting sleep time to match heartbeat interval<\/span>\n<span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">replicateLoop<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">peer<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kt\">int<\/span> <span class=\"n\">backoff<\/span> <span class=\"o\">=<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">getHeartbeatIntervalMillis<\/span><span class=\"o\">();<\/span>\n    <span class=\"k\">while<\/span> <span class=\"o\">(<\/span><span class=\"kc\">true<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n        <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentRole<\/span><span class=\"o\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"nc\">Role<\/span><span class=\"o\">.<\/span><span class=\"na\">LEADER<\/span><span class=\"o\">)<\/span> <span class=\"k\">break<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateMachineWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n        <span class=\"kt\">long<\/span> <span class=\"n\">startTime<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">currentTimeMillis<\/span><span class=\"o\">();<\/span>\n        <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n            <span class=\"kt\">boolean<\/span> <span class=\"n\">ok<\/span> <span class=\"o\">=<\/span> <span class=\"n\">replicate<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">);<\/span>\n            <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">ok<\/span><span class=\"o\">)<\/span> <span class=\"n\">updateCommitIndex<\/span><span class=\"o\">();<\/span>\n        <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateMachineWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n            <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n            <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"kt\">long<\/span> <span class=\"n\">duration<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">currentTimeMillis<\/span><span class=\"o\">()<\/span> <span class=\"o\">-<\/span> <span class=\"n\">startTime<\/span><span class=\"o\">;<\/span>\n        <span class=\"kt\">long<\/span> <span class=\"n\">sleepTime<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Math<\/span><span class=\"o\">.<\/span><span class=\"na\">max<\/span><span class=\"o\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">,<\/span> <span class=\"n\">backoff<\/span> <span class=\"o\">-<\/span> <span class=\"n\">duration<\/span><span class=\"o\">);<\/span>\n        <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n            <span class=\"nc\">Thread<\/span><span class=\"o\">.<\/span><span class=\"na\">sleep<\/span><span class=\"o\">(<\/span><span class=\"n\">sleepTime<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"o\">(<\/span><span class=\"nc\">InterruptedException<\/span> <span class=\"n\">e<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"nc\">Thread<\/span><span class=\"o\">.<\/span><span class=\"na\">currentThread<\/span><span class=\"o\">().<\/span><span class=\"na\">interrupt<\/span><span class=\"o\">();<\/span>\n            <span class=\"k\">break<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n    <span class=\"n\">pendingReplication<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">,<\/span> <span class=\"kc\">false<\/span><span class=\"o\">);<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u060c \u0632\u0645\u0627\u0646 \u0628\u0646\u062f\u06cc \u0645\u062c\u062f\u062f \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0627\u06cc\u0633\u062a\u0627\u062f\u0646 \u062d\u0644\u0642\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0646\u0627\u0645\u062d\u062f\u0648\u062f \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a \u060c \u06a9\u0647 \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u063a\u06cc\u0631\u0642\u0627\u0646\u0648\u0646\u06cc \u0631\u0627 \u062f\u0631 \u067e\u06cc\u0631\u0648\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062d\u0644\u0642\u0647 \u062a\u06a9\u062b\u06cc\u0631 \u0645\u0648\u0641\u0642 \u0645\u06cc \u0634\u0648\u062f &#8211; \u0628\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0647\u06cc\u0686 \u067e\u06cc\u0631\u0648\u0627\u0646 \u0628\u0627 \u06cc\u06a9 \u0627\u0635\u0637\u0644\u0627\u062d \u0628\u0627\u0644\u0627\u062a\u0631 \u067e\u0627\u0633\u062e \u0646\u0645\u06cc \u062f\u0647\u062f &#8211; \u0631\u0647\u0628\u0631 NextIndex \u0645\u0631\u0628\u0648\u0637\u0647 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u0645\u06cc \u06a9\u0646\u062f[] \u0648 MatchIndex[] \u0645\u0642\u0627\u062f\u06cc\u0631 \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u0634 UpdateCommitIndex ().<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"c1\">\/\/ If last log index &gt;= nextIndex for a follower: send AppendEntries RPC with log entries starting at nextIndex.<\/span>\n<span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">replicate<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">peer<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kt\">int<\/span> <span class=\"n\">ni<\/span> <span class=\"o\">=<\/span> <span class=\"n\">nextIndex<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">);<\/span>\n    <span class=\"kt\">int<\/span> <span class=\"n\">prevIdx<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ni<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"o\">;<\/span>\n    <span class=\"kt\">int<\/span> <span class=\"n\">prevTerm<\/span> <span class=\"o\">=<\/span> <span class=\"o\">(<\/span><span class=\"n\">prevIdx<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">)<\/span> <span class=\"o\">?<\/span> <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">getTermAt<\/span><span class=\"o\">(<\/span><span class=\"n\">prevIdx<\/span><span class=\"o\">)<\/span> <span class=\"o\">:<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span>\n    <span class=\"nc\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">LogEntry<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">entries<\/span> <span class=\"o\">=<\/span> <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">getEntriesFrom<\/span><span class=\"o\">(<\/span><span class=\"n\">ni<\/span><span class=\"o\">);<\/span>\n\n    <span class=\"nc\">AppendEntriesRequestDto<\/span> <span class=\"n\">dto<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">AppendEntriesRequestDto<\/span><span class=\"o\">(<\/span>\n            <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentTerm<\/span><span class=\"o\">(),<\/span> <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getNodeId<\/span><span class=\"o\">(),<\/span>\n            <span class=\"n\">prevIdx<\/span><span class=\"o\">,<\/span> <span class=\"n\">prevTerm<\/span><span class=\"o\">,<\/span> <span class=\"n\">entries<\/span><span class=\"o\">,<\/span> <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">getCommitIndex<\/span><span class=\"o\">()<\/span>\n    <span class=\"o\">);<\/span>\n\n    <span class=\"nc\">String<\/span> <span class=\"n\">peerId<\/span> <span class=\"o\">=<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">getPeerUrls<\/span><span class=\"o\">().<\/span><span class=\"na\">entrySet<\/span><span class=\"o\">().<\/span><span class=\"na\">stream<\/span><span class=\"o\">()<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">filter<\/span><span class=\"o\">(<\/span><span class=\"n\">entry<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">entry<\/span><span class=\"o\">.<\/span><span class=\"na\">getValue<\/span><span class=\"o\">().<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">))<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">map<\/span><span class=\"o\">(<\/span><span class=\"nc\">Map<\/span><span class=\"o\">.<\/span><span class=\"na\">Entry<\/span><span class=\"o\">::<\/span><span class=\"n\">getKey<\/span><span class=\"o\">)<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">map<\/span><span class=\"o\">(<\/span><span class=\"nl\">String:<\/span><span class=\"o\">:<\/span><span class=\"n\">valueOf<\/span><span class=\"o\">)<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">findFirst<\/span><span class=\"o\">()<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">orElse<\/span><span class=\"o\">(<\/span><span class=\"s\">\"unknown\"<\/span><span class=\"o\">);<\/span>\n\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n        <span class=\"nc\">String<\/span> <span class=\"n\">url<\/span> <span class=\"o\">=<\/span> <span class=\"n\">peer<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"\/raft\/appendEntries\"<\/span><span class=\"o\">;<\/span>\n        <span class=\"nc\">ResponseEntity<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">AppendEntriesResponseDto<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">res<\/span> <span class=\"o\">=<\/span> <span class=\"n\">restTemplate<\/span><span class=\"o\">.<\/span><span class=\"na\">postForEntity<\/span><span class=\"o\">(<\/span><span class=\"n\">url<\/span><span class=\"o\">,<\/span> <span class=\"n\">dto<\/span><span class=\"o\">,<\/span> <span class=\"nc\">AppendEntriesResponseDto<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\n        <span class=\"nc\">AppendEntriesResponseDto<\/span> <span class=\"n\">body<\/span> <span class=\"o\">=<\/span> <span class=\"n\">res<\/span><span class=\"o\">.<\/span><span class=\"na\">getBody<\/span><span class=\"o\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">?<\/span> <span class=\"n\">res<\/span><span class=\"o\">.<\/span><span class=\"na\">getBody<\/span><span class=\"o\">()<\/span> <span class=\"o\">:<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">AppendEntriesResponseDto<\/span><span class=\"o\">(-<\/span><span class=\"mi\">1<\/span><span class=\"o\">,<\/span> <span class=\"kc\">false<\/span><span class=\"o\">);<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">body<\/span><span class=\"o\">.<\/span><span class=\"na\">getTerm<\/span><span class=\"o\">()<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentTerm<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">nodeStateManager<\/span><span class=\"o\">.<\/span><span class=\"na\">becomeFollower<\/span><span class=\"o\">(<\/span><span class=\"n\">body<\/span><span class=\"o\">.<\/span><span class=\"na\">getTerm<\/span><span class=\"o\">());<\/span>\n            <span class=\"k\">return<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">body<\/span><span class=\"o\">.<\/span><span class=\"na\">isSuccess<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">nextIndex<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">,<\/span> <span class=\"n\">ni<\/span> <span class=\"o\">+<\/span> <span class=\"n\">entries<\/span><span class=\"o\">.<\/span><span class=\"na\">size<\/span><span class=\"o\">());<\/span>\n            <span class=\"n\">matchIndex<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">,<\/span> <span class=\"n\">ni<\/span> <span class=\"o\">+<\/span> <span class=\"n\">entries<\/span><span class=\"o\">.<\/span><span class=\"na\">size<\/span><span class=\"o\">()<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"o\">);<\/span>\n            <span class=\"k\">return<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\n            <span class=\"kt\">int<\/span> <span class=\"n\">newNextIndex<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Math<\/span><span class=\"o\">.<\/span><span class=\"na\">max<\/span><span class=\"o\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">,<\/span> <span class=\"n\">ni<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"o\">);<\/span>\n            <span class=\"n\">nextIndex<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"n\">peer<\/span><span class=\"o\">,<\/span> <span class=\"n\">newNextIndex<\/span><span class=\"o\">);<\/span>\n            <span class=\"k\">return<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"o\">(<\/span><span class=\"nc\">ResourceAccessException<\/span> <span class=\"n\">e<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"o\">(<\/span><span class=\"nc\">Exception<\/span> <span class=\"n\">e<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u0628\u0647 \u0646\u0648\u0628\u0647 \u062e\u0648\u062f \u060c \u0631\u0648\u0634 Applyentries () \u0631\u0627 \u062a\u062d\u0631\u06cc\u06a9 \u0645\u06cc \u06a9\u0646\u062f \u060c \u06a9\u0647 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0641\u0647\u0631\u0633\u062a \u0645\u062a\u0639\u0647\u062f \u0628\u0647 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646 \u060c \u0647\u0646\u06af\u0627\u0645 \u067e\u06cc\u0634\u0628\u0631\u062f \u0634\u0627\u062e\u0635 \u062a\u0639\u0647\u062f \u060c \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0641\u0642\u0637 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u062f\u0648\u0631\u0647 \u0641\u0639\u0644\u06cc \u0631\u0647\u0628\u0631 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646 \u0636\u0645\u0627\u0646\u062a \u0627\u06cc\u0645\u0646\u06cc RAFT \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0627\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u0642\u062f\u06cc\u0645\u06cc \u0627\u0632 \u0634\u0631\u0627\u06cc\u0637 \u0642\u0628\u0644\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u062f\u0631 \u0632\u06cc\u0631 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">updateCommitIndex<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kt\">int<\/span> <span class=\"n\">majority<\/span> <span class=\"o\">=<\/span> <span class=\"o\">(<\/span><span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">getPeerUrlList<\/span><span class=\"o\">().<\/span><span class=\"na\">size<\/span><span class=\"o\">()<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"o\">)<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">2<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"o\">;<\/span>\n    <span class=\"kt\">int<\/span> <span class=\"n\">term<\/span> <span class=\"o\">=<\/span> <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentTerm<\/span><span class=\"o\">();<\/span>\n    <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"na\">getLastIndex<\/span><span class=\"o\">();<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"na\">getCommitIndex<\/span><span class=\"o\">();<\/span> <span class=\"n\">i<\/span><span class=\"o\">--)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">int<\/span> <span class=\"n\">count<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">idx<\/span> <span class=\"o\">:<\/span> <span class=\"n\">matchIndex<\/span><span class=\"o\">.<\/span><span class=\"na\">values<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">idx<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"n\">i<\/span><span class=\"o\">)<\/span> <span class=\"n\">count<\/span><span class=\"o\">++;<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">count<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"n\">majority<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"na\">getTermAt<\/span><span class=\"o\">(<\/span><span class=\"n\">i<\/span><span class=\"o\">)<\/span> <span class=\"o\">==<\/span> <span class=\"n\">term<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"na\">setCommitIndex<\/span><span class=\"o\">(<\/span><span class=\"n\">i<\/span><span class=\"o\">);<\/span>\n            <span class=\"n\">applyEntries<\/span><span class=\"o\">();<\/span>\n            <span class=\"k\">break<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 \u062f\u06cc\u062f\u06af\u0627\u0647 \u067e\u06cc\u0631\u0648\u0627\u0646 \u060c \u0631\u0648\u0634 \u062f\u0633\u062a\u0647 () \u062f\u0631 \u06a9\u0644\u0627\u0633 AdventendriesHandler \u067e\u0631\u062f\u0627\u0632\u0634 \u0647\u0627\u06cc \u0648\u0627\u0628\u0633\u062a\u0647 \u0628\u0647 \u0631\u0647\u0628\u0631 \u0631\u0627 \u067e\u0631\u062f\u0627\u0632\u0634 \u0645\u06cc \u06a9\u0646\u062f. <\/p>\n<p>\u0627\u06cc\u0646 \u0627\u0628\u062a\u062f\u0627 \u0628\u0627 \u0628\u0631\u0631\u0633\u06cc \u0627\u06cc\u0646 \u0627\u0635\u0637\u0644\u0627\u062d \u060c \u0631\u0647\u0628\u0631\u06cc \u0641\u0631\u0633\u062a\u0646\u062f\u0647 \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f \u060c \u0648\u0631\u0648\u062f \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 NextIndex \u0631\u0647\u0628\u0631 \u0645\u0642\u0627\u06cc\u0633\u0647 \u0645\u06cc \u06a9\u0646\u062f[] \u0628\u0631\u0627\u06cc \u0622\u0646 \u067e\u06cc\u0631\u0648. \u0627\u06af\u0631 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u067e\u06cc\u0631\u0648\u0627\u0646 \u0628\u0647 \u062f\u0644\u06cc\u0644 \u0639\u062f\u0645 \u062a\u0637\u0627\u0628\u0642 \u062f\u0631 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u0642\u0628\u0644\u06cc \u0628\u0647 \u0631\u0648\u0632 \u0646\u0628\u0627\u0634\u062f \u060c \u0627\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u0631\u062f \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0627\u0639\u062b \u0645\u06cc \u0634\u0648\u062f \u0631\u0647\u0628\u0631 \u0627\u0632 NextIndex \u067e\u06cc\u0631\u0648\u0627\u0646 \u06a9\u0627\u0647\u0634 \u06cc\u0627\u0628\u062f[] \u062a\u0648\u0633\u0637 \u06cc\u06a9 \u0648 \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u062f. <\/p>\n<p>\u0627\u06af\u0631 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f \u060c \u067e\u06cc\u0631\u0648\u0627\u0646 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627 \u0631\u0627 \u0628\u0627 \u062a\u0648\u062c\u0647 \u0628\u0647 \u0648\u06cc\u0698\u06af\u06cc \u062a\u0637\u0628\u06cc\u0642 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 (5.2 \u00a7) \u0645\u06cc \u067e\u0630\u06cc\u0631\u062f \u060c \u0634\u0627\u062e\u0635 \u062a\u0639\u0647\u062f \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u062f\u0648\u0644\u062a\u06cc \u062e\u0648\u062f \u0631\u0627 \u062a\u0627 \u0634\u0627\u062e\u0635 \u062c\u062f\u06cc\u062f \u062a\u0639\u0647\u062f \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"kd\">public<\/span> <span class=\"nc\">AppendEntriesResponseDto<\/span> <span class=\"nf\">handle<\/span><span class=\"o\">(<\/span><span class=\"nc\">AppendEntriesRequestDto<\/span> <span class=\"n\">dto<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateMachineWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">int<\/span> <span class=\"n\">term<\/span> <span class=\"o\">=<\/span> <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentTerm<\/span><span class=\"o\">();<\/span>\n        <span class=\"kt\">int<\/span> <span class=\"n\">leaderTerm<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getTerm<\/span><span class=\"o\">();<\/span>\n\n        <span class=\"c1\">\/\/ Reply false if term &lt; currentTerm (\u00a75.1)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">leaderTerm<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">term<\/span><span class=\"o\">)<\/span> <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">AppendEntriesResponseDto<\/span><span class=\"o\">(<\/span><span class=\"n\">term<\/span><span class=\"o\">,<\/span> <span class=\"kc\">false<\/span><span class=\"o\">);<\/span>\n\n        <span class=\"c1\">\/\/ If RPC request or response contains term T &gt; currentTerm: set currentTerm = T, convert to follower (\u00a75.1)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">leaderTerm<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">term<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">stateManager<\/span><span class=\"o\">.<\/span><span class=\"na\">becomeFollower<\/span><span class=\"o\">(<\/span><span class=\"n\">leaderTerm<\/span><span class=\"o\">);<\/span>\n            <span class=\"n\">term<\/span> <span class=\"o\">=<\/span> <span class=\"n\">leaderTerm<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">setCurrentLeader<\/span><span class=\"o\">(<\/span><span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getLeaderId<\/span><span class=\"o\">());<\/span>\n\n        <span class=\"c1\">\/\/ Reply false if log doesn't contain an entry at prevLogIndex whose term matches prevLogTerm (\u00a75.3)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrevLogIndex<\/span><span class=\"o\">()<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span> <span class=\"o\">&amp;&amp;<\/span>\n                <span class=\"o\">(!<\/span><span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">containsEntryAt<\/span><span class=\"o\">(<\/span><span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrevLogIndex<\/span><span class=\"o\">())<\/span> <span class=\"o\">||<\/span>\n                        <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">getTermAt<\/span><span class=\"o\">(<\/span><span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrevLogIndex<\/span><span class=\"o\">())<\/span> <span class=\"o\">!=<\/span> <span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrevLogTerm<\/span><span class=\"o\">()))<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">stateManager<\/span><span class=\"o\">.<\/span><span class=\"na\">resetElectionTimer<\/span><span class=\"o\">();<\/span>\n            <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">AppendEntriesResponseDto<\/span><span class=\"o\">(<\/span><span class=\"n\">term<\/span><span class=\"o\">,<\/span> <span class=\"kc\">false<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"c1\">\/\/ If an existing entry conflicts with a new one (same index but different terms), delete the existing<\/span>\n        <span class=\"c1\">\/\/ entry and all that follow it (\u00a75.3). Append any new entries not already in the log.<\/span>\n        <span class=\"kt\">int<\/span> <span class=\"n\">index<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrevLogIndex<\/span><span class=\"o\">()<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"o\">;<\/span>\n        <span class=\"nc\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">LogEntry<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">entries<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getEntries<\/span><span class=\"o\">();<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">entries<\/span><span class=\"o\">.<\/span><span class=\"na\">isEmpty<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">entries<\/span><span class=\"o\">.<\/span><span class=\"na\">size<\/span><span class=\"o\">();<\/span> <span class=\"n\">i<\/span><span class=\"o\">++)<\/span> <span class=\"o\">{<\/span>\n                <span class=\"kt\">int<\/span> <span class=\"n\">logIndex<\/span> <span class=\"o\">=<\/span> <span class=\"n\">index<\/span> <span class=\"o\">+<\/span> <span class=\"n\">i<\/span><span class=\"o\">;<\/span>\n                <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">containsEntryAt<\/span><span class=\"o\">(<\/span><span class=\"n\">logIndex<\/span><span class=\"o\">)<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">getTermAt<\/span><span class=\"o\">(<\/span><span class=\"n\">logIndex<\/span><span class=\"o\">)<\/span> <span class=\"o\">!=<\/span> <span class=\"n\">entries<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"n\">i<\/span><span class=\"o\">).<\/span><span class=\"na\">getTerm<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n                    <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">deleteFrom<\/span><span class=\"o\">(<\/span><span class=\"n\">logIndex<\/span><span class=\"o\">);<\/span>\n                    <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">appendAll<\/span><span class=\"o\">(<\/span><span class=\"n\">entries<\/span><span class=\"o\">.<\/span><span class=\"na\">subList<\/span><span class=\"o\">(<\/span><span class=\"n\">i<\/span><span class=\"o\">,<\/span> <span class=\"n\">entries<\/span><span class=\"o\">.<\/span><span class=\"na\">size<\/span><span class=\"o\">()));<\/span>\n                    <span class=\"k\">break<\/span><span class=\"o\">;<\/span>\n                <span class=\"o\">}<\/span>\n            <span class=\"o\">}<\/span>\n            <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">containsEntryAt<\/span><span class=\"o\">(<\/span><span class=\"n\">index<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\n                <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">appendAll<\/span><span class=\"o\">(<\/span><span class=\"n\">entries<\/span><span class=\"o\">);<\/span>\n            <span class=\"o\">}<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"c1\">\/\/ If leaderCommit &gt; commitIndex, set commitIndex = min(leaderCommit, index of the last new entry)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getLeaderCommit<\/span><span class=\"o\">()<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">getCommitIndex<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n            <span class=\"kt\">int<\/span> <span class=\"n\">lastNew<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrevLogIndex<\/span><span class=\"o\">()<\/span> <span class=\"o\">+<\/span> <span class=\"n\">entries<\/span><span class=\"o\">.<\/span><span class=\"na\">size<\/span><span class=\"o\">();<\/span>\n            <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">setCommitIndex<\/span><span class=\"o\">(<\/span><span class=\"nc\">Math<\/span><span class=\"o\">.<\/span><span class=\"na\">min<\/span><span class=\"o\">(<\/span><span class=\"n\">dto<\/span><span class=\"o\">.<\/span><span class=\"na\">getLeaderCommit<\/span><span class=\"o\">(),<\/span> <span class=\"n\">lastNew<\/span><span class=\"o\">));<\/span>\n            <span class=\"n\">applyEntries<\/span><span class=\"o\">();<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"n\">stateManager<\/span><span class=\"o\">.<\/span><span class=\"na\">resetElectionTimer<\/span><span class=\"o\">();<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">AppendEntriesResponseDto<\/span><span class=\"o\">(<\/span><span class=\"n\">term<\/span><span class=\"o\">,<\/span> <span class=\"kc\">true<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateMachineWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u0631\u0627\u0646\u062c\u0627\u0645 \u060c ClientRequestHandler \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u0634\u062a\u0631\u06cc \u0631\u0627 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u06cc \u0646\u0648\u06cc\u0633\u062f. \u0631\u0648\u0634 \u062f\u0633\u062a\u0647 () \u0622\u0646 () \u0648\u0631\u0648\u062f \u0628\u0647 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0647\u0628\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u062a\u06a9\u062b\u06cc\u0631 \u0648 \u0646\u0638\u0627\u0631\u062a \u0628\u0631 \u0634\u0627\u062e\u0635 \u0648\u0631\u0648\u062f \u062f\u0627\u0631\u062f. \u0627\u06cc\u0646 \u06cc\u06a9 \u067e\u0627\u0633\u062e \u0645\u0648\u0641\u0642\u06cc\u062a \u0631\u0627 \u062a\u0646\u0647\u0627 \u0632\u0645\u0627\u0646\u06cc \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f \u06a9\u0647 \u0622\u062e\u0631\u06cc\u0646 \u0634\u0627\u062e\u0635 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0627\u0632 \u0634\u0627\u062e\u0635 \u0648\u0631\u0648\u062f\u06cc \u067e\u06cc\u0634\u06cc \u0628\u06af\u06cc\u0631\u062f \u0648 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u062f \u06a9\u0647 \u0646\u0648\u0634\u062a\u0646 \u0628\u0647 \u062f\u0633\u062a\u06af\u0627\u0647 \u062f\u0648\u0644\u062a \u0627\u0639\u0645\u0627\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a. <\/p>\n<p>\u0627\u06cc\u0646 \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u062e\u0637\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f \u060c \u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0628\u0639\u062f\u06cc \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0646\u0648\u0634\u062a\u0646 \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u060c \u0628\u0627\u0632\u062a\u0627\u0628 \u062f\u0633\u062a\u06af\u0627\u0647 \u062d\u0627\u0644\u062a \u0628\u0647 \u0631\u0648\u0632 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"c1\">\/\/ If command received from the client: append entry to local log, respond after entry applied<\/span>\n<span class=\"c1\">\/\/ to state machine (\u00a75.3)<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">handle<\/span><span class=\"o\">(<\/span><span class=\"nc\">LogEntry<\/span> <span class=\"n\">clientEntry<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n    <span class=\"kt\">int<\/span> <span class=\"n\">entryIndex<\/span><span class=\"o\">;<\/span>\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">raftNodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">isLeader<\/span><span class=\"o\">())<\/span> <span class=\"k\">return<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n        <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">append<\/span><span class=\"o\">(<\/span><span class=\"n\">clientEntry<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">entryIndex<\/span> <span class=\"o\">=<\/span> <span class=\"n\">raftLog<\/span><span class=\"o\">.<\/span><span class=\"na\">getLastIndex<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogWriteLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"kt\">long<\/span> <span class=\"n\">start<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">currentTimeMillis<\/span><span class=\"o\">();<\/span>\n    <span class=\"kt\">long<\/span> <span class=\"n\">timeoutMillis<\/span> <span class=\"o\">=<\/span> <span class=\"n\">raftConfig<\/span><span class=\"o\">.<\/span><span class=\"na\">getClientRequestTimeoutMillis<\/span><span class=\"o\">();<\/span>\n\n    <span class=\"k\">while<\/span> <span class=\"o\">(<\/span><span class=\"kc\">true<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n        <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">raftNodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentRole<\/span><span class=\"o\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"nc\">Role<\/span><span class=\"o\">.<\/span><span class=\"na\">LEADER<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n                <span class=\"k\">return<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n            <span class=\"o\">}<\/span>\n            <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">raftNodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getLastApplied<\/span><span class=\"o\">()<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"n\">entryIndex<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n                <span class=\"k\">return<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\n            <span class=\"o\">}<\/span>\n        <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n            <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n        <span class=\"o\">}<\/span>\n\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">currentTimeMillis<\/span><span class=\"o\">()<\/span> <span class=\"o\">-<\/span> <span class=\"n\">start<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">timeoutMillis<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n            <span class=\"nc\">Thread<\/span><span class=\"o\">.<\/span><span class=\"na\">sleep<\/span><span class=\"o\">(<\/span><span class=\"mi\">50<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"o\">(<\/span><span class=\"nc\">InterruptedException<\/span> <span class=\"n\">e<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"nc\">Thread<\/span><span class=\"o\">.<\/span><span class=\"na\">currentThread<\/span><span class=\"o\">().<\/span><span class=\"na\">interrupt<\/span><span class=\"o\">();<\/span>\n            <span class=\"k\">return<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u060c \u062a\u0623\u062e\u06cc\u0631 \u062c\u0632\u0626\u06cc \u0628\u0647 \u062f\u0644\u06cc\u0644 \u0646\u0648\u0634\u062a\u0646 \u0645\u0634\u062a\u0631\u06cc \u0628\u0627 \u0686\u0631\u062e\u0647 \u0636\u0631\u0628\u0627\u0646 \u0642\u0644\u0628 \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0627\u0631\u062f. \u0627\u06af\u0631 \u0641\u0627\u0635\u0644\u0647 \u0636\u0631\u0628\u0627\u0646 \u0642\u0644\u0628 1 \u062b\u0627\u0646\u06cc\u0647 \u0628\u0627\u0634\u062f \u060c \u0631\u0647\u0628\u0631 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0642\u0628\u0644 \u0627\u0632 \u062a\u06a9\u0631\u0627\u0631 \u0646\u0648\u0634\u062a\u0646 \u062a\u0627 1 \u062b\u0627\u0646\u06cc\u0647 \u0635\u0628\u0631 \u06a9\u0646\u062f. \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u067e\u0631\u0648\u062a\u06a9\u0644 RAFT \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 RPC \u0647\u0627\u06cc \u0645\u0633\u062a\u0642\u0644 \u0645\u0633\u062a\u0642\u0644 \u0628\u0631\u0627\u06cc \u0646\u0648\u0634\u062a\u0646 (\u062c\u062f\u0627 \u0627\u0632 \u0636\u0631\u0628\u0627\u0646 \u0642\u0644\u0628) \u060c \u0645\u0646 \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 \u06a9\u0647 \u0647\u0645\u06af\u0627\u0645 \u0633\u0627\u0632\u06cc \u0645\u0634\u062a\u0631\u06cc \u0631\u0627 \u0628\u0627 \u0686\u0631\u062e\u0647 \u0636\u0631\u0628\u0627\u0646 \u0642\u0644\u0628 \u0647\u0645\u06af\u0627\u0645 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0645 \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u06a9\u0627\u0631\u0622\u0632\u0645\u0627\u06cc\u06cc \u0647\u0645\u0632\u0645\u0627\u0646 \u0631\u0627 \u0633\u0627\u062f\u0647 \u062a\u0631 \u06a9\u0646\u0646\u062f \u0648 \u0627\u0632 \u062a\u06a9\u062b\u06cc\u0631 \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645.<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u067e\u0627\u06cc\u0627\u0646 \u060c \u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u0628\u0647 \u0646\u06af\u0631\u0627\u0646\u06cc \u0647\u0627\u06cc \u0647\u0645\u0632\u0645\u0627\u0646\u06cc \u0628\u067e\u0631\u062f\u0627\u0632\u0645. \u062f\u0631 \u0642\u0627\u06cc\u0642 \u060c \u0645\u0648\u0636\u0648\u0639\u0627\u062a \u0647\u0645\u0632\u0645\u0627\u0646 \u062f\u0633\u062a \u0632\u062f\u0646 \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a VOTE \u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0648 \u0632\u0645\u0627\u0646 \u0628\u0646\u062f\u06cc \u0627\u0646\u062a\u062e\u0627\u0628\u0627\u062a \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0634\u0631\u0627\u06cc\u0637 \u0645\u0633\u0627\u0628\u0642\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0635\u0644\u0627\u062d \u0647\u0645\u0632\u0645\u0627\u0646 \u062d\u0627\u0644\u062a \u06af\u0631\u0647 \u0645\u0634\u062a\u0631\u06a9 (\u0645\u0627\u0646\u0646\u062f \u062c\u0631\u06cc\u0627\u0646 \u0641\u0639\u0644\u06cc \u060c \u0631\u0627\u06cc \u06af\u06cc\u0631\u06cc \u0648 \u0648\u0631\u0648\u062f) \u0645\u0639\u0631\u0641\u06cc \u06a9\u0646\u0646\u062f. \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0633\u0631\u06cc\u0627\u0644 \u0633\u0627\u0632\u06cc \u0648 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0686\u0646\u06cc\u0646 \u0634\u0631\u0627\u06cc\u0637 \u0645\u0633\u0627\u0628\u0642\u0647 \u060c \u0645\u0646 \u06cc\u06a9 \u0642\u0641\u0644 \u0645\u062a\u0645\u0631\u06a9\u0632 \u062e\u0648\u0627\u0646\u062f\u0646 \u0646\u0648\u0634\u062a\u0646 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f\u0645 \u06a9\u0647 \u0646\u06af\u0647\u0628\u0627\u0646\u0627\u0646 \u0628\u0647 \u062d\u0627\u0644\u062a \u06af\u0631\u0647 \u060c \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0648 \u062f\u0633\u062a\u06af\u0627\u0647 \u062d\u0627\u0644\u062a \u06af\u0631\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u0645\u06cc \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u0646\u0637\u0642 \u0627\u0635\u0644\u06cc \u0642\u0627\u06cc\u0642 \u0627\u0633\u062a. \u0627\u06a9\u0646\u0648\u0646 \u060c \u0645\u0646 \u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u06af\u0631\u0627\u0646\u06cc \u0627\u0633\u0627\u0633\u06cc \u06a9\u0647 \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u0642\u0627\u0644\u0647 RAFT \u0645\u0639\u0631\u0648\u0641 \u0628\u0647 &#8220;\u0627\u062c\u0631\u0627\u06cc \u0645\u0639\u0627\u0646\u06cc \u0642\u0627\u0628\u0644 \u062a\u063a\u06cc\u06cc\u0631&#8221; (8) \u0635\u062d\u0628\u062a \u06a9\u0631\u062f\u0645 \u060c \u0635\u062d\u0628\u062a \u06a9\u0646\u0645. <\/p>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B7%D9%85%DB%8C%D9%86%D8%A7%D9%86_%D8%A7%D8%B2_%D9%85%D8%B9%D9%86%D8%A7%D8%B4%D9%86%D8%A7%D8%B3%DB%8C_%D9%82%D8%A7%D8%A8%D9%84_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87\"><\/span>\n<p>  \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0645\u0639\u0646\u0627\u0634\u0646\u0627\u0633\u06cc \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 \u0642\u0627\u06cc\u0642 \u060c \u0646\u0648\u0634\u062a\u0646 \u0647\u0627 \u067e\u0633 \u0627\u0632 \u0631\u0633\u06cc\u062f\u0646 \u0628\u0647 quorum \u0627\u06a9\u062b\u0631\u06cc\u062a \u060c \u0645\u0631\u062a\u06a9\u0628 \u0645\u06cc \u0634\u0648\u0646\u062f \u060c \u0648 \u0631\u0647\u0628\u0631 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u062a\u0645\u0627\u0645 \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u0645\u062a\u0639\u0647\u062f \u0631\u0627 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u060c \u0627\u06cc\u0646 \u0630\u0627\u062a\u0627\u064b \u062a\u0636\u0645\u06cc\u0646 \u0646\u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u062e\u0648\u0627\u0646\u062f\u0647 \u0634\u062f\u0647 \u0628\u0647 \u0631\u0647\u0628\u0631 \u0647\u0645\u06cc\u0634\u0647 \u0645\u0646\u0639\u06a9\u0633 \u06a9\u0646\u0646\u062f\u0647 \u062a\u0631\u06cc\u0646 \u062d\u0627\u0644\u062a \u0628\u0647 \u0631\u0648\u0632 \u0628\u0627\u0634\u062f \u060c \u06a9\u0647 \u0628\u0631\u0627\u06cc \u062e\u0637\u06cc \u067e\u0630\u06cc\u0631\u06cc \u0636\u0631\u0648\u0631\u06cc \u0627\u0633\u062a.<\/p>\n<p>\u0633\u0646\u0627\u0631\u06cc\u0648\u06cc\u06cc \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u06cc\u062f \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0628\u0647 \u06cc\u06a9 \u0631\u0647\u0628\u0631 \u0645\u062a\u0635\u0644 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u062f\u0644\u06cc\u0644 \u06cc\u06a9 \u067e\u0627\u0631\u062a\u06cc\u0634\u0646 \u0634\u0628\u06a9\u0647 \u0631\u0647\u0628\u0631\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u062f\u0633\u062a \u0645\u06cc \u062f\u0647\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0627\u0632 \u0627\u06a9\u062b\u0631 \u062e\u0648\u0634\u0647 \u0647\u0627 \u062c\u062f\u0627 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06af\u0631 \u0645\u0634\u062a\u0631\u06cc \u0642\u0628\u0644 \u0627\u0632 \u0628\u0647\u0628\u0648\u062f\u06cc \u067e\u0627\u0631\u062a\u06cc\u0634\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u0631\u0647\u0628\u0631 \u067e\u06cc\u0634\u06cc\u0646 \u0648\u0635\u0644 \u0634\u0648\u062f \u060c \u06af\u0631\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0647\u0646\u0648\u0632 \u062e\u0648\u062f \u0631\u0627 \u0631\u0647\u0628\u0631 \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u062f \u0648 \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u062f\u0648\u0644\u062a\u06cc \u062e\u0648\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u0633\u062a \u062a\u0648\u0633\u0637 \u06cc\u06a9 \u0631\u0647\u0628\u0631 \u062c\u062f\u06cc\u062f \u06a9\u0646\u0627\u0631 \u06af\u0630\u0627\u0634\u062a\u0647 \u0634\u0648\u062f \u060c \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0628\u06cc \u0646\u0638\u06cc\u0631 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u062f. \u0627\u06cc\u0646 \u0627\u0645\u0631 \u062e\u0637\u06cc \u067e\u0630\u06cc\u0631\u06cc \u0631\u0627 \u0646\u0642\u0636 \u0645\u06cc \u06a9\u0646\u062f \u060c \u0632\u06cc\u0631\u0627 \u062e\u0648\u0627\u0646\u062f\u0646 \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 \u0622\u062e\u0631\u06cc\u0646 \u0646\u0648\u0634\u062a\u0647 \u0647\u0627\u06cc \u0645\u062a\u0639\u0647\u062f \u0646\u06cc\u0633\u062a.<\/p>\n<p>Raft Paper \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0627\u0645\u0631 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0645\u0646 \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645\u06cc \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f\u0645 \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0645\u0634\u062a\u0631\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u062f \u060c \u0647\u0645\u06cc\u0634\u0647 \u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0631\u0647\u0628\u0631\u06cc \u060c \u0648\u0631\u0648\u062f No-Op \u0631\u0627 \u0628\u0647 \u067e\u06cc\u0631\u0648\u0627\u0646 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06af\u0631 \u0627\u06a9\u062b\u0631 \u06af\u0631\u0647 \u0647\u0627 \u0648\u0631\u0648\u062f \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0645\u0646\u0637\u0642 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \/Appendentries \u0628\u067e\u0630\u06cc\u0631\u0646\u062f \u060c \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0631\u0647\u0628\u0631 \u0628\u06cc \u0646\u0638\u06cc\u0631 \u0646\u06cc\u0633\u062a \u0648 \u0627\u0632 \u0627\u06cc\u0646 \u0637\u0631\u06cc\u0642 \u062e\u0648\u0627\u0646\u062f\u0647 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u062e\u0637\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0627\u06cc\u0646 \u0633\u0641\u0631 \u0628\u0647 \u062f\u0648\u0631 \u0634\u0628\u06a9\u0647 \u0627\u0636\u0627\u0641\u06cc \u0631\u0627 \u0645\u0639\u0631\u0641\u06cc \u0645\u06cc \u06a9\u0646\u062f \u060c \u0628\u0627 \u062a\u0648\u062c\u0647 \u0628\u0647 \u0627\u062c\u0631\u0627\u06cc \u0641\u0639\u0644\u06cc \u0645\u0646 \u060c \u0631\u0627\u0647 \u062d\u0644 \u0641\u0642\u0637 \u06a9\u0627\u0641\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f. <\/p>\n<p>\u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0622\u0645\u062f\u062a\u0631 \u060c \u0645\u0627\u0646\u0646\u062f ReadIndex \u06cc\u0627 \u062e\u0648\u0627\u0646\u062f\u0646 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0627\u062c\u0627\u0631\u0647 \u0646\u0627\u0645\u0647 \u060c \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u060c \u0627\u0645\u0627 \u0645\u0646 \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0633\u0627\u062f\u0647 \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0645. \u0628\u0627 \u0639\u0631\u0636 \u067e\u0648\u0632\u0634 \u0628\u0631\u0627\u06cc \u06a9\u062f \u06a9\u062b\u06cc\u0641 \u0632\u06cc\u0631: \u0627\u06cc\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0628\u0648\u062f \u06a9\u0647 \u0645\u0646 \u0642\u0635\u062f \u0646\u062f\u0627\u0634\u062a\u0645 \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0631\u0627 \u062a\u0645\u062f\u06cc\u062f \u06a9\u0646\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"nd\">@GetMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/get\"<\/span><span class=\"o\">)<\/span>\n<span class=\"kd\">public<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">get<\/span><span class=\"o\">(<\/span><span class=\"nd\">@RequestParam<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">key<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"no\">NO_OP_ENTRY<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"NO_OP_ENTRY\"<\/span><span class=\"o\">;<\/span>\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">handleRead<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">WriteRequestDto<\/span><span class=\"o\">(<\/span><span class=\"no\">NO_OP_ENTRY<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Long<\/span><span class=\"o\">.<\/span><span class=\"na\">MAX_VALUE<\/span><span class=\"o\">,<\/span> <span class=\"no\">NO_OP_ENTRY<\/span><span class=\"o\">,<\/span> <span class=\"no\">NO_OP_ENTRY<\/span><span class=\"o\">));<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"o\">(<\/span><span class=\"nc\">Exception<\/span> <span class=\"n\">e<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"o\">.<\/span><span class=\"na\">status<\/span><span class=\"o\">(<\/span><span class=\"nc\">HttpStatus<\/span><span class=\"o\">.<\/span><span class=\"na\">INTERNAL_SERVER_ERROR<\/span><span class=\"o\">)<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">body<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Failed to process read request: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">e<\/span><span class=\"o\">.<\/span><span class=\"na\">getMessage<\/span><span class=\"o\">());<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateMachineReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">lock<\/span><span class=\"o\">();<\/span>\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\n        <span class=\"nc\">String<\/span> <span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"n\">kvStore<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">);<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"o\">.<\/span><span class=\"na\">status<\/span><span class=\"o\">(<\/span><span class=\"nc\">HttpStatus<\/span><span class=\"o\">.<\/span><span class=\"na\">NOT_FOUND<\/span><span class=\"o\">)<\/span>\n                    <span class=\"o\">.<\/span><span class=\"na\">body<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Key not found: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">key<\/span><span class=\"o\">);<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"o\">.<\/span><span class=\"na\">ok<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"o\">(<\/span><span class=\"nc\">Exception<\/span> <span class=\"n\">e<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"o\">.<\/span><span class=\"na\">status<\/span><span class=\"o\">(<\/span><span class=\"nc\">HttpStatus<\/span><span class=\"o\">.<\/span><span class=\"na\">INTERNAL_SERVER_ERROR<\/span><span class=\"o\">)<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">body<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Error retrieving key: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">e<\/span><span class=\"o\">.<\/span><span class=\"na\">getMessage<\/span><span class=\"o\">());<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">lockManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getStateMachineReadLock<\/span><span class=\"o\">().<\/span><span class=\"na\">unlock<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n\n<span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">handleRead<\/span><span class=\"o\">(<\/span><span class=\"nc\">WriteRequestDto<\/span> <span class=\"n\">request<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"nc\">LogEntry<\/span> <span class=\"n\">entry<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">LogEntry<\/span><span class=\"o\">(<\/span>\n            <span class=\"n\">nodeState<\/span><span class=\"o\">.<\/span><span class=\"na\">getCurrentTerm<\/span><span class=\"o\">(),<\/span>\n            <span class=\"n\">request<\/span><span class=\"o\">.<\/span><span class=\"na\">getKey<\/span><span class=\"o\">(),<\/span>\n            <span class=\"n\">request<\/span><span class=\"o\">.<\/span><span class=\"na\">getValue<\/span><span class=\"o\">(),<\/span>\n            <span class=\"nc\">LogEntry<\/span><span class=\"o\">.<\/span><span class=\"na\">Operation<\/span><span class=\"o\">.<\/span><span class=\"na\">PUT<\/span><span class=\"o\">,<\/span>\n            <span class=\"n\">request<\/span><span class=\"o\">.<\/span><span class=\"na\">getClientId<\/span><span class=\"o\">(),<\/span>\n            <span class=\"n\">request<\/span><span class=\"o\">.<\/span><span class=\"na\">getSequenceNumber<\/span><span class=\"o\">()<\/span>\n    <span class=\"o\">);<\/span>\n    <span class=\"kt\">boolean<\/span> <span class=\"n\">committed<\/span> <span class=\"o\">=<\/span> <span class=\"n\">replicationManager<\/span><span class=\"o\">.<\/span><span class=\"na\">handleClientRequest<\/span><span class=\"o\">(<\/span><span class=\"n\">entry<\/span><span class=\"o\">);<\/span>\n    <span class=\"k\">if<\/span> <span class=\"o\">(!<\/span><span class=\"n\">committed<\/span><span class=\"o\">)<\/span> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">RuntimeException<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Can't process the read at this moment\"<\/span><span class=\"o\">);<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B7%D9%85%DB%8C%D9%86%D8%A7%D9%86_%D8%A7%D8%B2_%D9%85%D8%B9%D9%86%D8%A7%D8%B4%D9%86%D8%A7%D8%B3%DB%8C_%D9%82%D8%A7%D8%A8%D9%84_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_2\"><\/span>\n<p>  \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0645\u0639\u0646\u0627\u0634\u0646\u0627\u0633\u06cc \u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 2<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Raft Paper \u062f\u0631 \u0645\u0648\u0631\u062f \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc\u06cc \u0628\u062d\u062b \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 &#8220;\u0627\u06af\u0631 \u0631\u0647\u0628\u0631 \u067e\u0633 \u0627\u0632 \u0627\u0631\u062a\u06a9\u0627\u0628 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u062e\u0631\u0627\u0628 \u0634\u0648\u062f \u0627\u0645\u0627 \u0642\u0628\u0644 \u0627\u0632 \u067e\u0627\u0633\u062e \u0628\u0647 \u0645\u0634\u062a\u0631\u06cc \u060c \u0645\u0634\u062a\u0631\u06cc \u0641\u0631\u0645\u0627\u0646 \u0631\u0627 \u0628\u0627 \u06cc\u06a9 \u0631\u0647\u0628\u0631 \u062c\u062f\u06cc\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u062f \u0648 \u0628\u0627\u0639\u062b \u0634\u0648\u062f \u0628\u0627\u0631 \u062f\u0648\u0645 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f.&#8221; Deduplication \u0637\u0631\u0641 \u0645\u0634\u062a\u0631\u06cc \u0628\u0627 \u067e\u06cc\u0648\u0633\u062a\u0646 \u0628\u0647 \u06cc\u06a9 \u0634\u0646\u0627\u0633\u0647 \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u06cc\u06a9 \u0634\u0645\u0627\u0631\u0647 \u062f\u0646\u0628\u0627\u0644\u0647) \u0628\u0647 \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u060c \u0627\u06cc\u0646 \u0645\u0633\u0626\u0644\u0647 \u0631\u0627 \u062d\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u0633\u0631\u0648\u0631 \u0627\u06cc\u0646 \u0634\u0646\u0627\u0633\u0647 \u0647\u0627 \u0631\u0627 \u0631\u062f\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0646\u0633\u062e\u0647 \u0647\u0627\u06cc \u062a\u06a9\u0631\u0627\u0631\u06cc \u0631\u0627 \u0631\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0647\u0645 \u0635\u062d\u062a \u0648 \u0647\u0645 \u0642\u0627\u0628\u0644\u06cc\u062a \u062e\u0637\u06cc \u0631\u0627 \u062d\u0641\u0638 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0647 \u06cc\u06a9\u06cc \u0627\u0632 \u0686\u0627\u0644\u0634 \u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u067e\u0631\u062f\u0627\u062e\u062a\u0647 \u0627\u0633\u062a. <\/p>\n<p>\u062f\u0631 \u0627\u062c\u0631\u0627\u06cc \u060c \u0645\u0646 \u0631\u0648\u0634 Apply () \u0631\u0627 \u062f\u0631 \u06a9\u0644\u0627\u0633 StateMachine \u0627\u0635\u0644\u0627\u062d \u06a9\u0631\u062f\u0645. \u0642\u0628\u0644 \u0627\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0648\u0634\u062a\u0646 \u060c \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 (\u062f\u0631 \u062d\u0627\u0641\u0638\u0647) \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0645\u06cc \u06a9\u0646\u062f \u062a\u0627 \u0634\u0645\u0627\u0631\u0647 \u062f\u0646\u0628\u0627\u0644\u0647 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0628\u0627 \u0622\u062e\u0631\u06cc\u0646 \u0634\u0645\u0627\u0631\u0647 \u062f\u0646\u0628\u0627\u0644\u0647 \u0636\u0628\u0637 \u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u0622\u0646 \u0634\u0646\u0627\u0633\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u0642\u0627\u06cc\u0633\u0647 \u06a9\u0646\u062f. \u0646\u0648\u0634\u062a\u0646 \u0641\u0642\u0637 \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u06a9\u0647 \u062a\u0639\u062f\u0627\u062f \u062f\u0646\u0628\u0627\u0644\u0647 \u062c\u062f\u06cc\u062f \u0628\u06cc\u0634\u062a\u0631 \u0628\u0627\u0634\u062f \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc \u0634\u0648\u062f \u060c \u062a\u0623\u06cc\u06cc\u062f \u0622\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0639\u0645\u0644 \u062a\u0627\u0632\u0647 \u0648 \u0646\u0647 \u06cc\u06a9 \u06a9\u067e\u06cc.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"nd\">@Override<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">apply<\/span><span class=\"o\">(<\/span><span class=\"nc\">LogEntry<\/span> <span class=\"n\">entry<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">entry<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">IllegalArgumentException<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Log entry cannot be null\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"c1\">\/\/ deduplication check<\/span>\n    <span class=\"nc\">String<\/span> <span class=\"n\">clientId<\/span> <span class=\"o\">=<\/span> <span class=\"n\">entry<\/span><span class=\"o\">.<\/span><span class=\"na\">getClientId<\/span><span class=\"o\">();<\/span>\n    <span class=\"kt\">long<\/span> <span class=\"n\">sequenceNumber<\/span> <span class=\"o\">=<\/span> <span class=\"n\">entry<\/span><span class=\"o\">.<\/span><span class=\"na\">getSequenceNumber<\/span><span class=\"o\">();<\/span>\n    <span class=\"nc\">Long<\/span> <span class=\"n\">lastSequenceNumber<\/span> <span class=\"o\">=<\/span> <span class=\"n\">kvStore<\/span><span class=\"o\">.<\/span><span class=\"na\">getLastSequenceNumber<\/span><span class=\"o\">(<\/span><span class=\"n\">clientId<\/span><span class=\"o\">);<\/span>\n    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">lastSequenceNumber<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">sequenceNumber<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"n\">lastSequenceNumber<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">...<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AA%D8%AF%D8%A7%D9%88%D9%85\"><\/span>\n<p>  \u062a\u062f\u0627\u0648\u0645<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0634\u0631\u0637 \u0646\u0647\u0627\u06cc\u06cc \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0628\u0627\u0646\u06a9 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u06a9\u0627\u0645\u0644\u0627\u064b \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u060c \u067e\u0627\u06cc\u062f\u0627\u0631\u06cc \u0627\u0633\u062a. \u062f\u0633\u062a\u06af\u0627\u0647 \u062f\u0648\u0644\u062a\u06cc \u0628\u0627\u06cc\u062f \u062f\u0648\u0627\u0645 \u0631\u0627 \u062a\u0636\u0645\u06cc\u0646 \u06a9\u0646\u062f \u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u062f \u06a9\u0647 \u0647\u06cc\u0686 \u062f\u0627\u062f\u0647 \u0627\u06cc \u062f\u0631 \u0647\u0646\u06af\u0627\u0645 \u062a\u0635\u0627\u062f\u0641 \u0627\u0632 \u0628\u06cc\u0646 \u0646\u0645\u06cc \u0631\u0648\u062f. \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0645\u0646 \u062f\u0631 \u0627\u0628\u062a\u062f\u0627 \u0627\u062c\u0632\u0627\u06cc \u0627\u0635\u0644\u06cc RAFT \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0627\u062c\u0631\u0627\u06cc \u062d\u0627\u0641\u0638\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0645 \u060c \u0628\u0639\u062f\u0627\u064b \u067e\u0627\u06cc\u062f\u0627\u0631\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u062f\u06cc\u0633\u06a9 \u0631\u0627 \u062f\u0631 \u0628\u0631 \u06af\u0631\u0641\u062a\u0645. <\/p>\n<p>\u06a9\u0644\u0627\u0633 DB \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0631\u0627 \u062a\u062c\u0633\u0645 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0646 \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062a\u0639\u0628\u06cc\u0647 \u0634\u062f\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u062e\u0648\u062f \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u062f\u0633\u062a\u06af\u0627\u0647 \u062f\u0648\u0644\u062a\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645. \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 RAFT \u060c \u0645\u0646 \u06cc\u06a9 \u067e\u0631\u0648\u0646\u062f\u0647 \u0628\u0627 \u062d\u0645\u0627\u06cc\u062a \u0627\u0632 \u067e\u0631\u0648\u0646\u062f\u0647 \u0648 \u0641\u0642\u0637 \u0636\u0645\u06cc\u0645\u0647 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u0645 \u062a\u0627 \u0627\u0632 \u062f\u0648\u0627\u0645 \u062f\u06cc\u0633\u06a9 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0634\u0648\u062f. <\/p>\n<p>\u0628\u0627 \u0648\u062c\u0648\u062f \u0627\u06cc\u0646 \u0645\u0624\u0644\u0641\u0647 \u0647\u0627 \u060c \u0645\u0646 \u0628\u0647 \u0639\u0646\u0627\u0635\u0631 \u0627\u0633\u0627\u0633\u06cc \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u0627\u0631\u0632\u0634 \u06a9\u0644\u06cc\u062f\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0642\u0627\u06cc\u0642 \u062e\u0648\u062f \u067e\u0631\u062f\u0627\u062e\u062a\u0647 \u0627\u0645. \u0645\u0646 \u0645\u0639\u062a\u0642\u062f\u0645 \u06a9\u0647 \u0627\u062c\u0631\u0627\u06cc \u0645\u0646 \u06a9\u0627\u0645\u0644 \u0646\u06cc\u0633\u062a \u0648 \u0628\u0627\u06cc\u062f \u0634\u0631\u0627\u06cc\u0637 \u0628\u0633\u06cc\u0627\u0631 \u062e\u0633\u062a\u0647 \u06a9\u0646\u0646\u062f\u0647 \u062a\u0631 \u0648 \u0645\u0648\u0627\u0631\u062f \u06af\u0648\u0634\u0647 \u0627\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f \u06a9\u0647 \u0645\u0646 \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0627\u0632 \u0622\u0646\u0647\u0627 \u0622\u06af\u0627\u0647 \u0646\u06cc\u0633\u062a\u0645. \u0631\u0648\u0634\u0647\u0627\u06cc \u0628\u06cc \u0634\u0645\u0627\u0631\u06cc \u0628\u0631\u0627\u06cc \u0627\u0634\u06a9\u0627\u0644\u0627\u062a \u0638\u0631\u06cc\u0641.<\/p>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u0648\u062c\u0648\u062f \u060c \u0627\u06cc\u0646 \u06cc\u06a9 \u0633\u0641\u0631 \u06a9\u0627\u0645\u0644\u0627\u064b \u0647\u06cc\u062c\u0627\u0646 \u0627\u0646\u06af\u06cc\u0632 \u0628\u0648\u062f \u0632\u06cc\u0631\u0627 \u0628\u0647 \u0645\u0646 \u0645\u06cc \u0622\u0645\u0648\u0632\u062f \u06a9\u0647 \u062f\u0631 \u0637\u0631\u0627\u062d\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0647\u0627\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u0645.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u062f\u0631 \u062d\u06cc\u0646 \u062a\u062d\u0635\u06cc\u0644 \u062f\u0631 \u0645\u0635\u0627\u062d\u0628\u0647 \u0647\u0627\u06cc \u0637\u0631\u0627\u062d\u06cc \u0633\u06cc\u0633\u062a\u0645 \u060c \u062f\u0627\u0646\u0634 \u0627\u0633\u0627\u0633\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0645 \u0648 \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0647\u0627\u06cc \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0639\u0644\u0627\u0642\u0647 \u0645\u0646\u062f \u0634\u062f\u0645. \u0628\u0639\u062f \u0627\u0632 \u0628\u0631\u062e\u06cc \u0645\u0637\u0627\u0644\u0639\u0627\u062a \u060c \u0645\u0646 \u0647\u0646\u0648\u0632 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u062a\u0648\u0632\u06cc\u0639 \u0634\u062f\u0647 \u0631\u0627 \u06a9\u0645\u06cc \u0627\u0646\u062a\u0632\u0627\u0639\u06cc \u0648 \u062f\u0633\u062a \u0648 \u0645\u0648\u062c \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0645. \u0628\u0631\u0627\u06cc \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u062a\u062c\u0631\u0628\u0647 \u062f\u0633\u062a\u06cc \u060c \u062a\u0635\u0645\u06cc\u0645 \u06af\u0631\u0641\u062a\u0645 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":108486,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-108485","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/108485","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=108485"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/108485\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/108486"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=108485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=108485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=108485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}