Author: @urahiroshi, Engineering manager of Web Platform team
2022å¹´8æ4æ¥ãã¡ã«ã«ãªã§ âweb-2â ã¨å¼ã°ãããµã¼ããã·ã£ãããã¦ã³ããã¾ãããããã¯ã¡ã«ã«ãªWebçã®éçºã«æºãã£ã¦ãããã¼ã ã«ã¨ã£ã¦ãä¸ã¤ã®åºåãã¨ãªãåºæ¥äºã§ããã
web-2ã¯PHPã§è¨è¿°ãããwebãµã¼ãã§ã2015å¹´ãã https://www.mercari.com/jp/ é
ä¸ã®ã³ã³ãã³ããé
ä¿¡ãã¦ãã¾ããããç¾å¨ã§ã¯è¤æ°ã®Webãã¤ã¯ããµã¼ãã¹ããã®æ©è½ãæ
ã£ã¦ããã https://www.mercari.com/jp/ é
ä¸ã®ãã¼ã¸ã¯å¾ç¶ã¨ãªãWebãã¤ã¯ããµã¼ãã¹ãé
ä¿¡ãããã¼ã¸ã¸ãªãã¤ã¬ã¯ãããã¦ãã¾ãã
ã¡ã«ã«ãªWebã®ãã¤ã¯ããµã¼ãã¹åã«åããéçºãå§ã¾ããæçµçã«web-2ãã·ã£ãããã¦ã³ãããã¾ã§ãå®ã«4年以ä¸ã®æéããããã¾ããããã®è¨äºã§ã¯ããã®4å¹´éã«éçºãã¼ã ã®ä¸ã§ã©ã®ãããªè°è«ããããã©ããã£ãé¸æãè¡ããªããã¢ã¼ããã¯ãã£ãå¤æ´ãã¦ãã£ãã®ããè¨è¿°ããå¤åã«å¼·ãçµç¹ãã¢ã¼ããã¯ãã£ã«ã¤ãã¦èããä¸ã§åèã«ãã¦ããã ããã°ã¨æãã¾ãã
Web re-architectureããã¸ã§ã¯ãã®å§å (2018/05ã)
ã¡ã«ã«ãªWebçã®ã¢ã¼ããã¯ãã£ãä¸æ°ãããã¨ããre-architectureããã¸ã§ã¯ããå§ã¾ã£ãã®ã¯2018å¹´ã§ããã
å½æãã¡ã«ã«ãªWebçã®ã³ã³ãã³ãã¯ãã¹ã¦web-2ã®ãµã¼ãããé
ä¿¡ããã¦ãã¾ãããweb-2ã®éçºå½åã¯PHPã®çµé¨ãè±å¯ãªã¡ã³ãã¼ãå¤ããDietcube (https://github.com/mercari/dietcube) ã¨ããèªç¤¾è£½ã®PHPãã¬ã¼ã ã¯ã¼ã¯ãç¨ãã¦å¹ççã«ãµã¼ããµã¤ãã®å®è£
ãè¨è¿°ãã¦ãã¾ãããããããæéãçµã¤ã«ã¤ãã¦ã以ä¸ã®ãããªåé¡ãæããããããã«ãªã£ã¦ãã¾ããã
- éçºå½åããããæä½ã«å¿ãã¦ç»é¢ãæ´æ°ãããããªã¤ã³ã¿ã©ã¯ãã£ããªæåãå¿ è¦ã¨ããè¦ä»¶ãå¢ããçµç¹è¦æ¨¡ã®æ¡å¤§ã«ããJavaScriptãªã©Web Frontendæè¡ãå°éã¨ããã¡ã³ãã¼ãå¢ãããã¨ããããJavaScriptã§ãã¸ãã¯ã®ä¸å¿ãè¨è¿°ãã¦PHPã®ä¾åãæ¸ããããã¨ããè¦æãé«ã¾ã£ã¦ãã
- web-2ãæä¾ããæ©è½ãå¢ããã«ã¤ãã¦ã³ã¼ãããããã¤ãè¤éåããå¤æ´ã«å¯¾ããéçºã³ã¹ãããªãªã¼ã¹å¾ã«çºçããåé¡ãå¢å ãã¦ãã
(å®éã¯CDNããããã·ãµã¼ãã¼ããã¼ã¿ãã¼ã¹ãªã©ãå©ç¨ãã¦ãã¾ããçç¥ãã¦ãã¾ã)
ããããåé¡ã解決ãããããã³ã¼ããã¼ã¹ãã¢ã¼ããã¯ãã£ãä¸æ°ãããã¨ã§ã¡ã³ããã³ã¹æ§ãé«ãããã¨ãã¾ãææ°ã®Web Frontendæè¡ãç¨ãã¦ãã¼ã¸æç»ã®ããã©ã¼ãã³ã¹ãåä¸ãããã¨ãç®æ¨ã¨ãã¦ã2018å¹´5æããWeb re-architectureããã¸ã§ã¯ããå§ã¾ãã¾ããã
ã¾ãããã®å¹´ã«ã¯APIãµã¼ãã®ãã¤ã¯ããµã¼ãã¹åã®è¨ç»ãå§ã¾ã£ã¦ãããPHPã§è¨è¿°ããã¦ããã¢ããªã·ãã¯ãªAPIãµã¼ããKubernetesã®ã¤ã³ãã©ã¹ãã©ã¯ãã£ä¸ã§ç¨¼åããGoã®ãã¤ã¯ããµã¼ãã¹ç¾¤ã«ä¸æ°ããã¨ããæ¹åæ§ãæã¡åºããã¦ãã¾ããã
web-2ã®ã¤ã³ãã©ããããã¤å¦çã¯SREãã¼ã ã«ãã£ã¦ç®¡çããã¦ãã¾ããããWebã®ã¢ã¼ããã¯ãã£ãä¸æ°ããã«ããã£ã¦ã¤ã³ãã©ããããã¤å¦çã«ã¤ãã¦ãWebãã¼ã ã主ä½ã¨ãªã£ã¦è¨è¨ã»éç¨ãããã¨ããè¦æããããããããã¤ã¯ããµã¼ãã¹åã®æ¹åæ§ã«ããããã¦ãããããWeb re-architectureããã¸ã§ã¯ãã¯Webã®ãã¤ã¯ããµã¼ãã¹åãç®æããã¨ã¨ãªãã¾ããã
ãããã¦ãã©ããã£ãæè¡é¸å®ãããããã©ããã£ããã¤ã¯ããµã¼ãã¹ãæä¾ãããã¨ããæ¤è¨ãå§ã¾ãã¾ãããre-architectureããã¸ã§ã¯ãã§ä½ããã¨ã¨ãªã£ããã¤ã¯ããµã¼ãã¹ã¨ããã®èæ¯ã«ã¤ãã¦ä»¥ä¸ã«ç°¡åã«ã¾ã¨ãã¦ãã¾ãã
web-fuji: Server-Side Rendering (SSR) ãæä¾ãããµã¼ãã¹
- SEOã®è¦³ç¹ãOGPã®ãµãã¼ãããã¼ã¸æç»ã®ããã©ã¼ãã³ã¹ãåä¸ããç®çããSSRãå©ç¨ãããã¨ã¨ãã¦ããã¬ã¼ã ã¯ã¼ã¯ã¯Next.js (https://nextjs.org/) ãé¸æãã¾ããã
- å°æ¥çã«Webã®ãã¤ã¯ããµã¼ãã¹ãä½ã£ã¦ããä¸ã§å±±ã«ã¡ãªãã å称ãã¤ãã¦ãããã¨ãããã¨ã§ããã®ãµã¼ãã¹ã¯å¯å£«å±±ããweb-fujiã¨åä»ãããã¾ãããããããæ®å¿µãªãããã®å¾ã«å±±ããåä»ãããããµã¼ãã¹ã¯ä½ããã¾ããã§ããã
web-graphql: Web APIãæä¾ãããµã¼ãã¹
- web-2ã¯APIå¼ã³åºãã®ããã®ã¨ã³ããã¤ã³ããæä¾ãã¦ãããããããBFF(Backend For Frontend)ã®æ©è½ãæ ã£ã¦ãã¾ããããã®BFFã¨ãã¦ã®æ©è½ãæä¾ããããã®ãããã³ã«ã¨ãã¦GraphQLãå©ç¨ãããã¨ã¨ãããã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦Apollo Server (https://www.apollographql.com/docs/apollo-server/) ãé¸æãã¾ããã
web-gateway: Webãã¤ã¯ããµã¼ãã¹ã«å¯¾ããã«ã¼ãã£ã³ã°ãè¡ããµã¼ãã¹
- Web re-architectureã®ãªãªã¼ã¹ã§ã¯ãã¼ã¸ãã¨ã«æ®µéçã«ãªãªã¼ã¹ããæ¹éãç«ã¦ã¦ãããweb-2ã¨Webãã¤ã¯ããµã¼ãã¹éã§å¾ã ã«ãªã¯ã¨ã¹ããåãæ¿ãã¦ããããã«ãWebãã¤ã¯ããµã¼ãã¹éã§ã®ã«ã¼ãã£ã³ã°ããCanaryãªãªã¼ã¹ãªã©ã®ã«ã¼ãã£ã³ã°ã®å¶å¾¡ãè¡ããµã¼ãã¹ã¨ãã¦web-gatewayãã¤ã¯ããµã¼ãã¹ãä½ããã¨ã¨ãã¾ããã
- web-2ã®ã«ã¼ãã£ã³ã°ãè¡ã£ã¦ãããã¼ããã©ã³ãµãNGINXã§ãããNGINXã®ãã¸ãã¯ã®ç§»è¡ã®ããããããCookieãã¼ã¹ã®session affinityãCanaryãªãªã¼ã¹æ©è½ãæä¾ããã¦ããingress-nginx (https://kubernetes.github.io/ingress-nginx/) ãå©ç¨ãããã¨ã¨ãã¾ããã
web-session: ã»ãã·ã§ã³æ å ±ã®åå¾ã»æ´æ°ãè¡ããµã¼ãã¹
- web-2ã§ã¯Cookieå ã®ã»ãã·ã§ã³IDã«ç´ä»ããããã¦ã¼ã¶ã¼ã®ã»ãã·ã§ã³æ å ±ããã¼ã¿ãã¼ã¹ã«ä¿æãã¦ãããã»ãã·ã§ã³IDãã¢ã¯ã»ã¹ãã¼ã¯ã³ã«å¤æãã¦APIãå¼ã³åºãå¦çãè¡ã£ã¦ãã¾ãããweb-gatewayãweb-2ã¨Webãã¤ã¯ããµã¼ãã¹éã§æ®µéçã«ã«ã¼ãã£ã³ã°ãåãæ¿ããã«ããã£ã¦ããã®ç§»è¡æéã¯web-2ã®ã»ãã·ã§ã³æ å ±ã¨ã®åæãè¡ãå¿ è¦ããããå¦çãè¤éåãããã¨ãäºæ³ãããã®ã§ãã»ãã·ã§ã³æ å ±ã®åå¾ã»æ´æ°ã«ç¹åãããã¤ã¯ããµã¼ãã¹ãä½ããã¨ã¨ãã¾ããã
- web-sessionã®æè¡ã¹ã¿ãã¯ã¯ãWebã®åãã¤ã¯ããµã¼ãã¹ã§æ¥µåå ±éã®æè¡ãç¨ããããã«Node.jsãé¸æããä¸æ¹ã§ãµã¼ãã¹ééä¿¡ãããã³ã«ã¨ãã¦ã¡ã«ã«ãªå ã§æ¨å¥¨ããã¦ããgRPCãå©ç¨ããæ¹éã¨ãã¾ããï¼å¾è¿°ãã¾ããããã®é¸æã¯å¾ã«å¤æ´ããããã¨ã¨ãªãã¾ãï¼ãã¾ããã»ãã·ã§ã³æ å ±ãæ ¼ç´ãããã¼ã¿ãã¼ã¹ã¨ãã¦Cloud Spannerãé¸æãã¾ããã
2018å¹´ã®ã¡ã«ã«ãªTech Conferenceã®éã«Web re-architectureã®è¨ç»ã«ã¤ãã¦çºè¡¨ãã¦ãããre-architectureã®ç®çãã¢ã¼ããã¯ãã£ã®æ¦è¦ã«ã¤ãã¦ã¯ãã¡ãã®è³æãåèã«ãªããã¨æãã¾ãã
https://speakerdeck.com/mercari/mtc2018-web-application-as-a-microservice
Webãã¤ã¯ããµã¼ãã¹ã®ãªãªã¼ã¹ (2019/06ã)
æåã®ç®æ¨ã¯ããªãã¹ãæ©ãææã«ããããã¼ã¸ã ãæ°ããã¢ã¼ããã¯ãã£ããé ä¿¡ããã¨ãããã®ã§ãããããããããã¤ãã®åé¡ãããããªãªã¼ã¹ã®ã¹ã±ã¸ã¥ã¼ã«ã¯é ãã¦ããã¾ããã
-
æ°ããæè¡ã«å¯¾ããéå°ãªè¦ç©ãã:
ããããã¼ã¸ã ãã®ãªãªã¼ã¹ã§ãã£ã¦ãåãã¤ã¯ããµã¼ãã¹ã®ã¤ã³ãã©æ§ç¯ãCI/CDåºç¤ãªã©ã¯å®å ¨ãªå½¢ã§æ´åããå¿ è¦ããããå¤ãã®æè¡ãWebãã¼ã ã¨ãã¦åãã¦çµé¨ãããã®ã§ãã£ããããã¹ã±ã¸ã¥ã¼ã«ã®è¦ç©ãããçãé¢ãããã¾ããã -
è¦ç´ æè¡ã®å¤æ´ã«ããææ»ã:
web-sessionã®æè¡é¸å®ã«ããã¦ãå½åã¯Node.jsã§gRPCãµã¼ããå®è£ ããã¨ããäºå®ã§ããããå½æã¯gRPCãNode.jsã¨ã³ã·ã¹ãã ã«ããã¦ååã«ãµãã¼ãããã¦ããããNode.jsããGoã§gRPCãµã¼ããå®è£ ããããã«å¤æ´ãã¾ããããã®æç¹ã§ã¯gRPCèªä½ã¯å©ç¨ããæ³å®ã§ãããããã¯ãNode.jsããgRPCã¯ã©ã¤ã¢ã³ããå®è£ ããå ´åã«ãåé¡ããããæçµçã«gRPCã§ã¯ãªãREST APIãå©ç¨ãããã¨ã«å¤æ´ãã¾ããã -
ãµã¼ãã¹ã®ä¾åé¢ä¿ã«ããã¹ã±ã¸ã¥ã¼ã«é 延:
web-fujiãweb-graphqlããä»ã®ãã¤ã¯ããµã¼ãã¹ã®APIãå¼ã³åºãããã«ã¯web-sessionã®æ©è½ãå¿ è¦ã ã£ããããweb-sessionã®å®è£ ãé ãããã¨ã§web-fujiã¨web-graphqlã®éçºããããã¯ããã¦ãã¾ããæ´ã«éçºãé ããè¦å ã¨ãªãã¾ããã -
éçºããã»ã¹ã®å¤æ´:
å ¨ç¤¾çã«ã¹ã¯ã©ã éçºããã»ã¹ãDesign Docã®å°å ¥ãå§ã¾ããWebãã¼ã å ã§ãããããåãå ¥ãã¾ãããããã¼ã ã¨ãã¦ã®å¦ç¿ã³ã¹ãããéç¨æ¹æ³ã«ã¤ãã¦ã®è©¦è¡é¯èª¤ã«ãæéãè²»ããã¦ãã¾ããã
ããããä¸ã§ããªãªã¼ã¹ã®ç®å¦ãç«ã£ãã®ã¯éçºãéå§ãã¦ãããã1å¹´ãçµéãã2019å¹´6æã§ãããã¾ãæåã«ãªãªã¼ã¹ããã®ã¯web-gatewayã§ãããã®æç¹ã§ã¯åã«ãªã¯ã¨ã¹ããweb-2ã«ä¸ç¶ããã ãã§ãããWebãã¤ã¯ããµã¼ãã¹ã®ãªãªã¼ã¹ã«åããã¦ã«ã¼ãã£ã³ã°å ãã³ã³ããã¼ã«ãã¦ãããããæåã«ãªãªã¼ã¹ãè¡ã£ããã®ã§ãã
web-gatewayãå°å ¥ãããªã¯ã¨ã¹ããä¸ç¶ãã¦ãã¾ã
ä»ã®ãµã¼ãã¹ã®ãªãªã¼ã¹ã«ã¤ãã¦ã¯web-gatewayã®canaryãªãªã¼ã¹æ©è½ãå©ç¨ãã¦ã0%(社å ã¦ã¼ã¶ã¼ã®ã¿ã¢ã¯ã»ã¹å¯è½)ã1%ã5%ã10%…ã¨å¾ã ã«ããããã¼ã¸ã®ãã©ãã£ãã¯ãweb-2ããweb-fujiã«åãæ¿ãã¦ããã8æã«100%ã®ãªã¯ã¨ã¹ããweb-fujiã«åãæ¿ãããã¨ãã§ãã¾ããã
ããããã¼ã¸ãweb-fujiãweb-graphqlããé ä¿¡ããããã«ãªãã¾ãã
ãã®ã¢ã¼ããã¯ãã£å¤æ´å¾ã®web-fujiãweb-graphqlã®ãªãªã¼ã¹ããã¼ãweb-gatewayã®æ©è½ã«ã«ã¤ãã¦ã¯ã https://engineering.mercari.com/blog/entry/2019-10-30-105936/ ã«è©³ç´°ãè¨è¼ãã¦ãã¾ãã®ã§ãèå³ãããã°ãåç §ãã ããã
ããããã¼ã¸ã®ãªãªã¼ã¹å¾ã¯ãä»ã®ãã¼ã¸ã«ã¤ãã¦ãå¾ã
ã«web-fujiã«åãæ¿ãã¦ããã¾ãããããããã©ããã£ã¦web-2ã®ãã¼ã¸ã移è¡ãã¦ããããweb-fujiãweb-graphqlãæ°ããªã¢ããªã¹ã«ãªã£ã¦ãã¾ãæ¸å¿µããããã©ã®ããã«ãµã¼ãã¹ãåãåãããã¨ããæ¤è¨ãå¾ã
ã«å§ã¾ãã¾ããã
ããããä¸ã§ã2019å¹´12æã«è»¢æ©ã訪ããã®ã§ãã
GroundUp Webããã¸ã§ã¯ãã®ç«ã¡ä¸ã (2019/12ã)
2019å¹´12æãWebãã¼ã å ¨å¡ãéã¾ããæ°ããè¨ç»ã«ã¤ãã¦è©±ãåã£ã¦ãã¾ããããã®è¨ç»ã¯GroundUp Webããã¸ã§ã¯ãã¨è¨ãããæ°ãã«ã¼ãããã¡ã«ã«ãªWebçãè¨è¨ã»å®è£ ãç´ããã¨ãããã®ã§ãããWeb re-architectureã®ãªãªã¼ã¹ãã4ã¶æå¾ã®ãã¨ã§ããªãã¾ãæåããè¨è¨ãå®è£ ãããç´ããªããã°ãããªãã®ãã¨è°è«ã«ãªãã¾ããã
GroundUp Webããã¸ã§ã¯ãã®ç«ã¡ä¸ãã«ã¯ãããã¤ãã®èæ¯ãããã¾ããã
-
ãã¶ã¤ã³ã®ä¸æ°:
Web re-architectureããã¸ã§ã¯ãã®æ¹éã¯ãæ¢åã®ãã¶ã¤ã³ã¯å¤æ´ããã«ãã¢ã¼ããã¯ãã£ãå®è£ ãç½®ãæããã¨ãããã®ã§ãããããããã¢ãã¤ã«ã®å©ç¨è ãå¢ãã¦ãããã¨ãªã©ãããGroundUp Webããã¸ã§ã¯ãã§ã¯ãã¶ã¤ã³ãä¸æ°ãã¦ã¢ãã¤ã«ãã©ã¦ã¶åãã®ã¬ã¤ã¢ã¦ãã®æä¾ãè¡ããã¨ã§ã¦ã¼ã¶ã¼ä½é¨ãåä¸ãããã¨èãã¦ãã¾ããã -
ãã¼ã¸åä½ã®ãªãªã¼ã¹ã§ã¯ãªããã³ã¢æ©è½ãã¾ã¨ãã¦ãªãªã¼ã¹ãã:
re-architectureããã¸ã§ã¯ãã¯ãã¼ã¸åä½ã§ãªãªã¼ã¹ãã¦ãããããåã ã®ãã¼ã¸ãã¨ã«ãªãªã¼ã¹ä½æ¥ãå¿ è¦ã§ãããã¾ã移è¡åã¨ç§»è¡å¾ã®ãã¼ã¸éã§ã®äºææ§ãèæ ®ããå¿ è¦ãããã移è¡ä½æ¥ã«æéããããè¦å ã¨ãªã£ã¦ãã¾ãããå ãã¦ãã¶ã¤ã³ãä¸æ°ãããã¨ãããã¨ããããCtoCã®ãã¼ã±ãããã¬ã¤ã¹ã¨ãã¦ã®ã³ã¢æ©è½ãã¾ã¨ãã¦ãªãªã¼ã¹ãããã¨èããã®ã§ãã -
AndroidãiOSãã¼ã ã¨åçã®è²¬åãæã¤ã¢ã¼ããã¯ãã£:
ã¡ã«ã«ãªWebçã¯AndroidãiOSã¢ããªçã«æ¯ã¹ã¦æ©è½ãä¸è¶³ãã¦ããé¨åããããæ©è½ã®ä¸è¶³ãè£ã£ã¦ããããã¨èãã¦ãã¾ãããå°æ¥çã«ç¹å®ã®æ©è½ãWebçã¨ã¢ããªçã§å®è£ ãããã¨èããå ´åã«ãã¢ããªçã®å ´åã¯ã¾ãbackendãã¼ã ãå¿ è¦ãªAPIãå®è£ ããã¯ã©ã¤ã¢ã³ãã³ã¼ããã¢ããªä¸ã«å®è£ ããã¨ãããã¨ãæ³å®ãã¦ãã¾ããããWebçã®å ´åã¯ããã«GraphQL APIã®è¨è¨ã»å®è£ ãServer-Side Renderingã®å¦çãèæ ®ããå¿ è¦ããããéçºãã¼ã ã®è²¬åãéçºããã¼ãAndroidãiOSãã¼ã ã¨ç°ãªããã¨ãæ©è½å®è£ ã®éã®ããã¯ã¨ãªã£ã¦ãã¾ãããã¢ã¼ããã¯ãã£ã®å¤æ´ã«ããAndroidãiOSãã¼ã ã¨åçã®è²¬åãæã¡ãããè¿ éãªæ©è½æä¾ãè¡ãããã¨ããæå³ãããã¾ããã
ãã¡ãããWeb re-architectureããã¸ã§ã¯ãã®ã¢ã¼ããã¯ãã£ããã¼ã¹ã¨ãã¦ããããç¹ã解æ¶ããã¨ããã¢ããã¼ããèãããã¾ããããæ¢åã®ã¢ã¼ããã¯ãã£ã«ã¨ããããã«ã¼ããã¼ã¹ã§èãã¦ãããã¨ããæ¹éãããGroundUp Webããã¸ã§ã¯ããå§ã¾ãã¾ããã
GroundUp Webããã¸ã§ã¯ãã®ã¢ã¼ããã¯ãã£ã«ããã¦ã以ä¸ã®ãããªææ決å®ãè¡ããã¾ããã
Web Componentsãç¨ããDesign Systemã®å·æ°
- Web re-architectureããã¸ã§ã¯ãã§ã¯ãUIã³ã³ãã¼ãã³ãã¨ãã¦å 製ã®Design Systemã®ã©ã¤ãã©ãªãå©ç¨ãã¦ãã¾ãããDesign Systemã®ã©ã¤ãã©ãªã¯Reactããã¼ã¹ã«è¨è¿°ããã¦ãã¾ããããã¡ã«ã«ãªã°ã«ã¼ãå ã§ããåºãå©ç¨ãããããã«ãç¹å®ã®ãã¬ã¼ã ã¯ã¼ã¯ã«ä¾åããªãWeb Compentsãç¨ãã¦Design Systemãä½ãå¤ããGroundUp Webããã¸ã§ã¯ãã§ãããå©ç¨ãããã¨ã¨ãã¾ãããDesign Systemã®è©³ç´°ã«ã¤ãã¦ã¯ https://engineering.mercari.com/blog/entry/20210823-8128e0d987/ ã«è©³ããè¨è¼ããã¦ãã¾ãã
Static Site Generation (SSG)ãDynamic Renderingã®æ¡ç¨ (web-surugaãã¤ã¯ããµã¼ãã¹)
- Web Componentsãå©ç¨ããã¨SSRãè¡ããã¨ã¯é£ãããªããã¨ããSSRã«ä¼´ãéçºè² è·ãæ¸ããã¦iOSãAndroidã®éçºãã¼ã ã¨åçã®éçºããã¼ãæã¡ããã¨ããç¹ãããStatic Site Generation (SSG) ããã¼ã¹ã¨ãã¦ã¢ã¼ããã¯ãã£ãè¨è¨ããSSGãè¡ããã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦Gatsby (https://www.gatsbyjs.com/) ãé¸æãã¾ããã
- SSGã§çæããããã¡ã¤ã«ã«ã¯APIå¼ã³åºãã®çµæåå¾ã§ããã³ã³ãã³ãã¯å«ã¾ãããSEOä¸ã®ãªã¹ã¯ããããããSSGã«å ãã¦Dynamic Renderingã¨ããã¢ã¼ããã¯ãã£ãæ¡ç¨ãã¾ãããå ·ä½çã«ã¯ãRendertron (https://github.com/GoogleChrome/rendertron) ãå©ç¨ããPrerenderã¨ãããµã¼ããé ç½®ããGoogleã®ã¯ãã¼ã©ãªã©ã®ä»£ããã«Prerenderãã¡ã«ã«ãªWebä¸ã®JavaScriptå¦çãå®è¡ããã¯ãã¼ã©ã«å¯¾ãã¦åçã«çæãããHTMLãè¿ãã¨ãããã®ã§ãã
- GroundUp Webãæä¾ãããã¤ã¯ããµã¼ãã¹ã¯ âweb-surugaâ ã¨åä»ãããã¾ãããããã¯Web re-architectureããã¸ã§ã¯ãã®web-fujiãå¯å£«å±±ããåä»ãããã¦ãããããå¯å£«å±±ãè¦æ¸¡ãã駿河湾ããååãåã£ããã®ã§ãã
web-authãã¤ã¯ããµã¼ãã¹ã®ä½æ
- ãã°ã¤ã³ãæ°è¦ç»é²ã®æ©è½ãå®è£ ããã«ããã£ã¦ãweb-surugaä¸ã«å®è£ ããã®ã§ã¯ãªããweb-authã¨ããæ°ãããã¤ã¯ããµã¼ãã¹ãä½ãã¨ããé¸æãè¡ãã¾ããã
- ãã°ã¤ã³ãæ°è¦ç»é²ç»é¢ã¯ãå°æ¥çã«ã¡ã«ã«ãªWebçã ãã§ã¯ãªãä»ã®Webãµã¼ãã¹ãããå©ç¨ããããã¨ãæ³å®ãã¦ããã®ã§ããªã¼ãã¼ã·ããã®è¦³ç¹ããã¡ã«ã«ãªWebçãæä¾ããweb-surugaã¨ã¯åãé¢ããã»ããè¯ãã¨èãããã¨ããã¤ã¯ããµã¼ãã¹ãåé¢ããçç±ã§ãã
- web-surugaã¯Google Cloud Storage(GCS)ããéçãã¡ã¤ã«ãè¿ããããªã¢ã¼ããã¯ãã£ãèãã¦ãã¾ããããGoogleãFacebookãAppleã¢ã«ã¦ã³ããå©ç¨ãããã°ã¤ã³ãæ°è¦ç»é²æ©è½ã®å®è£ ã«ããã¦èªè¨¼å¾ã®ã³ã¼ã«ããã¯ãªã¯ã¨ã¹ããåãåãç®æããããGCSããéçãã¡ã¤ã«ãè¿ãã¢ã¼ããã¯ãã£ã§ã¯å¯¾å¿ãé£ãããããGoã®ãµã¼ãããåçã«ã¬ã¹ãã³ã¹ãè¿ããããã«ãããªã©ãã¢ã¼ããã¯ãã£ä¸ã®å·®ç°ãããã¾ããã
web-graphqlãweb-sessionã®åé¤
- ã»ãã·ã§ã³ç®¡çãAPIå¼ã³åºãã«ã¤ãã¦ãè¦ç´ãã¾ãããGraphQL APIãçµç±ããã®ã§ã¯ãªããAndroidãiOSã¢ããªã¨åæ§ã«Backendãã¼ã ãæä¾ãã¦ããAPIãã¯ã©ã¤ã¢ã³ãããç´æ¥å¼ã³åºãå½¢ã«ãããã¨èãã¾ããã
- å½åã¯ã»ãã¥ãªãã£ã®è¦³ç¹ããã¢ã¯ã»ã¹ãã¼ã¯ã³ãç´æ¥ãã©ã¦ã¶ä¸ã«ä¿åãããã¢ã¯ã»ã¹ãã¼ã¯ã³ãå«ãã»ãã·ã§ã³æ å ±ãJWTã®å½¢å¼ã§HttpOnly Cookieã«ä¿æããããã¨èãã¦ãã¾ãããããããååã«æå¹æéã®çãã¢ã¯ã»ã¹ãã¼ã¯ã³ãå©ç¨ãããã¨ã§ãã¢ã¯ã»ã¹ãã¼ã¯ã³ããã©ã¦ã¶ã®LocalStorageä¸ã«ä¿æããã¢ã¯ã»ã¹ãã¼ã¯ã³ãåçºè¡ããå ´åã«éãHttpOnly Cookieã¨ãã¦ä¿åãããã»ãã·ã§ã³IDãç¨ããããå¤æ´ãã¾ããã
- ã¢ã¯ã»ã¹ãã¼ã¯ã³ã¯ãã©ã¦ã¶ä¸ã«ä¿åããããã¼ã¯ã³ã®åçºè¡ã«ã¯iOSãAndroidã¢ããªã¨å ±éã®ãã¤ã¯ããµã¼ãã¹ãå©ç¨ãã¦ãããããWebãã¼ã ã¨ãã¦web-sessionãã¤ã¯ããµã¼ãã¹ãéç¨ããå¿ è¦ããªããªãã¾ããã
ãªããWebãã¤ã¯ããµã¼ãã¹ã®è²¬åãåå²ãèæ ®ããéã«ãæ確ãªçç±ããªãéãã¯ãã¤ã¯ããµã¼ãã¹ãåå²ããªãã¨ããæ¹éãåãã¾ãããWebãµã¼ãã¹ã¯ãWebãã¼ã¸ãåä½ããããã«å¿ è¦ãªJavaScriptãªã©ã®ãã¡ã¤ã«ããã©ã¦ã¶ãããã¦ã³ãã¼ããããã¨ã§åä½ãã¦ãã¾ãããã®ãããURLãã¨ã«ç°ãªããã¤ã¯ããµã¼ãã¹ããã³ã³ãã³ããé ä¿¡ããå ´åããµã¼ãã¹ãå¤ããã¨å¿ è¦ãªãã¡ã¤ã«ãå¤ãããããã£ãã·ã¥å¹çãæªããªãããµã¼ãã¹ãç´°ããåå²ããããã¨ã¦ã¼ã¶ã¼ä½é¨ã«æªå½±é¿ãããããã¾ãããã®ãããweb-surugaãã¤ã¯ããµã¼ãã¹ãå¤ãã®å½¹å²ãæã¤ãã¨ã許容ãããµã¼ãã¹ã極ååå²ããªãæ¹éãåãã¾ããã
ãããã¦æ°ããã¢ã¼ããã¯ãã£ã®æ çµã¿ã決ã¾ããéçºãé²ã¿ã¾ãããWeb re-architectureã®éçºã§ã®åçãæ´»ããã¦ãã»ãã·ã§ã³ç®¡çãAPIå¼ã³åºãã®å®è£ ãã§ããã¾ã§ã¯ãç°¡æçã«APIãå¼ã³åºããéçºç¨ã®BFFãæä¾ãããã¨ã§ãããã³ãã¨ã³ãã®å®è£ ãã¹ã ã¼ãºã«é²ããããããã«ãã¾ãããã¾ããCI/CDè¨å®ãEnd-To-Endãã¹ãã®å®è£ ãKubernetesä¸ã®ã¤ã³ãã©æ§ç¯ãªã©ã§ãWeb re-architectureã®éã«å¹ã£ãç¥èããã¦ãã¦ãæ´»ãããã¨ãã§ãã¾ããã
ãã°ããã¯web-2ãweb-fujiä¸ã®æ©è½è¿½å ã並è¡ãã¦è¡ããã¦ãã¾ããããããã¦web-2ãweb-fujiã«å¯¾ããæ©è½è¿½å ãæ¢ããWebã®éçºãã¼ã å ¨ä½ã§GroundUp Webã®å®è£ ãé²ãã¾ããã
1å¹´åå¾ã®éçºæéãçµã¦ããªãªã¼ã¹ã®æºåãæ´ã£ã¦ãã¾ãããããã¾ã§ã®ã¡ã«ã«ãªWebç㯠https://www.mercari.com/jp/ é
ä¸ã®URLãå©ç¨ãã¦ãã¾ããããã¡ã«ã«ãªUSçã https://www.mercari.com ãå©ç¨ãã¦ãããæ¥æ¬çã¨USçã§ãã¡ã¤ã³ãåãããããGroundUp Webã®ãªãªã¼ã¹å¾ã¯ https://jp.mercari.com ã®ãã¡ã¤ã³ã«åãæ¿ãããã¨èãã¦ãã¾ããã
ãã®ããã以ä¸ã®ããã«æ®µéçã«ãªãªã¼ã¹ãè¡ã£ã¦ããæ¹éã¨ãã¾ããã
- ã¡ã«ã«ãªç¤¾å¡ã対象㫠https://jp.mercari.com ãéå®çã«å ¬éãããã£ã¼ãããã¯ãéãã (Internal Release)
- ä¸å®ã®å²åã®ã¦ã¼ã¶ã¼ã«å¯¾ãã https://www.mercari.com/jp/ ãã https://jp.mercari.com ã«opt-inå½¢å¼ã§ãªãã¤ã¬ã¯ããã (Limited Release)
- https://www.mercari.com/jp/ é ä¸ã®ç§»è¡å¯¾è±¡ã®ãã¼ã¸ã«å¯¾ãããã¹ã¦ã®ãªã¯ã¨ã¹ãã https://jp.mercari.com ã«ãªãã¤ã¬ã¯ããã (Full Release)
ã¾ãInternal Releaseã2021å¹´3æã«å®æ½ãããã¨ãã§ãã¾ããããCodecovã¸ã®ä¸æ£ã¢ã¯ã»ã¹ã«ããã»ãã¥ãªãã£ã¤ã³ã·ãã³ã (https://about.mercari.com/press/news/articles/20210521_incident_report/ ) ã«å¯¾ããå
¨ç¤¾çãªå¯¾å¿ã®ãããéçºãä¸åº¦åæ¢ããæéãæã¿ã¾ããã
éçºãåéããå¾ãLimited ReleaseãFull Releaseã«åãããªãã¤ã¬ã¯ãå¦çã®è¨è¨ã»å®è£
ãè¡ãã¾ãããããã¾ã§ã¯ https://www.mercari.com/jp/ é
ä¸ã®ãã¹ãã¨ã«web-2ãweb-fujiããªã¯ã¨ã¹ããå¦çãããããªå½¢ã¨ãªã£ã¦ãããããweb-2ãweb-fujiã®ããããã«ãªãã¤ã¬ã¯ãã®å¦çãå®è£
ãã¾ããã
ããããéçºã®å¾ãç¡äº8æ5æ¥ã«Limited Releaseãéå§ããå¾ã
ã«ãªãã¤ã¬ã¯ãã®å²åãå¢ããã¦ãã£ãå¾ã«ã9æ29æ¥ããã£ã¦Full Releaseãå®æ½ã§ãã¾ããã
GroundUp Webããªãªã¼ã¹ããjp.mercari.com ã®ãã¡ã¤ã³ããweb-surugaãweb-authã®ã³ã³ãã³ããé ä¿¡ããå½¢ã«ãªãã¾ãã
ãã®è¨äºã§ã¯åWebãã¤ã¯ããµã¼ãã¹ã®å½¹å²ãä¸å¿ã«è¨è¿°ãã¦ãã¾ãããGroundUp Webããã¸ã§ã¯ãã®ä¸å¿ãæ
ã£ã¦ããweb-surugaãã¤ã¯ããµã¼ãã¹ã®ã¢ã¼ããã¯ãã£ãéçºä½å¶ãªã©ã«ã¤ãã¦ã¯ã以ä¸ã®è¨äºã«è¨è¼ããã¦ãã¾ãã
https://engineering.mercari.com/blog/entry/20210810-the-new-mercari-web/
web-2 sunset ãç®æã㦠(2021/09ã)
GroundUp Webã®Full Releaseã¯ç¡äºã«çµããã¾ãããããã¹ã¦ã® https://www.mercari.com/jp/ é ä¸ã®ãã¼ã¸ã https://jp.mercari.com ã«ãªãã¤ã¬ã¯ããããããã§ã¯ãªããå¼ãç¶ãweb-2ãé ä¿¡ãã¦ãããã¼ã¸ãæ®ã£ã¦ãã¾ãããã¾ããWeb re-architectureã®éã«ä½æããweb-fujiãweb-graphqlãweb-sessionã¨ãã£ããµã¼ãã¹ã¯ãªãã¤ã¬ã¯ãå¦çã ãã®ããã«æ®ããã¦ãã¾ããã大é¨åã®æ©è½ãå©ç¨ãããªããªã£ãã¨ãã£ã¦ããã¤ã³ãã©ã®ã¡ã³ããã³ã¹ãã»ãã¥ãªãã£å¯¾çãªã©ã¯ç¶ç¶ãã¦è¡ãå¿ è¦ãçããããã次ã®ç®æ¨ã¨ãã¦ãweb-2ãweb-fujiãweb-graphqlãweb-sessionã¨ãã£ããµã¼ãã¹ã®ã¤ã³ãã©ãå®å ¨ã«åé¤ãããã¨èãã¾ãããããã¯web-2 sunsetããã¸ã§ã¯ãã¨åä»ãããã¾ããã
ã¾ãããªãã¤ã¬ã¯ãå¦çã®ã¿ãè¡ã£ã¦ããweb-fujiãweb-graphqlãweb-sessionã®åé¤ã«åãæããã¾ãããªãã¤ã¬ã¯ãå¦çèªä½ã¯å¼ãç¶ãæ®ãã¦ããå¿
è¦ãããã¾ããããã®ããã ãã«ãããã®ã¤ã³ãã©ãç¶æããå¿
è¦ã¯ããã¾ãããã¾ããGroundUp Webã®ãªãªã¼ã¹å¾1ã¶æéã¯ãã°ã¤ã³æ¸ã¿ã®ã¦ã¼ã¶ã¼ã®ãã°ã¤ã³ç¶æ
ãç¶æããã¾ã¾ãªãã¤ã¬ã¯ããè¡ã£ã¦ãããããcookieã¨ã¢ã¯ã»ã¹ãã¼ã¯ã³ã®åãæ¿ããGroundUp webåãã®ã¢ã¯ã»ã¹ãã¼ã¯ã³çºè¡ãªã©ã®å¦çãè¡ã£ã¦ãã¾ãããããã®å¦çã«ã¤ãã¦ãåé¤ããæ¹éã§ããããããªãã¨ãä»ã®ãµã¼ãã¹ã¨ã®ä¾åé¢ä¿ãèæ
®ããå¿
è¦ããªãã https://www.mercari.com/jp/ é
ä¸ã®URL㨠https://jp.mercari.com ã®URLããããã³ã°ããã ãã§è¯ãã§ãã
ãã®ããã2021å¹´11æã«ãããã®ãªãã¤ã¬ã¯ãå¦çã®ã¿ãå®è£
ããweb-redirectionã¨ãããã¤ã¯ããµã¼ãã¹ãæä¾ããããã«ããweb-fujiãweb-graphqlãweb-sessionã®ã¤ã³ãã©ãåé¤ãããã¨ãã§ãã¾ããã
web-redirectionã¯ãéç¨ã®è² æ
ãæ¸ããããã¨ããç¹ããå®è£
ã«ããç¨åº¦ã®æè»æ§ããããããã¨ããç¹ãããCloud Functionã«ã¦å®è£
ããã¦ãã¾ãã
web-redirectionãµã¼ãã¹ããªãã¤ã¬ã¯ãå¦çãè¡ããã¨ã§ãweb-fujiãweb-graphqlã®ãµã¼ãã¹ãåé¤ã§ãã¾ãã
次ã«ãweb-2ãé ä¿¡ãã¦ãããã¼ã¸ãã©ããããã§ããæ®ã£ã¦ãããã¼ã¸ã¯ã以ä¸ã®ããã«åé¡ã§ãã¾ããã
- åãµã¼ãã¹ã®è¦ç´ããã©ã¤ãã·ã¼ããªã·ã¼ãªã©
- ãã£ã³ãã¼ã³ãç¹å®ã®ãµã¼ãã¹ã«å¯¾ããã©ã³ãã£ã³ã°ãã¼ã¸
- ã客ãã¾åãã«ã¡ã«ã«ãªã®å©ç¨æ¹æ³ãæ¡å ãããã¼ã¸ï¼ã¡ã«ã«ãªã¬ã¤ãï¼
- Universal Linkãªã©ãç¨ãã¦ã¢ããªçã®ã¡ã«ã«ãªãç«ã¡ä¸ãããã¼ã¸
ãã®ãã¡ãã¡ã«ã«ãªã¬ã¤ãã«ã¤ãã¦ã¯ãå
製ã®CMSæ©è½ãªã©ãããç¬ç«æ§ãé«ãæ©è½ã§ãããããæ°ãã«help-centerãã¤ã¯ããµã¼ãã¹ãç«ã¡ä¸ãã¦ã³ã³ãã³ãã移è¡ããè¨ç»ãæ¢ã«ããã¾ããã
ãã以å¤ã®ãåãµã¼ãã¹ã®è¦ç´ããã©ã¤ãã·ã¼ããªã·ã¼ãããã£ã³ãã¼ã³ãç¹å®ã®ãµã¼ãã¹ã«å¯¾ããã©ã³ãã£ã³ã°ãã¼ã¸ãã«ã¤ãã¦ã¯ãAPIå¼ã³åºããªã©ãå¿
è¦ãªããHTMLãªã©ã®éçãªãã¡ã¤ã«é
ä¿¡ããæä¾ã§ããã¨èãããããããæ°ãã« web-static-page ã¨ãããµã¼ãã¹ãç«ã¡ä¸ãããã¡ãã«ç§»è¡ãããã¨ã決ãã¾ããã
ã¾ãããUniversal Linkãªã©ãç¨ãã¦ã¢ããªçã®ã¡ã«ã«ãªãç«ã¡ä¸ãããã¼ã¸ãã¯å®è³ªçã«ãªãã¤ã¬ã¯ãå¦çããã¦ãããã®ã ã£ãã®ã§ãweb-redirectionãµã¼ãã¹ä¸ã«å®è£
ãããã¨ã¨ãã¾ããã
è¤æ°ã®ãµã¼ãã¹éã§å
±éã®ãã¡ã¤ã³ãç¨ããã¨ãLocalStorageãCookieã®æ
å ±ãæå³ããå
±æããããªã©ã®æ½å¨çãªåé¡ãçããããããããã®ãµã¼ãã¹ã¯ããããå¥ã®ãã¡ã¤ã³ä¸ã§ã³ã³ãã³ããé
ä¿¡ãããã¨ã¨ãã¾ããã
ããããã®ãµã¼ãã¹ã®ãªã¼ãã¼ã·ãããæã¤ãã¼ã ã«ããããããã®éçºã¯ä¸¦è¡ãã¦é²ãããã以ä¸ã®ããã«ãã¼ã¸ã®ç§»è¡ãå®æ½ã§ãã¾ããã
- 2022å¹´4æ: help.jp.mercari.com ãã¡ã¤ã³ã¨ããã«å¯¾å¿ããhelp-centerãã¤ã¯ããµã¼ãã¹ã®ãªãªã¼ã¹ã対å¿ãã https://www.mercari.com/jp/ é ä¸ã®ãã¼ã¸ã®ãªãã¤ã¬ã¯ã
- 2022å¹´5æ: static.jp.mercari.com ãã¡ã¤ã³ã¨ããã«å¯¾å¿ããweb-static-pageãã¤ã¯ããµã¼ãã¹ã®ãªãªã¼ã¹ã対å¿ãã https://www.mercari.com/jp/ é ä¸ã®ãã¼ã¸ã®ãªãã¤ã¬ã¯ã
- 2022å¹´6æ: web-2ä¸ã®ãªãã¤ã¬ã¯ãå¦çããã¹ã¦web-redirectionãµã¼ãã¹ã«åãæ¿ã
2022å¹´6æããã£ã¦ https://www.mercari.com/jp/ é ä¸ã®ãã¹ã¦ã®ãªã¯ã¨ã¹ãããªãã¤ã¬ã¯ããããweb-2ã¸ã®ãã©ãã£ãã¯ããªããªã£ã¦ãã¾ãããããã¦ãã¤ãã«8æ4æ¥ããã£ã¦web-2ã®ã¤ã³ãã©ã¯å®å ¨ã«åé¤ããã¾ããããããã¦ã4年以ä¸ã«æ¸¡ã£ãã¡ã«ã«ãªWebã®ãã¤ã¯ããµã¼ãã¹åã¯å®äºããã®ã§ãã
ã³ã³ãã³ããã¨ã«é©åãªãã¤ã¯ããµã¼ãã¹ããªã¯ã¨ã¹ããå¦çãã¦ãã¾ã
ãããã«
ã¢ã¼ããã¯ãã£ã¯ãã®æã
ã®ã¢ããªã±ã¼ã·ã§ã³ãçµç¹ã®ãã¼ãºãå©ç¨ã§ããæè¡ã«åããã¦å¤ããç¶ãããã®ã§ããããã®4å¹´ãçµã¦ä½ããããã¤ã¯ããµã¼ãã¹ãå¤ããç¶ããã§ãããã
ãã®è¨äºãå·çãã¦ããç¾æç¹ã§ããWebãã¼ã ã§ã¯ä»¥ä¸ã®ãããªã¢ã¼ããã¯ãã£ã®å¤æ´ãè¨ç»ãã¦ãã¾ãã
- Dynamic RenderingããSSRã¸ã®ç§»è¡ãDynamic Renderingãµã¼ãã®CPUè² è·ã«ããã³ã¹ãã®å¢å ããã¬ã¹ãã³ã¹ã®é ãã«ããSEOã¸ã®å½±é¿ãéã¿ã¦ãSSRã¸ã®åãæ¿ããè¡ããããã®
- web-authã https://jp.mercari.com ããç¬ç«ãããã¡ã¤ã³ä¸ã«æä¾ãããweb-surugaããã®ç¬ç«æ§ãæ ä¿ããã«ã¼ãã£ã³ã°ã容æã«ããããã®ãã®
åè
ã®å¤æ´ã«ã¤ãã¦ã¯ãå®ã¯ã¢ã¼ããã¯ãã£è¨è¨æã«ãããã©ã¼ãã³ã¹ä¸ã®æ¸å¿µã¯ãããDynamic Renderingã®æ¡ç¨åã«è² è·ãã¹ããå®æ½ãã¦ãã¾ãããããããå½æã®è² è·ãã¹ãã§ã¯ã¾ã ã¢ããªã±ã¼ã·ã§ã³èªä½ãã§ãã¦ããªãã£ããããä»®ã®ã³ã³ãã³ãã«å¯¾ãã¦ã¬ã³ããªã³ã°å¦çãå®æ½ãã¦ããããã®çµæãæçµçãªã¢ããªã±ã¼ã·ã§ã³ã¨å¤§ããä¹é¢ãã¦ãã¾ãããè² è·ã®åé¡ãèªèãããã®ã¯ãªãªã¼ã¹ã®ç´åã§ããã®æç¹ã§SSRã«ç§»è¡ãããã¨ã¯ç¾å®çã§ã¯ãªããã客ãã¾ã«å½±é¿ã®ãããµã¼ãã¹ã§ããªãããè¦éã£ã¦ãããã®ã§ããã
ä¸æ¹ã§ãDynamic Renderingãå©ç¨ãã¦ããã®ã¯web-surugaã®ã¿ã§ããããã®å¤æ´ã¯ä»ã®ãµã¼ãã¹ã«ã¯å½±é¿ãã¾ããããã®é¢ã§ã¯ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã®ã¡ãªãããåºã¦ããã¨è¨ããã§ãããã
ãã®4å¹´éã®ã¢ã¼ããã¯ãã£å¤æ´ãéçºã®æµããæ¯ãè¿ã£ã¦è¦ã¦ã¿ãã¨ãæ¹åã§ããç¹ãåçãã¹ãç¹ãå¤ãè¦ã¤ããã¾ãããããæ¥ãããéé£ãããããã®ã§ã¯ãªããå¤æ´ã®ç®çã¨ããã»ã¹ãçµæãæ¯ãè¿ããã¾ã次ã®å¤æ´ã«æ´»ããã¦ãããã¨ã§å¤åã«å¼·ãçµç¹ãçã¾ããã®ã ã¨èãã¦ãã¾ãããã®è¨äºããã®ä¸å©ã¨ãªãã°å¹¸ãã§ãã
æå¾ã«ãããã¾ã§web-2ã®éçºã«è²¢ç®ããã ãããã¹ã¦ã®æ¹ãWeb re-architectureããã¸ã§ã¯ããGroundUp Webããã¸ã§ã¯ããweb-2 sunsetããã¸ã§ã¯ãã«é¢ãã£ããã¹ã¦ã®æ¹ã«ãå¿ããã礼ãç³ãä¸ãããã¨æãã¾ããããã¾ã§ã®ã¡ã«ã«ãªWebã®åºç¤ãæ¯ãã¦ããã ãããã¨ãä¸ã¤ä¸ã¤ã®ããã¸ã§ã¯ãã®éç¨ãããä»ã®ã¡ã«ã«ãªWebãå½¢ä½ããããã¨ã«ã¨ã¦ãæè¬ãã¦ãã¾ããæ¬å½ã«ãããã¨ããããã¾ããã