Discordã¯ãã€ã¹ïŒããã¹ããã£ããã¢ããªã±ãŒã·ã§ã³ã§ãããæ¯æ¥1åæââ以äžã®ç»åãééããŸãã ãã¡ããããã¹ãŠã®ãã£ã³ãã«ã§å人ã«åçããªãã€ã¬ã¯ãããã ãã§ãã¿ã¹ã¯ã¯ã·ã³ãã«ã«ãªããŸãã ãããå®éã«ã¯ããããã®ç»åã®é
ä¿¡ã¯éåžžã«å€§ããªæè¡çåé¡ãåŒãèµ·ãããŸãã åçãžã®çŽæ¥ãªã³ã¯ã¯ãåçãæã€ãã¹ãã«ãŠãŒã¶ãŒã®IPã¢ãã¬ã¹ãæäŸãã倧ããªç»åã¯å€ãã®ãã©ãã£ãã¯ãæ¶è²»ããŸãã ãããã®åé¡ãåé¿ããã«ã¯ããŠãŒã¶ãŒã®ç»åãåä¿¡ãããã©ãã£ãã¯ãç¯çŽããããã«ç»åã®ãµã€ãºãå€æŽããäžéãµãŒãã¹ãå¿
èŠã§ãã
ç»åãããã·ã«äŒã
ãããè¡ãããã«ãPythonãµãŒãã¹ãäœæããåµé çã«
Image Proxyãšããååãä»ããŸããã ãªã¢ãŒãURLããç»åãããŠã³ããŒãããŠããã
pillow-simdããã±ãŒãžã䜿çšããŠããªãœãŒã¹ã倧éã«æ¶è²»ãããµã€ãºå€æŽã¿ã¹ã¯ãå®è¡ã
ãŸã ã ãã®ããã±ãŒãžã¯é©ãã»ã©é«éã§ãå¯èœãªéã
x86 SSEåœä»€ã®ãµã€ãºå€æŽãé«éåã
ãŸã ã ç»åãããã·ã¯ãæçµç»åãã¢ããããŒãããµã€ãºå€æŽãããã³æçµçã«è¡šç€ºããURLãå«ãHTTPãªã¯ãšã¹ããåä¿¡ããŸãã
ããã«ããµã€ãºå€æŽãããç»åãã¡ã¢ãªã«ä¿åãããã£ãã·ã¥ã¬ã€ã€ãŒãèšå®ããå¯èœã§ããã°ãã¡ã¢ãªããçŽæ¥çºè¡ããããšããŸãã
HAProxyã¬ã€ã€ãŒã¯ãURLããã·ã¥ã«åºã¥ããŠãªã¯ãšã¹ããNginxãã£ãã·ã³ã°ã¬ã€ã€ãŒã«ãªãã€ã¬ã¯ãããŸãã ãã£ãã·ã¥ã¯
ã¯ãšãªã®ããŒãžã
å®è¡ããŠãç»åã®ãµã€ãºå€æŽã«å¿
èŠãªå€æã®æ°ãæå°éã«ããŸãã ãã£ãã·ã¥ãšãããã·ã®çµã¿åããã«ããããµã€ãºå€æŽãµãŒãã¹ãæ°çŸäžäººã®ãŠãŒã¶ãŒã«æ¡åŒµã§ããŸããã
Discordãæé·ããã«ã€ããŠãImage Proxyã¯éè² è·ã®å
åã瀺ãå§ããŸããã æ倧ã®åé¡ã¯ãè² è·ãäžåçã«åæ£ããã垯åå¹
ãäœäžããããšã§ããã ãªã¯ãšã¹ãã¯ãæ倧æ°ç§ãŸã§ããŸã£ããç°ãªãæéã«å®è¡ãããŸããã æ¢åã®Image Proxyã§ãã®åé¡ã解決ããããšã¯ã§ããŸããããåœæã¯Goã®è¿œå 䜿çšãè©ŠããŠããŸããããããã§ã¯Goã䜿çšããã®ã«æé©ãªå Žæã®ããã«æããŸããã
ã ããã¡ãã£ã¢ãããã·ããããŸãã
ãã§ã«å®è¡äžã®ãµãŒãã¹ãæžãæããããšã¯
é£ãã決æã«ãªããŸããã 幞ããªããšã«ãImage Proxyã¯æ¯èŒçåçŽã§ãããImage Proxyãšæ°ãã代æ¿ã®çµæãç°¡åã«æ¯èŒã§ããŸããã ã¯ãšãªå®è¡ã®é«éåã«å ããŠãæ°ãããµãŒãã¹ã«ã¯ã.mp4ããã³.webmãããªã®æåã®ãã¬ãŒã ãæœåºããæ©èœãªã©ãããã€ãã®æ°æ©èœããããŸãããããã£ãŠãMedia ProxyãšåŒã³ãŸãããã
Goã§ç»åã®ãµã€ãºãå€æŽãããã
ã«æ¢åã®ããã±ãŒãž
ã®ããã©ãŒãã³ã¹ã枬å®ããããšããå§ããããã«ãã£ããããŸããã Goã¯äžè¬çã«Pythonãããé«éãªèšèªã§ãããããã±ãŒãžã®ã©ããã確å®ã«Pillow-simdã®é床ãäžåã£ãŠããŸããã Image Proxyã®äœæ¥ã®äž»ãªéšåã¯ãç»åã®ãã©ã³ã¹ã³ãŒããšãµã€ãºå€æŽã§ããããããã£ãŠãMedia Proxyã®ããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãªãããšã¯ééããããŸããã Goèšèªã¯ãHTTPãåŠçãããšãã«å°ãéããªãå ŽåããããŸãããåçã®ãµã€ãºããã°ããå€æŽã§ããªãå Žåã¯ããµã€ãºå€æŽã®ããã®è¿œå ã®æéã«ãã£ãŠé床ã®åäžãå¹³æºåãããŸãã
Goã§
è³ãã
2åã«ããç¬èªã®ç»åãµã€ãºå€æŽã©ã€ãã©ãªãæ§ç¯ããããšã«ããŸããã
OpenCVã«åºã¥ã1ã€ã®Goããã±ãŒãžã«ãã£ãŠããã€ãã®ææãªçµæã瀺ãããŸããããå¿
èŠãªãã¹ãŠã®æ©èœããµããŒãããŠããŸããã§ããã OpenCVã®äžã«ç¬èªã®Cgo
ã©ãããŒãåãã
LilliputãšããGoãªãµã€ã¶ãŒãäœæããŸããã äœææã«ãGoã§äœåãªãŽããçæãããªãããã«æ³šæããŠç£èŠããŸããã Lilliputã©ãããŒã¯ãå¿
èŠã«å¿ããŠ
OpenCVãå°ã
ãã©ãŒã¯ããŸããããå¿
èŠãªã»ãŒãã¹ãŠãå®è¡ããŸãã ç¹ã«ãç»åã解åãããã©ããã決å®ããåã«ããããŒããã§ãã¯ã§ããããã«ãããã£ãã®ã§ãããã®æ¹æ³ã§ã¯ã倧ããããç»åã®ãµã€ãºå€æŽãå³åº§ã«æåŠã§ããŸãã
Lilliputã¯ãæ¢åããã³å®çžŸã®ããCã©ã€ãã©ãªïŒããšãã°ãJPEGã®libjpeg-turboãPNGã®libpngïŒãããã³å§çž®ãšè§£åã®ãµã€ãºããã°ããå€æŽããããã®ãã¯ãã«åãããOpenCVã³ãŒãã䜿çšããŸãã HTTPã¯ã©ã€ã¢ã³ããšãµãŒããŒãåæã«
䜿çšããããã®èŠä»¶ãæºããããã«ã
fasthttpãè¿œå ããŸããã ãã®çµæããã®çµã¿åããã«ãããåæãã³ãããŒã¯ã§Image Proxyãçå®ã«äžåããµãŒãã¹ãéå§ã§ããŸããã å ããŠããªãªãããã¯ç§ãã¡ãå¿
èŠãšããã¿ã¹ã¯ã§pillow-simdãã
æªããè¯ããåã
ãŸããã§ããã
æåã®ã³ãŒãã«ã¯åé¡ããªãã£ãããã§ã¯ãããŸããã æåãMedia Proxyã¯ãªã¯ãšã¹ãããšã«16ãã€ãããªãŒã¯ããŸããã ããã¯ãç¹ã«å°éã®ãªã¯ãšã¹ãã§ãã¹ãããå Žåã«ããã«æ°ä»ãã»ã©å°ããã§ãã ãã®åé¡ã解決ããããã«ãMedia Proxyã¯ãµã€ãºå€æŽã®ããã«å€§ããªéçãã¯ã»ã«ãããã¡ãŒãã€ã³ã¹ããŒã«ããŸããã CPUããšã«ãã®ãããªãããã¡ã2ã€äœ¿çšããããã32ã³ã¢ã®ãã·ã³ã§ã¯ããã«32ã®ã¬ãã€ãã®ã¡ã¢ãªãæ¶è²»ããŸãã ãã¹ãäžãã¡ãã£ã¢ãããã·ã¯ãã¹ãŠã®ã¡ã¢ãªã䜿çšãããããã¡ãã£ã¢ãããã·ã®åèµ·åã«ã¯æ°æéããããŸããã ããã¯ãç¶æ³ãæ確ã«ããã®ãå°é£ã«ããã®ã«ååãªæéã§ãïŒæ¬åœã«ã¡ã¢ãªãªãŒã¯ããããããŸãã¯åäœäžã«åçŽã«å¶éãè¶
ããŠããŸãã
æçµçã«ãäœããã®çš®é¡ã®ã¡ã¢ãªãªãŒã¯ããŸã ãããšå€æããŸããã ãã®ãªãŒã¯ãGoã«ããã®ãC ++ã«ããã®ãã¯ããããŸããã§ãããã³ãŒãã調ã¹ãŠãçããåŸãããŸããã§ããã 幞ããªããšã«ãXcodeã«ã¯åªããã¡ã¢ãªãããã¡ã€ã©ãŒãä»å±ããŠã
ãŸã ããã
ã¯ã[ æ©åš ]ã¡ãã¥ãŒã® [
ãªãŒã¯]ããŒã«ã§ã ã ãã®ããŒã«ã¯ããªãŒã¯ã®ãµã€ãºãšããªãŒã¯ãçºçããããããã®å Žæã瀺ããŸããã ãã®ãããªãã³ãã¯ããœãŒã¹ãç¹å®ãããªãŒã¯ãä¿®æ£ããããã®ãã培åºçãªèª¿æ»ã«ååã§ããã
ã¡ãã£ã¢ãããã·ã§ã¯ãå¥ã®ãã°ãçºçãããããäžæããŸããã æã
ã圌ã¯å¥åŠã«çãããããŠè²ã£ãåçãé
ããŸããããã®ååã¯éåžžã®ãŸãŸã§ãæ®ãã®ååã¯ããã®ãŒãã§ããã ã©ããã§ç»åãéšåçã«ãšã³ã³ãŒãããŠããã®ããOpenCVãééã£ãŠåŒã³åºããŠããã®ã§ã¯ãªãããšèããŸããã ãã°ã¯ãã£ãã«çŸããã蚺æãå°é£ã§ããã
調æ»ãé²ããããã«ãã·ãã¥ã¬ãŒã¿å
ã®HTTPãµãŒããŒãžã®ãªã³ã¯ãå«ãURLãè¿ãé«æ§èœã¯ãšãªã·ãã¥ã¬ãŒã¿ãŒãéçºãããã®ã·ãã¥ã¬ãŒã¿ãŒãèŠæ±ã¯ã©ã€ã¢ã³ããšãã¹ããµãŒããŒã®äž¡æ¹ãšããŠæ©èœããããã«ããŸããã 圌ã¯ãMedia Proxyã§ãã®ãããªç»åã®ç ŽæãåŒãèµ·ããããã«ãå¿çã«ã©ã³ãã ã«é
延ãæ¿å
¥ããŸããã åé¡ã確å®ã«åçŸãããããMedia Proxyã®ã³ã³ããŒãã³ããåé¢ãããµã€ãºå€æŽãããç»åãå«ãåºåãããã¡ãŒã§ç«¶åç¶æ
ãèŠã€ããããšãã§ããŸããã æåã®ã€ã¡ãŒãžãã·ã¹ãã ã«è¿ãããåã«ã1ã€ã®ã€ã¡ãŒãžããã®ãããã¡ãŒã«æžã蟌ãŸãã次ã«å¥ã®ã€ã¡ãŒãžãæžã蟌ãŸããŸããã å®éã«ã¯ãã°ãªãããªåçã¯2ã€ã®JPEGã§ãããäžæ¹ãä»æ¹ã®äžã«èšé²ãããŸããã
Media Proxyã«ãã£ãŠçæãããå®éã®ãã°ã®ããJPEGè€éãªã·ã¹ãã ã®ãã°ãæ¢ãå¥ã®æ¹æ³ã¯ãã©ã³ãã ãªå
¥åããŒã¿ãçæãããŠã·ã¹ãã ã«éä¿¡ããããšãã®ãã¡ãžã³ã°ã§ãã ãã®å Žåãã·ã¹ãã ã¯å¥åŠãªåäœãŸãã¯åŽ©å£ã瀺ãå¯èœæ§ããããŸãã ç§ãã¡ã®ã·ã¹ãã ã¯å
¥åããŒã¿ã«å¯ŸããŠèæ§ããªããã°ãªããªãããããã®éèŠãªææ³ããã¹ãããã»ã¹ã«é©çšããããšã«ããŸããã
AFLã¯
éåžžã«åªãããã¡ã¶ãŒã§ããããããããéžæããŠLilliputã«èšå®ããŸãããããã«ãããåæåãããŠããªãå€æ°ã«ããããã€ãã®å€±æãèå¥ã§ããŸããã
ãããã®ãã°ãä¿®æ£ããåŸãMedia Proxyãæ¬çªç°å¢ã«å°å
¥ããã®ã«ååãªèªä¿¡ãçãŸããŸããããããŠãç§ãã¡ã®åªåãããã ãã®äŸ¡å€ãããããšãå¬ããæããŸããã Media Proxyã¯ãImage Proxyãšåãæ°ã®ãªã¯ãšã¹ããåŠçããããã«å¿
èŠãª
ãµãŒããŒã€ã³ã¹ã¿ã³ã¹ã60ïŒ
å°ãªã ããããã®ãªã¯ãšã¹ããã¯ããã«å°ãªãæéåæ£ã§å®è¡ããŸãã ãããã¡ã€ãªã³ã°ã«ãããæ°ãããµãŒãã¹ã®CPUæéã®90ïŒ
以äžã解åããµã€ãºå€æŽãããã³å§çž®ã«è²»ããããŠããããšã瀺ãããŸããã ãããã®ã©ã€ãã©ãªã¯ãã§ã«å€§å¹
ã«æé©åãããŠããŸããã€ãŸããè¿œå ã®æé·ã¯å®¹æã§ã¯ãããŸããã ããã«ããµãŒãã¹ã¯ããã»ã¹ã§ã¬ããŒãžãã»ãšãã©çæããŸããã§ããã
çŸåšãMedia Proxyã¯äžå€®å€25ããªç§ã§ç»åãµã€ãºå€æŽãå®è¡ããå¿çé
延ã¯äžå€®å€85ããªç§ã§ãã æ¯æ¥1å5,000äžæ以äžã®åçã®ãµã€ãºãå€æŽããŸãã ã¡ãã£ã¢ãããã·ã¯ã
n1-standard-16èªåã¹ã±ãŒã©ãã«GCE
ãã¹ãã°ã«ãŒãã§å®è¡ãããéåžžã¯12ã€ã³ã¹ã¿ã³ã¹ã®ããŒã¯ãè¿ããŸãã
ã¡ãã£ã¢ãããã·ã§ã¡ãã£ã¢ãããŠã³ããŒããã
ãµãŒãã¹ãéæ¢ç»åã§æ£åžžã«æ©èœããåŸãã¢ãã¡ãŒã·ã§ã³GIFã®ãµã€ãºå€æŽã®ãµããŒããæ¥ç¶ãããã£ããããOpenCVã¯ãã®äœæ¥ãè¡ããŸããã Lilliputãã¢ãã¡ãŒã·ã§ã³GIFå
šäœã®ãµã€ãºãå€æŽããPNG圢åŒã§æåã®ãã¬ãŒã ãæäŸã§ããããã«ã
giflibã®äžã«å¥ã®Cgoã©ãããŒãLilliputã«è¿œå ããããšã«ããŸããã
GIFæšæºã§ã¯åãã¬ãŒã ã§256è²ã®ãã¬ããã䜿çšã§ããããã«ãªã£ãŠããããµã€ãºå€æŽã¢ãžã¥ãŒã«ã¯
RGBã¹ããŒã¹ã§æ©èœãããã
ãGIFã®ãµã€ãºå€æŽã¯ããã»ã©ç°¡åã§ã¯ãããŸããã§ããã æ°ãããã¬ãããèšç®ããã®ã§ã¯ãªããåãã¬ãŒã ã®ãã¬ãããä¿åããããšã«ããŸããã RGBããã¬ããã€ã³ããã¯ã¹ã«æ»ãããã«ãLilliputã«åçŽãªã«ãã¯ã¢ããããŒãã«ãæäŸããŸããããã®ããŒãã«ã¯ãRGBããããåãåãããã®çµæããã¬ããã€ã³ããã¯ã¹ããŒãã«ã®ããŒãšããŠäœ¿çšããŸããã ããã¯ããŸãæ©èœããå
ã®è²ãç¶æããŸãããããã®ã¢ãããŒãã¯ãLilliputããã®åœ¢åŒã®ãœãŒã¹ãã¡ã€ã«ããã®ã¿GIFãäœæã§ããããšãæå³ããŸããã
ãŸãã
giflibã«
ããããé©çšããŠãäžåºŠã«1ã€ã®ãã¬ãŒã ã®ã¿ããã³ãŒãããããããŸããã ããã«ããããã¬ãŒã ããã³ãŒããããµã€ãºãå€æŽããŠããã次ã®ãã¬ãŒã ã«é²ãåã«ãšã³ã³ãŒãããã³å§çž®ã§ããŸãã ããã«ãããGIFãµã€ãºå€æŽã¢ãžã¥ãŒã«ã®ã¡ã¢ãªæ¶è²»ãåæžãããŸãã ãã¬ãŒã ããšã«ããã€ãã®GIFç¶æ
ãä¿åããå¿
èŠããããããããã¯Lilliputãå°ãè€éã«ããŸãããMedia Proxyã®ããäºæž¬å¯èœãªã¡ã¢ãªäœ¿çšéã¯æãããªå©ç¹ã®ããã§ãã
giflibã¯ãµã€ãºå€æŽããã»ã¹ãå®å
šã«å¶åŸ¡ã§ãããããLilliputã®giflibã©ãããŒã¯Image Proxy GIFãªãµã€ã¶ãŒã«ãã£ãåé¡ã®äžéšãä¿®æ£ããŸãã ããªãã®æ°ã®
NitroãŠãŒã¶ãŒãã GIFã¢ãã¡ãŒã·ã§ã³ã¢ãã¿ãŒãã¢ããããŒãã
ãŸãããããã®ã¢ãã¿ãŒã¯ãImage Proxyã§ãµã€ãºãå€æŽããåŸããã°ããããéæ床ãšã©ãŒããããŸãããMedia ProxyãåŠçããåŸã¯æ£åžžã«åäœããŸãã äžè¬ã«ãå€æããããã«ããµã€ãºå€æŽããã°ã©ã ã«ã¯GIF圢åŒã®ããã€ãã®åŽé¢ã«åé¡ããããããéæãªãã¬ãŒã ãŸãã¯éšåçãªãã¬ãŒã ã®èŠèŠçãªäžå
·åãçºçããŸãã ç¬èªã®ã©ãããŒãäœæããããšã§ãçºçããåé¡ã解決ã§ããŸããã
æåŸã«ã
libavcodecã® Cgoã©ãããŒãLilliput
ã«è¿œå ããããããªãåæ¢ããMP4ããã³WEBMã¯ãªããã®æåã®ãã¬ãŒã ãåä¿¡ã§ããããã«ãªããŸããã ãã®æ©èœã«ãããMedia Proxyã¯ãŠãŒã¶ãŒãæçš¿ãããããªãã¡ã€ã«ã®ãã¬ãã¥ãŒãçæã§ããããããã®ãã¬ãã¥ãŒã«åºã¥ããŠä»ã®ãŠãŒã¶ãŒããããªãéå§ãããã©ããã決å®ã§ããŸãã æåã®ãã¬ãŒã ã®æœåºã¯ãå
¬éããããã¡ã€ã«ããã³ãªã³ã¯çšã«ã¯ã©ã€ã¢ã³ãã«çµã¿èŸŒã¿ã®ãããªãã¬ãŒã€ãŒãè¿œå ããããšã劚ããæåŸã®èŠå ã®1ã€ã§ããç¶ããŸããã
ãã£ãšãªãŒãã³ãœãŒã¹
Media Proxyã®äœæ¥ã«æºè¶³ããã®ã§ãMITã©ã€ã»ã³ã¹ã®äžã§
Lilliputãå
¬ââéããŸãã ãã®ããã±ãŒãžããçç£çãªç»åãµã€ãºå€æŽãµãŒãã¹ãå¿
èŠãšãã人ã
ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãããã®èšäºã§ã¯ãä»ã®äººãæ°ããGoããã±ãŒãžãäœæããããšããå§ãããŸãã