![](https://habrastorage.org/getpro/habr/post_images/d88/dd7/f7d/d88dd7f7d1ef3c461a37c1d14998685d.png)
äœçŸäžäººãã®ãŠãŒã¶ãŒãæ¯æäœååãã®ã¡ãã»ãŒãžãDiscordã«éä¿¡ããŠããŸã ã ãããã®æçš¿ã§ã®æ€çŽ¢ã¯ãç§ãã¡ãè¡ã£ãæããªã¯ãšã¹ãã®å€ãæ©èœã®1ã€ã«ãªããŸããã æ€çŽ¢ããŠã¿ãŸãããïŒ
å¿ èŠæ¡ä»¶
- è²»çšå¯Ÿå¹æã®é«ãïŒ Discordãšã®äž»ãªãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã¯ãããã¹ããã£ãããšãã€ã¹ãã£ããã§ãã æ€çŽ¢ã¯è£å©çãªæ©èœã§ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®ã³ã¹ãã¯ãããåæ ããå¿ èŠããããŸãã çæ³çã«ã¯ãããã¯ãæ€çŽ¢ã«å®éã®ã¡ãã»ãŒãžã®ä¿åãããè²»çšãããããªãããšãæå³ããŸãã
- é«éã§çŽæçïŒäœæãããã¹ãŠã®æ©èœã¯ãæ€çŽ¢ãå«ããé«éã§çŽæçã§ãªããã°ãªããŸããã ããã¯æé«æ°Žæºã«èŠããã¯ãã§ãã
- èªå·±ä¿®åŸ©ïŒïŒãŸã ïŒDevOpséšéããªããããæ€çŽ¢ã¯ã人ã®ä»å ¥ãæå°éã«æãããããŸãã¯ãŸã£ããä»å ¥ããã«é害ã«èããããšãã§ããªããã°ãªããŸããã
- ç·åœ¢ã«ã¹ã±ãŒã©ãã«ïŒã¡ãã»ãŒãžã¹ãã¬ãŒãžãšåæ§ã«ãæ€çŽ¢ã€ã³ãã©ã¹ãã©ã¯ãã£ã®å®¹éãå¢ããã«ã¯ãããŒããè¿œå ããå¿ èŠããããŸã ã
- ã¬ã€ãžãŒã€ã³ããã¯ã¹äœæïŒãã¹ãŠã®ãŠãŒã¶ãŒãæ€çŽ¢ã䜿çšããããã§ã¯ãããŸããã誰ããå°ãªããšã1åæ€çŽ¢ãè©Šã¿ããŸã§ãã¡ãã»ãŒãžã®ã€ã³ããã¯ã¹ãäœæããªãã§ãã ããã ããã«ãã€ã³ããã¯ã¹ãã¯ã©ãã·ã¥ããåŸããã®å Žã§ãµãŒããŒã®ã€ã³ããã¯ã¹ãåäœæã§ããããã«ããå¿ èŠããããŸãã
ãã®ãããªèŠä»¶ãèŠãŠãç§ãã¡ã¯2ã€ã®éèŠãªè³ªåãããŸããã
Q.管çãããSaaSã«æ€çŽ¢ãéä¿¡ã§ããŸããïŒ ïŒç°¡åãªè§£æ±ºçïŒ
ãããã 調æ»ãããã¹ãŠã®ãããŒãžãæ€çŽ¢ãœãªã¥ãŒã·ã§ã³ã¯ããã®æ©èœã®äºç®ã®ç¯å²å€ïŒå€©æåŠçãªéïŒã§ãã ããã«ãç§ãã¡ã®ã¹ã¿ããã¯ãããŒã¿ã»ã³ã¿ãŒã®å€éšã«ã¡ãã»ãŒãžãéä¿¡ãããšããèããå®éã«å«ã£ãŠããŸãã ãªã¹ã¯ãèªèããŠããŠãŒã¶ãŒã¡ãã»ãŒãžã®ã»ãã¥ãªãã£ãå¶åŸ¡ãããµãŒãããŒãã£ã«ãããä¿¡é Œããªãããã«ããŸãã
Q.é©åãªãªãŒãã³ãœãŒã¹æ€çŽ¢ãœãªã¥ãŒã·ã§ã³ã¯ãããŸããïŒ
ããããïŒ ç§ãã¡ã¯ãã¹ãŠãç 究ããçãè°è«ã®åŸãElasticsearchãšSolrã®éžæã«ããã«è³ããŸãããäž¡æ¹ã®ã·ã¹ãã ãç§ãã¡ã®ã±ãŒã¹ã«éåžžã«é©ããŠããããã§ãã Elasticsearchã«ã¯æ¬¡ã®å©ç¹ããããŸããã
- Solrã§ã®ããŒãæ€åºã«ã¯ãZooKeeperãå¿ èŠã§ãã Etcdã¯ç§ãã¡ã®ããã«æ©èœããŸãããSolrå°çšã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãå¢ãããããããŸããã§ããã ãã ããElasticsearchã®Zen Discoveryã¯èªçµŠèªè¶³ã§ãã
- Elasticsearchã¯ãã·ã£ãŒããã©ã³ã¹ã®èªå埩å ããµããŒãããŸããããã«ãããã¯ã©ã¹ã¿ãŒã«æ°ããããŒããè¿œå ã§ãããããç·åœ¢æ¡åŒµæ§ã®èŠä»¶ããããã«ãæºããããšãã§ããŸãã
- Elasticsearchã«ã¯ã¯ãšãªçšã®æ§é åDSLãçµã¿èŸŒãŸããŠããŸãããããã§ãªããã°ãSolrã¯ãµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšããŠããã°ã©ã ã§ã¯ãšãªæååãäœæããå¿ èŠããããŸãã
- åœç€Ÿã®ãšã³ãžãã¢ã¯ãElasticsearchã®çµéšãè±å¯ã§ãã
![](https://habrastorage.org/getpro/habr/post_images/0c8/350/26c/0c835026c9720d02e4e1565f21c8303c.png)
Elasticsearchã¯æ©èœããŸããïŒ
Elasticsearchã¯ç§ãã¡ã®ãã¹ãŠã®èŠä»¶ã«é©åããããã§ããããšã³ãžãã¢ã¯ãããæ±ã£ãçµéšããããŸãã ç°ãªãããŒãéã§ããŒã¿ãã¬ããªã±ãŒãããŠåããŒãã®é害ã«èããæ°ããããŒããè¿œå ããããšã§ã¯ã©ã¹ã¿ãŒãæ¡åŒµããã€ã³ããã¯ã¹äœæã®ããã®ã¡ãã»ãŒãžããããŸãªã飲ã¿èŸŒãããšãã§ããŸãã ãããããã®ãããã¯ãç 究ããŠãããšã倧èŠæš¡ãªElasticsearchã¯ã©ã¹ã¿ãŒã®ç®¡çã«é¢ããæããã話ãèŠã€ãããŸãããå®éããã°åŠçã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãé€ããããã¯ãšã³ãã°ã«ãŒãã¯ã¯ã©ã¹ã¿ãŒElasticsearchã®ç®¡ççµéšããããŸããã§ããã
ããã°ã倧ããªã¯ã©ã¹ã¿ãŒã®åé¡ãåé¿ãããã£ããããããã§ã¯ãå°ããªElasticsearchã¯ã©ã¹ã¿ãŒã®ããŒã«å ã®ã¡ãã»ãŒãžã«ã€ã³ããã¯ã¹ãä»ããããã«ãã·ã£ãŒãã£ã³ã°ãšã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒãžã®ã«ãŒãã£ã³ã°ãå§ä»»ãããšããã¢ã€ãã¢ãçãŸããŸããã ããã¯ãæ€çŽ¢ã®ããã«1ã€ã®ã¯ã©ã¹ã¿ãŒããªãã«ãªã£ãŠããå Žåãå»æ¢ãããã¯ã©ã¹ã¿ãŒã«ããDiscordã¡ãã»ãŒãžã®äžéšã®ã¿ã«ã¢ã¯ã»ã¹ã§ããªããªãããšãæå³ããŸãã ãŸããã¯ã©ã¹ã¿ãŒå šäœã®ããŒã¿ã埩å ã§ããªãå Žåã¯ãã¯ã©ã¹ã¿ãŒå šäœã®ããŒã¿ãæåŠãã䟿å©ãªæ©äŒãæäŸããŸãïŒã·ã¹ãã ã¯ããŠãŒã¶ãŒãæ€çŽ¢ãè©Šã¿ããšããã«ãµãŒããŒããŒã¿ã®é 延ã€ã³ããã¯ã¹ãåäœæããŸãïŒã
ã³ã³ããŒãã³ã
Elasticsearchã¯ã倧éã®ããã¥ã¡ã³ãã®ã€ã³ããã¯ã¹äœæã倧奜ãã§ã ã ã€ãŸããã¡ãã»ãŒãžã¯ãªã¢ã«ã¿ã€ã ã§å ¬éããããããã€ã³ããã¯ã¹ãäœæã§ããŸããã 代ããã«ãã¯ãŒã«ãŒãã¡ãã»ãŒãžãã³ãã«ããã£ããã£ããããããåäžã®æäœã§ã€ã³ããã¯ã¹ä»ããããã¥ãŒãèšèšããŸããã ã¡ãã»ãŒãžã®å ¬éãšæ€çŽ¢å¯èœæ§ã®éã®ããããªé 延ã¯åççãªå¶éã§ãããšå€æããŸããã æçµçã«ãã»ãšãã©ã®ãŠãŒã¶ãŒã¯ãèªåã®èšã£ãããšã ãã§ãªããéå»ã«å ¬éãããæçš¿ãæ¢ããŸãã
![](https://habrastorage.org/getpro/habr/post_images/36b/efb/a99/36befba991a988388443af4e0068df70.png)
åä¿¡åŽã§ã¯ãããã€ãã®ããšãè¡ãå¿ èŠããããŸããã
- ã¡ãã»ãŒãžãã¥ãŒïŒãã¹ãŠã®ã¡ãã»ãŒãžããªã³ã©ã€ã³ã§å ¬éããããšãã«å°çãããã¥ãŒãäœæããå¿ èŠããããŸããïŒã¯ãŒã«ãŒããŒã«ã«ãã解æã®ããïŒã
- ã€ã³ããã¯ã¹äœæã¯ãŒã«ãŒïŒå®éã®ã«ãŒãã£ã³ã°ãè¡ãããã¥ãŒããElasticsearchã«äžæ¬æ¿å ¥ããã¯ãŒã«ãŒã
ãã§ã«Celeryã«åºã¥ããŠãã¥ãŒã€ã³ã°ã·ã¹ãã ãäœæããŠããããããããå±¥æŽã€ã³ããã¯ã¹äœæã¯ãŒã«ãŒã«äœ¿çšããŸããã
- å±¥æŽã€ã³ããã¯ã¹ã¯ãŒã«ãŒïŒç¹å®ã®ãµãŒããŒäžã®ã¡ãã»ãŒãžå±¥æŽãå埩åŠçããElasticsearchã€ã³ããã¯ã¹ã«æ¿å ¥ããããšãã¿ã¹ã¯ãšããã¯ãŒã«ãŒã
ãŸããElasticsearchã¯ã©ã¹ã¿ãŒãšåDiscordãµãŒããŒã®ã¡ãã»ãŒãžã®ã€ã³ããã¯ã¹ãå±ããã·ã³ãã«ã§è¿ éãªãããã³ã°ãå¿ èŠã§ããã ãã®ãã¢ããã¯ã©ã¹ã¿ãŒ+ã€ã³ããã¯ã¹ãã·ã£ãŒããšåŒã³ãŸããïŒã€ã³ããã¯ã¹å ã®ãã€ãã£ãã®Elasticsearchã·ã£ãŒããšæ··åããªãã§ãã ããïŒ ã äœæãããããã³ã°ã·ã¹ãã ã¯ã2ã€ã®ã¬ã€ã€ãŒã§æ§æãããŠããŸãã
- ã·ã£ãŒãã®æ°žç¶ãããã³ã°ïŒæ°žç¶ããŒã¿ã®ã¡ã€ã³ã¹ãã¬ãŒãžã§ããCassandraã«åç §ãšããŠé 眮ãããŸããã
- ã·ã£ãŒããããã³ã°ãã£ãã·ã¥ïŒã¯ãŒã«ãŒãã¡ãã»ãŒãžãåŠçããå ŽåãCassandraã«ã·ã£ãŒãã«é¢ããã¯ãšãªãå®è¡ããã®ã¯æéãããããŸãã ãããã®ã«ãŒããRedisã«ãã£ãã·ã¥ããã®ã§ã mgetæäœãå®è¡ããŠãã¡ãã»ãŒãžã®ã«ãŒãã£ã³ã°å ããã°ããèŠã€ããããšãã§ããŸãã
ãµãŒããŒã«åããŠã€ã³ããã¯ã¹ãäœæããå Žåã¯ããã®DiscordãµãŒããŒããã¡ãã»ãŒãžãéä¿¡ããã·ã£ãŒããéžæããå¿ èŠããããŸãã ã·ã£ãŒãã¯ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®æœè±¡åã§ãããããã·ã£ãŒããããç¥çã«é åžããããšãå¯èœã«ãªããŸãã Redisã®ãã¯ãŒã䜿çšããŠããœãŒããããã»ããã䜿çšããŠè² è·å¯Ÿå¿ã·ã£ãŒããã£ã¹ãã³ãµãŒãäœæããŸããã
- ã·ã£ãŒããã£ã¹ãã³ãµãŒïŒ Redisã§äžŠã¹æ¿ããããã»ããã䜿çšããŠãè² è·ã«äžèŽããè©äŸ¡ãæã€ã·ã£ãŒãã®ã»ãããä¿åããŸãã æãè¿ãååžã§ã¯ãæãäœãè©äŸ¡ã®ã·ã£ãŒãã«å¯Ÿå¿ããã·ã£ãŒããéžæãããŸãã ãã®ã¹ã³ã¢ã¯ååžããšã«å¢å ããElasticsearchã§ã€ã³ããã¯ã¹ãäœæããåŸã®åæçš¿ã«ã¯ããã®ã·ã£ãŒãã®ã¹ã³ã¢ãå¢å ããããã£ã³ã¹ããããŸãã ã·ã£ãŒãå ã®ããŒã¿ãå€ãã»ã©ãæ°ããDiscordãµãŒããŒãé åžããæ©äŒãå°ãªããªããŸãã
ãã¡ãããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ã¯ã©ã¹ã¿ãŒãšãã¹ãæ€åºã·ã¹ãã ããªããã°ãæ€çŽ¢ã€ã³ãã©ã¹ãã©ã¯ãã£å šäœã¯å®å šã«ã¯ãªããŸããã
- etcdïŒã·ã¹ãã ã®ä»ã®éšåã¯etcdã䜿çšããŠãµãŒãã¹ãæ€åºãããããElasticsearchã¯ã©ã¹ã¿ãŒã«é©çšããŸããã ã¯ã©ã¹ã¿ãŒå ã®ããŒãèªäœã¯ãã·ã¹ãã ã®æ®ãã®éšåã§etcdã§èªèº«ã宣èšã§ãããããElasticsearchããããžãŒãå³å¯ã«åŒ·åããå¿ èŠã¯ãããŸããã
æçµçã«ã顧客ãæ¬åœã«ã¡ãã»ãŒãžãæ¢ãããšãã§ããããã«ããå¿ èŠããããŸããã
- Search APIïŒãŠãŒã¶ãŒããã®ãªã¯ãšã¹ããéä¿¡ããããœãããŠã§ã¢ã€ã³ã¿ãŒãã§ã€ã¹ã ãŠãŒã¶ãŒãã¢ã¯ã»ã¹æš©ãæã€ã¡ãã»ãŒãžã®ã¿ãæ€çŽ¢ã§ããããã«ããã¹ãŠã®ã¢ã¯ã»ã¹èš±å¯ãã§ãã¯ãå®è£ ããå¿ èŠããããŸããã
![](https://habrastorage.org/files/df0/e82/05b/df0e8205b23d4a93abcd91757862c37f.png)
ããŒã¿ã®ã€ã³ããã¯ã¹äœæãšãããã³ã°
Elasticsearchã®éåžžã«é«ãã¬ãã«ã«ã¯ããã€ã³ããã¯ã¹ããšããæŠå¿µãããããã®äžã«ãã·ã£ãŒããããããŸãã ãã®å Žåãã·ã£ãŒãã¯Luceneã€ã³ããã¯ã¹ã§ãã Elasticsearchã¯ããã®ã€ã³ããã¯ã¹ã«å±ããã·ã£ãŒãã®åã«ã€ã³ããã¯ã¹å ã®ããŒã¿ãé åžãã責任ããããŸãã å¿ èŠã«å¿ããŠããã«ãŒãã£ã³ã°ããŒãã䜿çšããŠãã·ã£ãŒãéã§ã®ããŒã¿ã®åæ£æ¹æ³ãå¶åŸ¡ã§ããŸãã ã€ã³ããã¯ã¹ã«ã¯ããã¬ããªã±ãŒã·ã§ã³ä¿æ°ããä¿åãããŸããããã¯ãã€ã³ããã¯ã¹ïŒããã³ãã®äžã®ã·ã£ãŒãïŒãè€è£œããå¿ èŠãããããŒãã®æ°ãæå³ããŸãã ã€ã³ããã¯ã¹ãé 眮ãããŠããããŒãã«é害ãçºçããå Žåãè€è£œãããã³ããŒãè² æ ãè² ããŸãã ïŒã¡ãªã¿ã«ããããã®ã³ããŒã¯æ€çŽ¢ã¯ãšãªã«ã察å¿ã§ãããããè€è£œãããã³ããŒãè¿œå ããããšã§æ€çŽ¢ã¹ã«ãŒããããæ¡å€§ã§ããŸãïŒã
ãã¹ãŠã®ã·ã£ãŒãããžãã¯ãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ïŒã·ã£ãŒãïŒã«è»¢éãããããElasticsearchåŽã®ã·ã£ãŒãã£ã³ã°ã¯å®éã«ã¯æå³ããããŸããã§ããã ãã ããããã䜿çšããŠãã¯ã©ã¹ã¿ãŒå ã®ããŒãéã§ã€ã³ããã¯ã¹ãè€è£œããã³ãã©ã³ã¹èª¿æŽã§ããŸãã Elasticsearchãæ£ããèšå®ã䜿çšããŠèªåçã«ã€ã³ããã¯ã¹ãäœæããããã«ãã€ã³ããã¯ã¹èšå®ãšããŒã¿ãããã³ã°ãå«ãã€ã³ããã¯ã¹ãã³ãã¬ãŒãã䜿çšããŸããã ã€ã³ããã¯ã¹ã®èšå®ã¯éåžžã«ç°¡åã§ãïŒ
- ã€ã³ããã¯ã¹ã«ã¯ã·ã£ãŒãã1ã€ã ãå«ããå¿ èŠããããŸãïŒã·ã£ãŒãã£ã³ã°ã¯è¡ããªãã§ãã ããïŒ
- ã€ã³ããã¯ã¹ã¯1ã€ã®ããŒãã«è€è£œããå¿ èŠããããŸãïŒã€ã³ããã¯ã¹ãä¿æããã¡ã€ã³ããŒãã®é害ã«èããïŒ
- ã€ã³ããã¯ã¹ã¯60åããšã«æŽæ°ããå¿ èŠããããŸãïŒãããè¡ãå¿ èŠãããã®ã¯ã以äžã§èª¬æããŸãïŒ
- ã€ã³ããã¯ã¹ã«ã¯ãåäžã®ããã¥ã¡ã³ãã¿ã€ãïŒ
message
ãå«ãŸãmessage
Elasticsearchã«å ã®ã¡ãã»ãŒãžããŒã¿ãä¿åããã®ã¯ããŸãæå³ããããŸããããã®åœ¢åŒã®ããŒã¿ã®ã¡ãã»ãŒãžã¯æ€çŽ¢ãé£ããããã§ãã 代ããã«ãåã¡ãã»ãŒãžãååŸããŠãæ€çŽ¢çšã«ã€ã³ããã¯ã¹ä»ãã§ããã¡ã¿ããŒã¿ãæã€ãã£ãŒã«ãã®ã»ããã«å€æããããšã«ããŸããã
INDEX_TEMPLATE = { 'template': 'm-*', 'settings': { 'number_of_shards': 1, 'number_of_replicas': 1, 'index.refresh_interval': '3600s' }, 'mappings': { 'message': { '_source': { 'includes': [ 'id', 'channel_id', 'guild_id' ] }, 'properties': { # This is the message_id, we index by this to allow for greater than/less than queries, so we can search # before, on, and after. 'id': { 'type': 'long' }, # Lets us search with the "in:#channel-name" modifier. 'channel_id': { 'type': 'long' }, # Lets us scope a search to a given server. 'guild_id': { 'type': 'long' }, # Lets us search "from:Someone#0001" 'author_id': { 'type': 'long' }, # Is the author a user, bot or webhook? Not yet exposed in client. 'author_type': { 'type': 'byte' }, # Regular chat message, system message... 'type': { 'type': 'short' }, # Who was mentioned, "mentions:Person#1234" 'mentions': { 'type': 'long' }, # Was "@everyone" mentioned (only true if the author had permission to @everyone at the time). # This accounts for the case where "@everyone" could be in a message, but it had no effect, # because the user doesn't have permissions to ping everyone. 'mention_everyone': { 'type': 'boolean' }, # Array of [message content, embed title, embed author, embed description, ...] # for full-text search. 'content': { 'type': 'text', 'fields': { 'lang_analyzed': { 'type': 'text', 'analyzer': 'english' } } }, # An array of shorts, specifying what type of media the message has. "has:link|image|video|embed|file". 'has': { 'type': 'short' }, # An array of normalized hostnames in the message, traverse up to the domain. Not yet exposed in client. # "http://foo.bar.com" gets turned into ["foo.bar.com", "bar.com"] 'link_hostnames': { 'type': 'keyword' }, # Embed providers as returned by oembed, ie "Youtube". Not yet exposed in client. 'embed_providers': { 'type': 'keyword' }, # Embed type as returned by oembed. Not yet exposed in client. 'embed_types': { 'type': 'keyword' }, # File extensions of attachments, ie "fileType:mp3" 'attachment_extensions': { 'type': 'keyword' }, # The filenames of the attachments. Not yet exposed in client. 'attachment_filenames': { 'type': 'text', 'analyzer': 'simple' } } } } }
äžé£ã®ãã£ãŒã«ãã«ã¿ã€ã ã¹ã¿ã³ããå«ãŸããŠããªãããšã«æ°ä»ããããããŸããã ååã®æçš¿ããèŠããŠããå ŽåãIDã¯Snowflake圢åŒã§äœæãããŸããã€ãŸããæ¬è³ªçã«ã¿ã€ã ã¹ã¿ã³ããå«ã¿ãŸãã察å¿ããIDç¯å²ïŒã
ãã ãããããã®ãã£ãŒã«ãã¯Elasticsearchã®ãã®åœ¢åŒã§ã¯ãä¿åããããã é玢åŒã«ã®ã¿ä¿åãããŸã ã å®éã«ä¿åããã³è¿ããããã£ãŒã«ãã¯ãã¡ãã»ãŒãžããã£ãã«ãããã³ã¡ãã»ãŒãžãæçš¿ããããµãŒããŒIDã®ã¿ã§ãã ããã¯ãElasticsearchã§ã¡ãã»ãŒãžããŒã¿ãè€è£œãããªãããšãæå³ããŸãã ãã¬ãŒããªãã¯ãæ€çŽ¢çµæãè¿ããšãã«CassandraããããŒã¿ãåéããå¿ èŠãããããšã§ãããããã¯çµ¶å¯Ÿã«æ£åžžã§ãããããã®å ŽåããCassandraããã¡ãã»ãŒãžã³ã³ããã¹ãïŒååŸã«2ã€ã®ã¡ãã»ãŒãžïŒãååŸããŠã€ã³ã¿ãŒãã§ã€ã¹ã«è¡šç€ºããå¿ èŠãããããã§ãã Elasticsearchã®å€éšã«å®éã®ã¡ãã»ãŒãžãªããžã§ã¯ããä¿åãããšãè¿œå ã®ãã£ã¹ã¯é åãè²»ããå¿ èŠããªããªããŸãã ãã ããããã¯ãElasticsearchã䜿çšããŠæ€çŽ¢çµæã®äžèŽã匷調衚瀺ã§ããªãããšãæå³ããŸãã äžèŽã匷調衚瀺ããã«ã¯ãã¯ã©ã€ã¢ã³ãããã°ã©ã ã«ããŒã¯ã³ãšèšèªã¢ãã©ã€ã¶ãŒãåã蟌ãå¿ èŠããããŸãïŒããã¯éåžžã«ç°¡åã§ããïŒã
å®è£
æ€çŽ¢ã«ã¯ãã€ã¯ããµãŒãã¹ã¯ããããå¿ èŠãªããšå€æããŸããã代ããã«ãã«ãŒãã£ã³ã°ãšã¯ãšãªããžãã¯ãã©ããããElasticsearchã®ã©ã€ãã©ãªãã»ããã¢ããããŸããã è¿œå ã®ãµãŒãã¹ã®ã¿ãèµ·åããå¿ èŠããããŸãã-ãããã¯ã€ã³ããã¯ã¹äœæã¯ãŒã«ãŒã§ãïŒãã®ã©ã€ãã©ãªã䜿çšããŠå®éã®ã€ã³ããã¯ã¹äœæäœæ¥ãè¡ããŸãïŒã ããŒã ã®ä»ã®ã¡ã³ããŒåãã«èšå®ãããããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã®äžéšãæå°éã§ãã£ããããç¬èªã®ãµãŒãã¹ã«åãæ¿ããå¿ èŠãããå Žåã¯ãRPCã¬ã€ã€ãŒã«ç°¡åã«ã©ããã§ããŸããã ã©ã€ãã©ãªã¯APIã¯ãŒã«ãŒã«ã€ã³ããŒãã§ããå®éã«æ€çŽ¢ã¯ãšãªãå®è¡ããHTTPçµç±ã§ãŠãŒã¶ãŒã«çµæãè¿ãããšãã§ããŸãã
ã³ãã³ãã®æ®ãã®éšåã§ã¯ãã©ã€ãã©ãªã¯ã¡ãã»ãŒãžãæ€çŽ¢ããããã®æå°éã®éšåã衚瀺ããŸãã
results = router.search(SearchQuery( guild_id=112233445566778899, content="hey jake", channel_ids=[166705234528174080, 228695132507996160] )) results_with_context = gather_results(results, context_size=2)
ã€ã³ããã¯ã¹äœæãŸãã¯åé€ã®ããã«ã¡ãã»ãŒãžããã¥ãŒã«å ¥ããïŒ
# When a message was created or updated: broker.enqueue_message(message) # When a message was deleted: broker.enqueue_delete(message)
ã¯ãŒã«ãŒã«ããïŒã»ãŒïŒãªã¢ã«ã¿ã€ã ã®ã¡ãã»ãŒãžã®äžæ¬ã€ã³ããã¯ã¹äœæïŒ
def gather_messages(num_to_gather=100): messages = [] while len(messages) < num_to_gather: messages.append(broker.pop_message()) return messages while True: messages = gather_messages() router.index_messages(messages)
ãµãŒããŒäžã®å€ãã¡ãã»ãŒãžã®ã€ã³ããã¯ã¹ãäœæããããã«ãå±¥æŽã€ã³ããã¯ã¹äœæã¿ã¹ã¯ãäœæãããŸããããã¯ãäœæ¥åäœãå®è£ ãããã®ãµãŒããŒã®ã€ã³ããã¯ã¹äœæãç¶è¡ããæ°ããã¿ã¹ã¯ãäœæããŸãã åã¿ã¹ã¯ã¯ããµãŒããŒã¡ãã»ãŒãžå±¥æŽå ã®å Žæãžã®ãã€ã³ã¿ãŒã§ãããã€ã³ããã¯ã¹ããªã¥ãŒã ã®åºå®åäœã§ãïŒãã®å Žåãããã©ã«ãã¯500ã¡ãã»ãŒãžã§ãïŒã ãžã§ãã¯ãã€ã³ããã¯ã¹äœæã®ããã«ã¡ãã»ãŒãžã®æ¬¡ã®ããããžã®æ°ãããã€ã³ã¿ãè¿ããŸãããã以äžåŠçããå¿ èŠããªãå Žåã¯Noneãè¿ããŸãã 倧èŠæš¡ãªãµãŒããŒã®çµæããã°ããååŸããããã«ãå±¥æŽã€ã³ããã¯ã¹ããåæããšããã£ãŒããã®2ã€ã®ãã§ãŒãºã«åå²ããŸããã ãåæããã§ãŒãºã§ã¯ãéå»7æ¥éã®ã¡ãã»ãŒãžã«ã€ã³ããã¯ã¹ãä»ãããããŠãŒã¶ãŒãã€ã³ããã¯ã¹ã䜿çšã§ããããã«ãªããŸãã ãã®åŸãäœåªå 床ã§å®è¡ãããããã£ãŒãããã§ãŒãºãéå§ããŸãã ãã®èšäºã§ã¯ããŠãŒã¶ãŒã«ã©ã®ããã«èŠãããã説æããŸãã ã¿ã¹ã¯ã¯ã¯ãŒã«ãŒã®ããŒã«ã§å®è¡ããããããã¯ãŒã«ãŒãå®è¡ããä»ã®ã¿ã¹ã¯ã®äžã§ãã¿ã¹ã¯ãèšç»ã§ããŸãã 次ã®ããã«ãªããŸãã
@task() def job_task(current_job) # .process returns the next job to execute, or None if there are no more jobs to execute. next_job = current_job.process(router) if next_job: job_task.delay(next_job, priority=LOW if next_job.deep else NORMAL) initial_job = HistoricalIndexJob(guild_id=112233445566778899) job_task.delay(initial_job)
çç£è©Šéš
![](https://habrastorage.org/getpro/habr/post_images/ee8/405/9a8/ee84059a8e1552415df65fa701141508.png)
äžèšã®ãã¹ãŠãã³ãŒãã£ã³ã°ããéçºç°å¢ã§ãã¹ãããåŸãæ¬çªç°å¢ã§ã©ã®ããã«æ©èœãããã確èªããæãæ¥ããšå€æããŸããã 3ã€ã®ããŒããæã€å¯äžã®Elasticsearchã¯ã©ã¹ã¿ãŒãäœæããã€ã³ããã¯ã¹äœæã¯ãŒã«ãŒãèµ·åããã€ã³ããã¯ã¹äœæã®ããã«1000å°ã®æ倧ã®DiscordãµãŒããŒãå²ãåœãŠãŸããã ãã¹ãŠãæ©èœããŠããããã«èŠããŸããããã¯ã©ã¹ã¿ãŒã€ã³ãžã±ãŒã¿ãŒãèŠããšã次ã®2ã€ã®ããšã«æ°ä»ããŸããã
- CPU䜿çšçãäºæ³ãããé«ãã£ãã
- ãã£ã¹ã¯é åã®æ¶è²»ã¯ãå®éã«ã€ã³ããã¯ã¹ä»ããããã¡ãã»ãŒãžããªã¥ãŒã ã«å¯ŸããŠéãããŸããã
ããã¯éåžžã«é©ããããšã§ããããã£ã¹ã¯é åã䜿ããããŠãã°ããäœæ¥ãç¶ããåŸãã€ã³ããã¯ã¹äœæã¿ã¹ã¯ããã£ã³ã»ã«ããç¿æ¥ã«æŽçããããšã«ããŸããã äœããæããã«æ éããŠãã ã
ååäžã«æ»ã£ããšãããã£ã¹ã¯å®¹éã®å€§å¹ ãªè§£æŸã«æ°ä»ããŸããã Elasticsearchã¯ããŒã¿ãç Žæ£ããŸãããïŒ ã€ã³ããã¯ã¹ãäœæãããåŸæ¥å¡ã®1人ãç»é²ãããŠãããµãŒããŒã®1ã€ã§æ€çŽ¢ã¯ãšãªãå®è¡ããããšããŸããã ãããŸãïŒ çµæã¯å®å šã«è¿ãããŸãã-ãããŠéåžžã«é«éã§ãïŒ å æ°ïŒ
ãã£ã¹ã¯é åã®äœ¿çšéã¯æ¥éã«å¢å ããŠããçž®å°ããŸã
![](https://habrastorage.org/files/6d6/a7a/75b/6d6a7a75be8347ed9f69843a50f223d8.png)
CPUè² è·
![](https://habrastorage.org/files/696/939/1be/6969391bed6e4caa9a74dc7e139610f6.png)
å°ã調ã¹ãŠã仮説ãç«ãŠãŸããïŒ ããã©ã«ãã§ã¯ãElasticsearchã¯ã€ã³ããã¯ã¹ãæ¯ç§1åæŽæ°ããŸãã ããããã»ãŒãªã¢ã«ã¿ã€ã ãã®æ€çŽ¢ãæäŸãããã®ã§ãã Elasticsearchã¯æ¯ç§ïŒæ°åã®ã€ã³ããã¯ã¹ã®ããããã§ïŒã¡ã¢ãªå ã®ãããã¡ã«Luceneã»ã°ã¡ã³ããè¿œå ãããããéããŠæ€çŽ¢å¯èœã«ããŸããã ããŠã³ã¿ã€ã ã®å€ã«ãElasticsearchã¯å€æ°ã®å°ããªãã©ã°ã¡ã³ããçµåããã¯ããã«å€§ããªãã©ã°ã¡ã³ãïŒããã³ã¯ããã«å¹ççãªãã£ã¹ã¯é åïŒãçæããŸããã
仮説ã®ãã¹ãã¯éåžžã«ç°¡åã§ããã ã¯ã©ã¹ã¿ãŒå ã®ãã¹ãŠã®ã€ã³ããã¯ã¹ããªã»ããããæŽæ°ééãä»»æã®å€§ããªæ°å€ã«èšå®ããŠãããã€ã³ããã¯ã¹äœæã®ããã«åããµãŒããŒãå²ãåœãŠãŸããã CPU䜿çšçã¯ç¡èŠã§ããå€ãŸã§äœäžããŸããããããã¥ã¡ã³ãã®åŠçã¯ç¶ç¶ããããã£ã¹ã¯é åã®æ¶è²»ã¯é©ãã»ã©é«ãé床ã§å¢å ããããšã¯ãããŸããã§ããã ãã£ãïŒ
æŽæ°ééãå¢ãããåŸã®ãã£ã¹ã¯å®¹éã®äœ¿çš
![](https://habrastorage.org/files/b2e/22a/523/b2e22a523d3143a98f93d8c8ff2e6787.png)
CPUè² è·
![](https://habrastorage.org/files/1cc/a91/ff0/1cca91ff02e34ef6a607c3d91946e576.png)
ãã ããæ®å¿µãªãããæŽæ°ééãå®å šã«ç¡å¹ã«ããŠãå®éã«ã¯æ©èœããŸããã§ãã...
æŽæ°ééã«é¢ããåé¡
Elasticsearchã®èªåãã»ãŒãªã¢ã«ã¿ã€ã ã®ã€ã³ããã¯ã¹äœææ©èœã¯ãããŒãºãæºãããŠããªãããšãæããã«ãªããŸããã ãµãŒããŒã¯ãåäžã®æ€çŽ¢ã¯ãšãªãªãã§æ°æéå®è¡ãããããšããããŸãã ã¢ããªã±ãŒã·ã§ã³å±€ããæŽæ°ééãå¶åŸ¡ããæ¹æ³ãèŠã€ããå¿ èŠããããŸããã Redisã®å»æ¢ãããããã·ã¥ãããã䜿çšããŠãããè¡ããŸããã DiscordãµãŒããŒã¯ã·ã£ãŒãã«ãã£ãŠElasticsearchã®å ±éã€ã³ããã¯ã¹ã«åå²ããããããã€ã³ããã¯ã¹ã§å€æŽããã¯ã€ãã¯ããããäœæããæ€çŽ¢å¯Ÿè±¡ã®ãµãŒããŒã«å¿ããŠã€ã³ããã¯ã¹ã®æŽæ°ãå¿ èŠãã©ããã远跡ã§ããŸãã ããŒã¿æ§é ã¯åçŽã§ãïŒããã·ã¥ãããã
prefix + shard_key
ãæ ŒçŽããRedisããŒã
guild_id
å€ã®ããã·ã¥ããããã·ã°ãã«å€ïŒã€ã³ããã¯ã¹ã®æŽæ°ãå¿ èŠã§ããããšã瀺ãïŒã æ¯ãè¿ã£ãŠã¿ããšãããã¯ããããéåžžã«å€ãã®å¯èœæ§ããããŸãã
ã€ã³ããã¯ã¹äœæãµã€ã¯ã«ã¯æ¬¡ã®ããã«ãªããŸãã
- ãã¥ãŒããNåã®ã¡ãã»ãŒãžãååŸããŸãã
- ãããã®ã¡ãã»ãŒãžã®éä¿¡å
ã
guild_id
ãŸãã - é©åãªã¯ã©ã¹ã¿ãŒã§äžæ¬æ¿å ¥æäœãå®è¡ããŸãã
- RedisããããæŽæ°ããã·ã£ãŒããšã·ã£ãŒãäžã®æŽæ°ããã
guild_id
ãããŒãã£ã«ãªã£ãããšã瀺ããŸãã ãã®ããŒã¯1æéåŸã«æéåãã«ãªããŸãïŒElasticsearchã¯ãããŸã§ã«èªåæŽæ°ãå®äºããŸãïŒã
ãããŠãæ€çŽ¢ãµã€ã¯ã«ã¯ããã«å€ãããŸããïŒ
-
guild_id
ãèŠæ±ããã·ã£ãŒããèŠã€ããŸãã - Redisã«ãŒãã§ã·ã£ãŒãããŸã
guild_id
ãæ±ããŠããªãã確èªããŠãã ããã - æ±ããŠããå Žåã¯ãã·ã£ãŒãã®Elasticsearchã€ã³ããã¯ã¹ãæŽæ°ããã·ã£ãŒãå šäœãã¯ãªãŒã³ãšããŠããŒã¯ããŸãã
- æ€çŽ¢ã¯ãšãªãå®è¡ããçµæãè¿ããŸãã
Elasticsearchã®æŽæ°ããžãã¯ãæ確ã«å¶åŸ¡ã§ããããã«ãªããŸããããã¡ã€ã³ã€ã³ããã¯ã¹ã¯1æéããšã«æŽæ°ãããŠããŸãã Redisã«ãŒãã§ããŒã¿æ倱ãçºçããå Žåãã·ã¹ãã ã¯æ倧1æéèªåçã«èª¿æŽããŸãã
æªæ¥
1æã«å±éããŠä»¥æ¥ãElasticsearchã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ããããã1 TBã®ããããžã§ãã³ã°ãããSSDãåããGCPã§n1-standard-8ã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã䜿çšããŠã2ã€ã®ã¯ã©ã¹ã¿ãŒã§14ããŒãã«æé·ããŸããã ããã¥ã¡ã³ãã®åèšæ°ã¯çŽ260åã§ãã€ã³ããã¯ã¹äœæé床ã¯1ç§ãããçŽ30,000ã¡ãã»ãŒãžã®ããŒã¯å€ã«éããŸãã Elasticsearchã¯ããã«ç°¡åã«å¯ŸåŠããæ€çŽ¢ã®å šæéã«ããã£ãŠ5ã15ïŒ ã®CPUãä¿æããŸãã
ãããŸã§ã®ãšãããåé¡ãªãã¯ã©ã¹ã¿ãŒã«ããŒããè¿œå ããŸããã ããæç¹ã§ãæ°ããDiscordã€ã³ããã¯ã¹å¯èœãµãŒããŒãããã«å°éããããã«ãæ°ããã¯ã©ã¹ã¿ãŒããããã€ããŸãïŒèªåã·ã£ãŒãé åžã·ã¹ãã ã®ãããã§ãïŒã æ¢åã®ã¯ã©ã¹ã¿ãŒã§ã¯ãã¯ã©ã¹ã¿ãŒã«ããã«ããŒã¿ããŒããè¿œå ãããšãã«ãã¡ã€ã³ã®éžæããŒãã®æ°ãå¶éããå¿ èŠããããŸãã
![](https://habrastorage.org/getpro/habr/post_images/b4b/887/aa5/b4b887aa583c3735eadff605f28bc1d1.png)
ãŸããã¯ã©ã¹ã¿ãŒããã€å¢ããããå€æããããã«äœ¿çšãã4ã€ã®éèŠãªææšã«åºäŒããŸããã
- heap_freeïŒïŒå¥åheap_committed-heap_usedïŒã ããŒãäžã®ã¹ããŒã¹ããªããªããšãã¬ããŒãžã³ã¬ã¯ã¿ãŒãããã«ã¹ããŒã¹ã解æŸããããã«JVMã匷å¶çã«åæ¢ãããŸãã ååãªã¹ããŒã¹ã解æŸã§ããªãå ŽåãããŒãã¯å€±æããŸãã ãã®åã«ãJVMã¯ãããŒãããã£ã±ãã«ãªããã¬ããŒãžã³ã¬ã¯ã¿ãŒã®åãã¹äžã«è§£æŸãããã¡ã¢ãªãå°ãªããããããç¶ç¶çã«åæ¢ããç¶æ ã«ãªããŸãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®çµ±èšãšãšãã«ããã远跡ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«è²»ããããæéã確èªããŸãã
- disk_freeïŒæããã«ããã£ã¹ã¯å®¹éãäžè¶³ããå ŽåããŸãã¯æ°ããããã¥ã¡ã³ãã®ã€ã³ããã¯ã¹ãäœæããããã«ããå€ãã®å®¹éãå¿ èŠãªå Žåãæ°ããããŒããè¿œå ããå¿ èŠããããŸãã ã€ã³ã¹ã¿ã³ã¹ãåèµ·åããã«ãã£ã¹ã¯å®¹éãå¢ããããšãã§ãããããããã¯GCPã§éåžžã«ç°¡åã«å®è¡ã§ããŸãã æ°ããããŒããè¿œå ãããããã£ã¹ã¯ã®ãµã€ãºãå€æŽãããã®éžæã¯ãããã§èª¬æããä»ã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠç°ãªããŸãã ããšãã°ããã£ã¹ã¯ã¹ããŒã¹ã®äœ¿çšçãé«ãããæ®ãã®ã€ã³ãžã±ãŒã¿ãæ£åžžãªå Žåãæ°ããããŒããè¿œå ããã®ã§ã¯ãªãããã£ã¹ã¯ã¹ããŒã¹ã®æ¡åŒµãéžæããŸãã
- cpu_usageïŒããŒã¯æã«CPU䜿çšçã®ãããå€ã«éããå Žåã
- io_waitïŒã¯ã©ã¹ã¿ãŒå ã®I / Oæäœãé ããªããããå Žåã
ç°åžžãªã¯ã©ã¹ã¿ãŒïŒããŒãã¯çµäºïŒ
ããªãŒããŒãïŒMiBïŒ
![](https://habrastorage.org/files/0aa/7df/7c1/0aa7df7c1e00460fa6fcaf2cc3f9524f.png)
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³æéã1ç§ãããã®GC
![](https://habrastorage.org/files/b03/4d2/b59/b034d2b5950d46e6969e5418b6276826.png)
å¥å šãªã¯ã©ã¹ã¿ãŒ
ããªãŒããŒãïŒGiBïŒ
![](https://habrastorage.org/files/ad9/e23/855/ad9e238552f84e108624e371204897c8.png)
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³æéã1ç§ãããã®GC
![](https://habrastorage.org/files/c27/854/d69/c27854d69bae4bc4a8d3982f543b9ede.png)
ãããã«
æ€çŽ¢æ©èœãèµ·åããŠãã3ãæ以äžãçµéãããã以éãã·ã¹ãã ã¯äºå®äžãŸãã¯åé¡ãªãæ©èœããŠããŸãã
![](https://habrastorage.org/getpro/habr/post_images/d62/c71/587/d62c715875a836c45a1daa1be863ab88.gif)
Elasticsearchã¯ãçŽ16,000ã®ã€ã³ããã¯ã¹ãšæ°çŸäžã®DiscordãµãŒããŒã§ã0ã260åããã¥ã¡ã³ãã®å®å®ããä¿¡é Œã§ããããã©ãŒãã³ã¹ã瀺ããŸããã æ¢åã®ã¯ã©ã¹ã¿ãŒã«æ°ããã¯ã©ã¹ã¿ãŒãŸãã¯ããŒããè¿œå ããŠãã¹ã±ãŒãªã³ã°ãç¶ç¶ããŸãã ããæç¹ã§ãã¯ã©ã¹ã¿ãŒéã®è² è·ã軜æžããæ¹æ³ãšããŠã¯ã©ã¹ã¿ãŒéã®ã€ã³ããã¯ã¹è»¢éãèš±å¯ããã³ãŒããæžãããšãèããããšãã§ããŸããäžäžèŽãµãŒããŒã¯ãéåžžãç¬èªã®ã·ã£ãŒããååŸããŸãïŒã