ããã«ã¡ã¯ãHabrïŒ
ç§ã®ååã¯Victor Pryazhnikovã§ããç§ã¯Badoo SRVããŒã ã§åããŠããŸãã ç§ãã¡ã®ããŒã ã¯ããµãŒããŒåŽã®ã¯ã©ã€ã¢ã³ãåãã«å
éšAPIãéçºããã³ãµããŒãããŠããŸããããŒã¿ãã£ãã·ã³ã°ã¯ãç§ãã¡ãæ¯æ¥ééããããšã§ãã
ããã°ã©ãã³ã°ã«ã¯ãååã®äœæãšãã£ãã·ã¥ã®ç¡å¹åãšãããæ¬åœã«è€éãªã¿ã¹ã¯ã2ã€ãããªããšããæèŠããããŸãã é害ã¯é£ãããšã¯èšããŸãããããã£ãã·ã³ã°ã¯é害ããªããŠãããªãåä»ãªããšã®ããã«æããŸãã ãã£ãã·ã¥ã®äœ¿çšãéå§ããåã«ãèããã¹ãããšããããããããŸãã ãã®èšäºã§ã¯ã倧èŠæš¡ã·ã¹ãã ã§ãã£ãã·ã¥ãæäœãããšãã«çºçããå¯èœæ§ã®ããããã€ãã®åé¡ãå®åŒåããããšããŸãã

ãµãŒããŒéã§ãã£ãã·ã¥ãããããŒã¿ãå
±æããåé¡ã䞊åããŒã¿æŽæ°ããã³ãŒã«ãã¹ã¿ãŒãããã·ã¹ãã ã®èª€åäœã«ã€ããŠèª¬æããŸãã ãŸãããããã®åé¡ã®å¯èœãªè§£æ±ºçã説æãããããã®ãããã¯ããã詳现ã«ã«ããŒãããŠããè³æãžã®ãªã³ã¯ãæäŸããŸãã ååãšããŠãã£ãã·ã¥ãšã¯äœããç¹å®ã®ã·ã¹ãã ã®å®è£
ã®è©³çŽ°ã«ã€ããŠã¯èª¬æããŸããã
äœæ¥ãããšããåé¡ã®ã·ã¹ãã ã¯ã¢ããªã±ãŒã·ã§ã³ãããŒã¿ããŒã¹ãããã³ããŒã¿ã®ãã£ãã·ã¥ã§æ§æãããŠãããšæããŸãã ããŒã¿ããŒã¹ã®ä»£ããã«ãä»ã®ãœãŒã¹ã䜿çšã§ããŸãïŒããšãã°ãããçš®ã®ãã€ã¯ããµãŒãã¹ãå€éšAPIïŒã
ãã£ãã·ã¥ãµãŒããŒéã§ããŒã¿ãå
±æãã
ååã«å€§ããªã·ã¹ãã ã§ãã£ãã·ã¥ã䜿çšããå Žåã¯ã䜿çšå¯èœãªãµãŒããŒéã§ãã£ãã·ã¥ãããããŒã¿ãå
±æã§ããããšã確èªããå¿
èŠããããŸãã ããã¯ããã€ãã®çç±ã§å¿
èŠã§ãã
- 倧éã®ããŒã¿ãååšããå¯èœæ§ãããããããã¯1ã€ã®ãµãŒããŒã®ã¡ã¢ãªã«ç©ççã«åãŸããŸããã
- ããŒã¿ã¯éåžžã«é »ç¹ã«èŠæ±ãããå¯èœæ§ãããã1ã€ã®ãµãŒããŒãããããã¹ãŠã®èŠæ±ãåŠçããããšã¯ã§ããŸããã
- ãã£ãã·ã¥ã®ä¿¡é Œæ§ãé«ããå¿
èŠããããŸãã ãã£ãã·ã¥ãµãŒããŒã1ã€ãããªãå Žåãã¯ã©ãã·ã¥ããå Žåãã·ã¹ãã å
šäœããã£ãã·ã¥ãªãã®ãŸãŸã«ãªããããŒã¿ããŒã¹ã®è² è·ã倧å¹
ã«å¢å ããå¯èœæ§ããããŸãã
ããŒã¿ãåå²ããæãæçœãªæ¹æ³ã¯ããã£ãã·ã¥ããŒã«å¿ããŠæ¬äŒŒä¹±æ°çã«ãµãŒããŒçªå·ãèšç®ããããšã§ãã
ãããå®è£
ããããã®ããŸããŸãªã¢ã«ãŽãªãºã ããããŸãã æãç°¡åãªæ¹æ³ã¯ãæ°å€ããŒè¡šçŸïŒCRC32ãªã©ïŒã®æŽæ°é€ç®ã®äœããšããŠããµãŒããŒçªå·ããã£ãã·ã¥ãµãŒããŒã®æ°ã§èšç®ããããšã§ãã
$cache_server_index = crc32($cache_key) % count($cache_servers_list);
ãã®ãããªã¢ã«ãŽãªãºã ã¯ãã¢ãžã¥ã©ãŒããã·ã¥ãšåŒã°ããŸãã ããã§ã¯CRC32ãäŸãšããŠäœ¿çšããŠããŸãã 代ããã«ãä»ã®ããã·ã¥é¢æ°ã䜿çšã§ããŸãããã®çµæããããµãŒããŒæ°ä»¥äžã®æ°ãååŸã§ããçµæã¯ã»ãŒåçã«åæ£ãããŸãã
ãã®æ¹æ³ã¯ç解ãšå®è£
ãç°¡åã§ããµãŒããŒéã§ããŒã¿ãããªãåçã«åæ£ããŸãããé倧ãªæ¬ ç¹ããããŸãïŒãµãŒããŒã®æ°ãå€æŽãããšïŒæè¡çãªåé¡ãæ°ãããµãŒããŒã®è¿œå ã«ããïŒãããŒã®æ®ãã®éšåãå€æŽãããããããã£ãã·ã¥ã®å€§éšåã倱ãããŸãã
ãã®åé¡ãå®èšŒããå°ããªã¹ã¯ãªãããäœæããŸããã
ã¢ãžã¥ã©ãŒããã·ã¥ãšCRC32ã䜿çšããŠã5ã€ã®ãµãŒããŒã«åæ£ããã100äžã®äžæã®ããŒãçæããŸãã 1å°ã®ãµãŒããŒã®é害ãšæ®ãã®4å°ã®ããŒã¿ã®åé
åžããšãã¥ã¬ãŒãããŸãã
ãã®ã倱æãã®çµæãããŒã®çŽ80ïŒ
ãäœçœ®ãå€æŽããŸããã€ãŸãã以éã®èªã¿åãã«ã¯ã¢ã¯ã»ã¹ã§ããªããªããŸãã
åèšããŒæ°ïŒ1,000,000
ç Žçã«ãŠã³ãç¯å²ïŒ4ã5
ããã§æãäžæå¿«ãªããšã¯ã80ïŒ
ãå¶éããããé¢ããŠããããšã§ãã ãµãŒããŒã®æ°ãå¢ãããšããã£ãã·ã¥æ倱ã®å²åã¯å¢ãç¶ããŸãã å¯äžã®äŸå€ã¯è€æ°ã®å€æŽïŒ2ãã4ã9ãã3ãªã©ïŒã§ãããæ倱ã¯éåžžããå°ãªããªããŸããããããã®å Žåãæ¢åã®ãã£ãã·ã¥ã®å°ãªããšãååïŒ
GitHubã«ããŒã¿ãåéãã
ã¹ã¯ãªãããšããã®ããŒãã«ãæç»ããipynbãã¡ã€ã«ãããã³ããŒã¿ãã¡ã€ã«ãæçš¿ããŸããã
ãã®åé¡ã解決ããããã«ãå¥ã®ãã¬ãŒã¯ããŠã³ã¢ã«ãŽãªãºã -
äžè²«æ§ã®ããããã·ã¥ããããŸãã ãã®ã¡ã«ããºã ã®åºæ¬çãªèãæ¹ã¯éåžžã«åçŽã§ããããã§ã¯ãããŒã®ã¹ããããžã®è¿œå ãããã³ã°ãè¿œå ããããã®æ°ã¯ãµãŒããŒã®æ°ã倧å¹
ã«è¶
ããŸãïŒæ°åãŸãã¯ãã以äžã«ãªãå ŽåããããŸãïŒã ã¹ãããèªäœã¯ããµãŒããŒå
šäœã«åæ£ãããŠããŸãã
ãµãŒããŒã®æ°ãå€æŽããŠããã¹ãããã®æ°ã¯å€ãããŸãããããããã®ãµãŒããŒéã®ã¹ãããã®ååžã¯å€ãããŸãã
- ãµãŒããŒã®1ã€ã«é害ãçºçãããšããã®ãµãŒããŒã«å±ããŠãããã¹ãŠã®ã¹ããããæ®ãã®ã¹ãããã«åé
ãããŸãã
- æ°ãããµãŒããŒãè¿œå ããããšãæ¢åã®ãµãŒããŒã®ã¹ãããã®äžéšããµãŒããŒã«è»¢éãããŸãã
éåžžãäžè²«æ§ã®ããããã·ã¥ã®èãæ¹ã¯ããªã³ã°ã䜿çšããŠèŠèŠåãããŸãããªã³ã°ã®åäžã®ç¹ã¯ãã¹ããããŸãã¯ã¹ãããã®ç¯å²ã®å¢çã瀺ããŸãïŒãããã®ã¹ããããå€æ°ããå ŽåïŒã 以äžã¯ãæåã¯4ã€ã®ãµãŒããŒã«åæ£ãããŠããå°æ°ã®ã¹ãããïŒ60ïŒãããç¶æ³ã®åçŽãªååæ£ã®äŸã§ãã

æåã®ããŒãã£ã·ã§ã³ã®å³ã§ã¯ã1ã€ã®ãµãŒããŒã®ãã¹ãŠã®ã¹ããããäžåã«äžŠãã§ããŸãããå®éã«ã¯ããã¯åææ¡ä»¶ã§ã¯ãããŸããã奜ããªããã«é
眮ã§ããŸãã
åã®æ¹æ³ã«å¯Ÿãããã®æ¹æ³ã®äž»ãªå©ç¹ã¯ãããã§ã¯åãµãŒããŒã«1ã€ã®å€ã§ã¯ãªãå
šç¯å²ãããããµãŒããŒã®æ°ãå€ãããšãããŒã®éåžžã«å°ããéšåããããã®éã§åé
åžãããããšã§ãïŒ
k / N
ãããã§
k
ã¯ããŒã®ç·æ°ã
N
ã¯ãµãŒããŒã®æ°ïŒã
ããã·ã¥ã¢ãžã¥ãã®æ¬ åŠãå®èšŒããããã«äœ¿çšããã·ããªãªã«æ»ããšãåãç¶æ³ã§5ã€ã®ãµãŒããŒã®ãã¡ã®1ã€ãïŒåããŠã§ã€ãã§ïŒèœã¡ãæ®ãã®æ倱ã®éã§ããŒãååé
ããããšããç¶æ³ã§ã¯ããã£ãã·ã¥ã®80ïŒ
ã¯ãããŸãããã20ïŒ
ãããããŸããã æåã«ãã¹ãŠã®ããŒã¿ããã£ãã·ã¥ã«ãããããããã¹ãŠãèŠæ±ããããšä»®å®ãããšããã®éãã¯ã調æŽãããããã·ã¥ã䜿çšãããšãããŒã¿ããŒã¹ãžã®èŠæ±ã4åå°ãªããªãããšãæå³ããŸãã
ãã®ã¢ã«ãŽãªãºã ãå®è£
ããã³ãŒãã¯åã®ã³ãŒããããè€éã«ãªãããããã®èšäºã§ã¯èª¬æããŸããã å¿
èŠã«å¿ããŠãç°¡åã«èŠã€ããããšãã§ããŸã-GitHubã«ã¯ãããŸããŸãªèšèªã®
å®è£
ã
å€æ°ãããŸãã
äžè²«æ§ã®ããããã·ã¥ã«å ããŠããã®åé¡ã解決ããæ¹æ³ã¯ä»ã«ããããŸãïŒããšãã°ã
ã©ã³ãããŒããã·ã¥ ïŒããããŸãäžè¬çã§ã¯ãããŸããã
éžæããã¢ã«ãŽãªãºã ã«é¢ä¿ãªã
ãããŒããã·ã¥ã«åºã¥ããŠãµãŒããŒãéžæãããšããŸãæ©èœããªãå ŽåããããŸãã éåžžããã£ãã·ã¥ã«ã¯åãã¿ã€ãã®ããŒã¿ã®ã»ããã¯å«ãŸããŸãããã倧éã®ç°çš®ããŒã¿ïŒãã£ãã·ã¥ãããå€ã¯ã¡ã¢ãªå
ã®ç°ãªãå Žæãå ããç°ãªãé »åºŠã§èŠæ±ãããç°ãªãçææéãç°ãªãæŽæ°ã¬ãŒããç°ãªãã©ã€ãã¿ã€ã ãæã¡ãŸãã ããã·ã¥ã䜿çšããå ŽåãããŒã®è¡ãå
ãæ£ç¢ºã«å¶åŸ¡ããããšã¯ã§ããŸããããŸããçµæãšããŠãä¿åãããããŒã¿ã®éãšãã®èŠæ±ã®æ°ã®äž¡æ¹ã§ãã¹ãã¥ãŒããçºçããå¯èœæ§ããããŸããããã«ãããç°ãªããã£ãã·ã¥ãµãŒããŒã®åäœã倧ããç°ãªããŸãã
ãã®åé¡ã解決ããã«ã¯ãç°çš®ããŒã¿ããµãŒããŒéã§ã»ãŒåäžã«åæ£ãããããã«ãããŒããæ±ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ããµãŒããŒãéžæããããã«ãããŒã§ã¯ãªãã説æãããŠããã¢ãããŒãã®ãããããé©çšããå¿
èŠãããä»ã®ãã©ã¡ãŒã¿ãŒã䜿çšããå¿
èŠããããŸãã ããã¯ãããŒã¿ã¢ãã«ã«äŸåãããããã©ã®ãããªãã©ã¡ãŒã¿ãŒã«ãªããã瀺ããã®ã§ã¯ãããŸããã
ãã®å Žåããã£ãã·ã¥ãããããŒã¿ã®ã»ãšãã©ãã¹ãŠãåããŠãŒã¶ãŒãåç
§ããŠããããããã£ãã·ã¥å
ã®ããŒã¿ãã·ã£ãŒãã£ã³ã°ããããã®ãã©ã¡ãŒã¿ãŒãšããŠãŠãŒã¶ãŒIDã䜿çšããŸãã ããã«ãããããŒã¿ãã»ãŒåçã«åæ£ã§ããŸãã ããã«ãããŒãã¹ãåãåããŸã
multi_get
ã䜿çšããŠãè€æ°ã®ç°ãªãããŒããŠãŒã¶ãŒæ
å ±ãšãšãã«äžåºŠã«ããŒãããæ©èœïŒçŸåšã®ãŠãŒã¶ãŒã®é »ç¹ã«äœ¿çšãããããŒã¿ã®ããªããŒãã§äœ¿çšããŸãïŒã åããŒã®äœçœ®ãåçã«æ±ºå®ãããå ŽåãèŠæ±ããããã¹ãŠã®ããŒãåããµãŒããŒã«å±ããŠãããšããä¿èšŒããªãããããã®ã·ããªãªã§
multi_get
ã䜿çšããããšã¯ã§ããŸããã
ãã¡ããã芧ãã ããïŒ
䞊åããŒã¿æŽæ°ãªã¯ãšã¹ã
次ã®ç°¡åãªã³ãŒããã芧ãã ããã
public function getContactsCountCached(int $user_id) : ?int { $contacts_count = \Contacts\Cache::getContactsCount($user_id); if ($contacts_count !== false) { return $contacts_count; } $contacts_count = $this->getContactsCount($user_id); if (is_null($contacts_count)) { return null; } \Contacts\Cache::setContactsCount($user_id, $contacts_count); return $contacts_count; }
ãã£ãã·ã¥ã«ãªã¯ãšã¹ããããããŒã¿ããªãå Žåã¯ã©ããªããŸããïŒ ã³ãŒãããå€æãããšããã®ããŒã¿ãååŸããã¡ã«ããºã ãéå§ããå¿
èŠããããŸãã ã³ãŒãã1ã€ã®ã¹ã¬ããã§ã®ã¿å®è¡ãããå Žåããã¹ãŠãæ£åžžã«å®è¡ãããŸããããŒã¿ã¯ããŠã³ããŒãããããã£ãã·ã¥ããã次ã®èŠæ±ã§ããããååŸãããŸãã ããããè€æ°ã®äžŠåãããŒã§äœæ¥ããå Žåããã¹ãŠãç°ãªããŸããããŒã¿ã¯äžåºŠã§ã¯ãªãè€æ°ããŒããããŸãã
次ã®ããã«ãªããŸãã
ããã»ã¹No. 2ã§ãªã¯ãšã¹ãã®åŠçãéå§ããæç¹ã§ã¯ããã£ãã·ã¥ã«ã¯ãŸã ããŒã¿ã¯ãããŸããããããã»ã¹No. 1ã§ããŒã¿ããŒã¹ãããã§ã«èªã¿åãããŠããŸãã ãã®äŸã§ã¯ããªã¯ãšã¹ãã¯2ã€ãããªããããåé¡ã¯ããã»ã©æ·±å»ã§ã¯ãããŸããããããã«å€ãã®ãªã¯ãšã¹ããååšããå¯èœæ§ããããŸãã
䞊åããŠã³ããŒãã®æ°ã¯ã䞊åãŠãŒã¶ãŒã®æ°ãšå¿
èŠãªããŒã¿ã®ããŠã³ããŒãã«ãããæéã«ãã£ãŠç°ãªããŸãã
1ç§ããã200ãªã¯ãšã¹ãã®è² è·ã§ãã£ãã·ã¥ã䜿çšããäœããã®æ©èœããããšããŸãã ããŒã¿ã®ããŠã³ããŒãã«50ããªç§ãå¿
èŠãªå Žåããã®æéå
ã«
50 / (1000 / 200) = 10
ãªã¯ãšã¹ããåãåããŸãã
ã€ãŸãããã£ãã·ã¥ãååšããªãå Žåã1ã€ã®ããã»ã¹ãããŒã¿ã®ããŒããéå§ããããŠã³ããŒãäžã«ããã£ãã·ã¥å
ã®ããŒã¿ãåç
§ããã«ããŒããã9ã€ã®ãªã¯ãšã¹ããããã«éä¿¡ãããŸãã
ãã®åé¡ã¯
ãã£ãã·ã¥ã¹ã¿ã³ããšåŒã°ããŸãïŒãã®çšèªã®ãã·ã¢èªã®é¡äŒŒèªã¯èŠã€ãããŸããã§ãããæåéããã¹ã¿ã³ããã£ãã·ã¥ããšç¿»èš³ã§ããŸããèšäºã®åé ã®åçã¯ãã®ã¢ã¯ã·ã§ã³ã®äŸã瀺ããŠããŸãïŒã
ãããã¹ããŒã ïŒããã£ãã·ã¥ãã¹ã¹ããŒã ãïŒãŸãã¯
ç¬ãã€ã«å¹æ ã 解決ããã«ã¯ããã€ãã®æ¹æ³ããããŸãã
åã«ãŠã³ã/ããŒãæäœãéå§ããåã«ããã¯ãã
ãã®ã¡ãœããã®æ¬è³ªã¯ããã£ãã·ã¥ã«ããŒã¿ããªãå ŽåããããããŒãããããã»ã¹ã¯ãä»ã®äžŠåããã»ã¹ãåãããšãã§ããªãããã«ããããã¯ããã£ããã£ããå¿
èŠããããšããããšã§ãã memcachedã®å Žåããããã¯ããæãç°¡åãªæ¹æ³ã¯ããã£ãã·ã¥ãããããŒã¿èªäœãä¿åãããåããã£ãã·ã¥ãµãŒããŒã«ããŒã
è¿œå ããããšã§ãã
ãã®ãªãã·ã§ã³ã䜿çšãããšãããŒã¿ã¯1ã€ã®ããã»ã¹ã§ã®ã¿æŽæ°ãããŸããããã£ãã·ã¥ãæ¬ èœããŠãããããã¯ãååŸã§ããªãã£ãç¶æ³ã«é¥ã£ãããã»ã¹ãã©ãåŠçãããã決å®ããå¿
èŠããããŸãã ãšã©ãŒãŸãã¯ããã©ã«ãå€ãäžãããã°ããåŸ
ã£ãŠãããããŒã¿ã®ååŸãåè©Šè¡ããŸãã
ããã«ãããã¯èªäœã®æéãæ
éã«éžæããå¿
èŠããããŸãããœãŒã¹ããããŒã¿ãããŒããããã£ãã·ã¥ã«å
¥ããããšãä¿èšŒãããŠããå¿
èŠããããŸãã ååã§ãªãå Žåãå¥ã®äžŠåããã»ã¹ãããŒã¿ã®ãªããŒããéå§ããå ŽåããããŸãã äžæ¹ããã®æéãé·ãããŠãããã¯ãåä¿¡ããããã»ã¹ããã£ãã·ã¥ã«ããŒã¿ãæžã蟌ãã§ããã¯ã解é€ããã«åæ¢ããå Žåãä»ã®ããã»ã¹ãããã¯æéãåããåã«ãã®ããŒã¿ãååŸã§ããŸããã
ããã¯ã°ã©ãŠã³ãã®æŽæ°ãåé€ãã
ãã®ã¡ãœããã®äž»ãªã¢ã€ãã¢ã¯ããã£ãã·ã¥ããããŒã¿ãèªã¿åãããã£ãã·ã¥ã«æžã蟌ãããã»ã¹ãåé¢ããããšã§ãã ãªã³ã©ã€ã³ããã»ã¹ã¯ãã£ãã·ã¥ããããŒã¿ãèªã¿åãã ãã§ãããŒãã¯ããŸãããããã¯å¥ã®ããã¯ã°ã©ãŠã³ãããã»ã¹ã§ã®ã¿çºçããŸãã ãã®ãªãã·ã§ã³ã¯ã䞊åããŒã¿æŽæ°ãäžå¯èœã«ããŸãã
ãã®æ¹æ³ã§ã¯ãããŒã¿ããã£ãã·ã¥ã«æžã蟌ãå¥ã®ã¹ã¯ãªãããäœæããã³ç£èŠããèšé²ããããã£ãã·ã¥ã®æå¹æéãšãããæŽæ°ããã¹ã¯ãªããã次ã«éå§ããæéãåæããããã«ãè¿œå ã®ãè²»çšããå¿
èŠã§ãã
Badooã§ãã®ãªãã·ã§ã³ã䜿çšããã®ã¯ãããšãã°ããŠãŒã¶ãŒã®ç·æ°ã®ã«ãŠã³ã¿ãŒã§ããããã«ã€ããŠã¯ããã«èª¬æããŸãã
確ççæŽæ°æ¹æ³
ãããã®ã¡ãœããã®æ¬è³ªã¯ããã£ãã·ã¥å
ã®ããŒã¿ãååšããªãå Žåã ãã§ãªããååšããå Žåã¯ããçšåºŠã®ç¢ºçã§æŽæ°ãããããšã§ãã ããã«ããããã£ãã·ã¥ãããããŒã¿ããè
æãããåã«æŽæ°ããããã¹ãŠã®ããã»ã¹ã§äžåºŠã«å¿
èŠã«ãªããŸãã
ãã®ãããªã¡ã«ããºã ãæ£ããåäœãããã«ã¯ããã£ãã·ã¥ãããããŒã¿ã®æå¹æéã®éå§æã«ãåèšç®ã®ç¢ºçã¯å°ããããåŸã
ã«å¢å ããããšãå¿
èŠã§ãã ããã¯ãææ°ååžã䜿çšãã
XFetchã¢ã«ãŽãªãºã ã䜿çšããŠ
å®çŸã§ããŸãã ãã®å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
function xFetch($key, $ttl, $beta = 1) { [$value, $delta, $expiry] = cacheRead($key); if (!$value || (time() â $delta * $beta * log(rand())) > $expiry) { $start = time(); $value = recomputeValue($key); $delta = time() â $start; $expiry = time() + $ttl; cacheWrite(key, [$value, $delta, $expiry], $ttl); } return $value; }
ãã®äŸã§ã¯ã
$ttl
ã¯ãã£ãã·ã¥å
ã®å€ã®ã©ã€ãã¿ã€ã ã
$delta
ã¯ãã£ãã·ã¥ãããå€ãçæããã®ã«ããã£ãæéã
$expiry
ã¯ãã£ãã·ã¥å
ã®å€ã
$expiry
ã«ãªããŸã§ã®æéã
$beta
ã¯ã¢ã«ãŽãªãºã èšå®ãã©ã¡ãŒã¿ãŒã§ãå€æŽå¯èœãªãã®åã«ãŠã³ãã®ç¢ºçïŒå€ã倧ããã»ã©ããªã¯ãšã¹ãããšã«åã«ãŠã³ããããå¯èœæ§ãé«ããªããŸãïŒã ãã®ã¢ã«ãŽãªãºã ã®è©³çŽ°ãªèª¬æã¯ããã®ã»ã¯ã·ã§ã³ã®çµããã«ãããªã³ã¯ã§ãããã¯ã€ãããŒããŒãOptimal Probabilistic Cache Stampede Preventionãã«ãããŸãã
ãã®ãããªç¢ºççã¡ã«ããºã ã䜿çšããå Žåã䞊åæŽæ°ãé€å€ããããã®å¯èœæ§ãæžããã ãã§ããããšãç解ããå¿
èŠããããŸãã ããããé€å€ããã«ã¯ãè€æ°ã®ã¡ãœãããäžåºŠã«ãã¯ãã¹ãã§ããŸãïŒããšãã°ãæŽæ°ããåã«ããã¯ãè¿œå ããŸãïŒã
ãã¡ããã芧ãã ããïŒ
ã³ãŒã«ãã¹ã¿ãŒããšãã£ãã·ã¥ãŠã©ãŒã ã¢ãã
ãã£ãã·ã¥ã«ååšããªãããšã«ãã倧éããŒã¿æŽæ°ã®åé¡ã¯ãåãããŒã®å€æ°ã®æŽæ°ã ãã§ãªããç°ãªãããŒã®å€æ°ã®åææŽæ°ã«ãã£ãŠãçºçããå¯èœæ§ãããããšã«æ³šæããå¿
èŠããããŸãã ããšãã°ãããã¯ããã£ãã·ã¥ãšåºå®ãã£ãã·ã¥ã©ã€ãã¿ã€ã ã䜿çšããŠæ°ããã人æ°ã®ãããæ©èœãå±éãããšãã«çºçããå¯èœæ§ããããŸãã
ãã®å ŽåãããŒã«ã¢ãŠãçŽåŸã«ããŒã¿ã®ããŒããéå§ããïŒåé¡ã®æåã®å
åïŒããã®åŸãã£ãã·ã¥ã«ç§»åãããã°ããã®éãã¹ãŠãæ£åžžã«ãªããŸãããã£ãã·ã¥ãæéåãã«ãªããšããã¹ãŠã®ããŒã¿ãåã³ããŒããéå§ããããŒã¿ããŒã¹ã®è² è·ãå¢å ããŸãã
ãã®ãããªåé¡ãå®å
šã«æé€ããããšã¯ã§ããŸããããããŒã¿ã®ããŒããæéå
ã«ãã¹ãã¢ãããããšã¯å¯èœã§ããããã«ãããããŒã¿ããŒã¹ã«å¯Ÿããæ¥æ¿ãªæ°ã®äžŠåã¯ãšãªãæé€ã§ããŸãã ãããå®çŸããã«ã¯ãããã€ãã®æ¹æ³ããããŸãã
- æ°æ©èœã®ã¹ã ãŒãºãªçµã¿èŸŒã¿ã ãã®ããã«ã¯ããããå®è¡ã§ããã¡ã«ããºã ãå¿
èŠã§ãã æãç°¡åãªå®è£
ãªãã·ã§ã³ã¯ãããäžéšã®ãŠãŒã¶ãŒã«å«ãŸããæ°ããæ©èœãå±éããåŸã
ã«å¢ãããŠããããšã§ãã ãã®ã·ããªãªã§ã¯ãäžåºŠã«å€§éã®æŽæ°ãè¡ãããããšã¯ãããŸãããæåã¯äžéšã®ãŠãŒã¶ãŒã®ã¿ãæ©èœãå©çšã§ããããã«ãªããå¢å ããã«ã€ããŠãã£ãã·ã¥ãæ¢ã«ããŠã©ãŒã ã¢ããããããŠããããã§ãã
- ããŒã¿ã»ããã®ç°ãªãèŠçŽ ã®ç°ãªã寿åœã ãã®ã¡ã«ããºã ã¯ããã¹ãŠã®æ©èœãå±éãããšãã«çºçããããŒã¯ã«ã·ã¹ãã ãèããããå Žåã«ã®ã¿äœ¿çšã§ããŸãã ãã®ç¹åŸŽã¯ããã£ãã·ã¥ã«ããŒã¿ãæžã蟌ããšããåèŠçŽ ã«ç¬èªã®æå¹æéããããšããäºå®ã«ãããããã«ãããæŽæ°ã·ã£ããã¯ããã®åŸã®æŽæ°ãæéå
ã«é
ä¿¡ããããããã¯ããã«éãã¹ã ãŒãºã«ãªããŸãã ãã®ãããªã¡ã«ããºã ãå®è£
ããæãç°¡åãªæ¹æ³ã¯ããã£ãã·ã¥ã®æå¹æéã«ã©ã³ãã ä¿æ°ãæããããšã§ãã
public function getNewSnapshotTTL() { $random_factor = rand(950, 1050) / 1000; return intval($this->getSnapshotTTL() * $random_factor); }
äœããã®çç±ã§ä¹±æ°ã䜿çšããããªãå Žåã¯ãããã€ãã®ããŒã¿ïŒãŠãŒã¶ãŒIDãªã©ïŒã«åºã¥ããŠããã·ã¥é¢æ°ã䜿çšããŠååŸããæ¬äŒŒä¹±æ°å€ã«çœ®ãæããããšãã§ããŸãã
äŸ
ãå·ããããã£ãã·ã¥ç¶æ³ã
ãšãã¥ã¬ãŒãããå°ããªã¹ã¯ãªãããæžããŸãã
ããã®äžã§ãèŠæ±ããããšãã«ãŠãŒã¶ãŒãèªåã®ããŒã¿ãããŠã³ããŒãããç¶æ³ãåçŸããŸãïŒãã£ãã·ã¥ã«ãªãå ŽåïŒã ãã¡ããããã®äŸã¯åæã§ãããããã§ãã·ã¹ãã ã®åäœã®éããèŠãããšãã§ããŸãã
ããã¯ãåºå®
ïŒfixed_cache_misses_countïŒãšç°ãªã
ïŒrandom_cache_misses_countïŒãã£ãã·ã¥ã©ã€ãã¿ã€ã ãããç¶æ³ã§ã®ããã
ãã¹ã®æ°ã®ã°ã©ãã§ãã

ã©ã¡ãã®å Žåããäœæ¥ã®éå§æã«è² è·ã®ããŒã¯ã¯éåžžã«é¡èã§ãããç䌌ã©ã³ãã ã®æå¹æéã䜿çšãããšãã¯ããã«é«éã«å¹³æ»åãããããšãããããŸãã
ãããããŒ
ãã£ãã·ã¥å
ã®ããŒã¿ã¯ç°çš®ã§ããããã®äžéšã¯éåžžã«é »ç¹ã«èŠæ±ã§ããŸãã ãã®å Žåã䞊è¡ããŠæŽæ°ããããšããã§ããŸããããèªã¿åãå€ã®æ°èªäœãåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã ãã®ãããªããŒã®äŸã¯ããŠãŒã¶ãŒã®ç·æ°ã®ã«ãŠã³ã¿ãŒã§ãïŒ

ãã®ã«ãŠã³ã¿ãŒã¯æãäžè¬çãªããŒã®1ã€ã§ãããéåžžã®ã¢ãããŒãã䜿çšãããšãããã«å¯Ÿãããã¹ãŠã®èŠæ±ã¯1ã€ã®ãµãŒããŒã«éä¿¡ãããŸãïŒããã¯1ã€ã®ããŒã§ãããåãã¿ã€ãã§ã¯ãªãããïŒã ã

ãã®åé¡ã解決ããã«ã¯ã1ã€ã®ãã£ãã·ã¥ãµãŒããŒã§ã¯ãªããäžåºŠã«è€æ°ã®ãã£ãã·ã¥ãµãŒããŒã«ããŒã¿ãæžã蟌ãå¿
èŠããããŸãã ãã®å Žåããã®ããŒã®èªã¿åãåæ°ãæ°åæžãããŸãããæŽæ°ãšãµãŒããŒéžæã³ãŒããè€éã«ãªããŸããçµå±ãå¥ã®ã¡ã«ããºã ã䜿çšããå¿
èŠããããŸãã
Badooã§ã¯ããã¹ãŠã®ãã£ãã·ã¥ãµãŒããŒã«ããŒã¿ãäžåºŠã«æžã蟌ãããšã§ãã®åé¡ã解決ããŠããŸãã ãã®ãããèªã¿åãæã«ã¯ãäžè¬çãªãµãŒããŒéžæã¡ã«ããºã ã䜿çšã§ããŸããã³ãŒãã§ã¯ãéåžžã®ãŠãŒã¶ãŒIDã·ã£ãŒãã£ã³ã°ã¡ã«ããºã ã䜿çšã§ããŸããèªã¿åãæã«ã¯ããã®ãããããŒã®è©³çŽ°ã«ã€ããŠç¥ãå¿
èŠã¯ãããŸããã ç§ãã¡ã®å ŽåããµãŒããŒãæ¯èŒçå°ãªãããïŒãµã€ããããçŽ10å°ïŒãããã¯æ©èœããŸãã
ãã£ãã·ã³ã°ãµãŒããŒãããã«å€ãå Žåããã®æ¹æ³ã¯æã䟿å©ã§ã¯ãªãå¯èœæ§ããããŸããåãããŒã¿ãäœçŸåãè€è£œããã®ã¯æå³ããããŸããã ãã®å Žåããã¹ãŠã®ãµãŒããŒã§ã¯ãªãããµãŒããŒåŽã§ã®ã¿ããŒãè€è£œããããšãå¯èœã§ããããã®ãªãã·ã§ã³ã«ã¯ããå°ãæéãããããŸãã
ãã£ãã·ã¥ããŒã«ãããµãŒããŒå®çŸ©ã䜿çšããå Žåãéãããæ°ã®æ¬äŒŒã©ã³ãã å€ãè¿œå ã§ããŸãïŒ
total_users_count_2
t
otal_users_count_1
ã
total_users_count_2
ãªã©ãäœæããããšã«ããïŒã åæ§ã®ã¢ãããŒãããããšãã°Etsyã§äœ¿çšãããŠããŸãã
ã·ã£ãŒãã£ã³ã°ãã©ã¡ãŒã¿ãŒã«æ瀺çãªæ瀺ã䜿çšããå Žåã¯ãç°ãªãæ¬äŒŒä¹±æ°å€ãæž¡ãã ãã§ãã
äž¡æ¹ã®æ¹æ³ã®äž»ãªåé¡ã¯ãç°ãªãå€ãå®éã«ç°ãªããã£ãã·ã¥ãµãŒããŒã«éãããããšã確èªããããšã§ãã
ãã¡ããã芧ãã ããïŒ
æ©èœäžå
š
ã·ã¹ãã ã¯100ïŒ
ä¿¡é Œã§ãããã®ã§ã¯ãªããããé害ãçºçããå Žåã®åäœãèæ
®ããå¿
èŠããããŸãã é害ã¯ããã£ãã·ã¥èªäœãšããŒã¿ããŒã¹ã®äž¡æ¹ã§çºçããå¯èœæ§ããããŸãã
åã®ã»ã¯ã·ã§ã³ã§
ãã£ãã·ã¥ã®é害ã«ã€ããŠæ¢ã«èª¬æããŸããã è¿œå ã§ããå¯äžã®ããšã¯ã皌åäžã®ã·ã¹ãã ã§æ©èœã®äžéšãç¡å¹ã«ããå¯èœæ§ãäºèŠããããšã§ãã ããã¯ãã·ã¹ãã ãããŒã¯è² è·ã«å¯ŸåŠã§ããªãå Žåã«åœ¹ç«ã¡ãŸãã
ããŒã¿ããŒã¹ã«é害ãçºçãããã£ãã·ã¥ããªãå Žåããã£ãã·ã¥ã¹ã¿ã³ãã®ç¶æ³ã«é¥ãããšããããŸããããã«ã€ããŠã¯ãåã«èª¬æããŸããã ãã§ã«èª¬æããæ¹æ³ã§çµäºããããæå³ããªã誀ã£ãå€ãçã寿åœã§ãã£ãã·ã¥ã«æžã蟌ãããšãã§ããŸãã ãã®å Žåãã·ã¹ãã ã¯ãœãŒã¹ã䜿çšäžå¯ã§ãããšå€æã§ãããã°ããã®éãããŒã¿ãèŠæ±ããããšããã®ãåæ¢ããŸãã
ãããã«
ãã®èšäºã§ã¯ããã£ãã·ã¥ãæäœããéã®äž»ãªåé¡ã«ã€ããŠè§ŠããŸãããããã以å€ã«ãå€ãã®åé¡ãããããã®äŒè©±ãéåžžã«é·ãç¶ããããšãã§ãããšç¢ºä¿¡ããŠããŸãã ç§ã®èšäºãèªãã åŸããã£ãã·ã¥ãããå¹ççã«ãªãããšãé¡ã£ãŠããŸãã