LinguaLeoãŠãŒã¶ãŒã¯ã ãžã£ã³ã°ã«ã§è±èªãåŠã³å§ããŸã-è€éãããã©ãŒããããããŒãã®ã¬ãã«ãç°ãªãæ°åã®è³æã®ãªããžããªã ãã€ãã£ãã¹ããŒã«ãŒã®ã¹ããŒããèããç解ããèªåœãå¢ããããšã段éçã«åŠã³ãŸãã 誰ãææ³ãå¿ èŠãšããŸããïŒ ã³ãŒã¹ã«è¡ããŸãã èªåœã¯ãå人èŸæžã«ãªãã¿ã®ãªãåèªãè¿œå ããã ãã§ãªããåã ã®åŠç¿ã«å©çšã§ããæºåæžã¿ã®åèªã»ããã®å©ããåããŠããžã£ã³ã°ã«ããè£å ãããŸã ã ã³ãã¥ãã±ãŒã·ã§ã³ã»ã¯ã·ã§ã³ã§ã¯ãè±èªã§ãã€ã¢ãã°ãè¡ãããªã¢ã«ã¿ã€ã ã¢ãŒãã§ä»ã®LinguaLeoãŠãŒã¶ãŒãšèšèªãç·Žç¿ããã³ãã¥ãã±ãŒã·ã§ã³ã®ãããã¯ãéžæã§ããŸãã è±èªã®ã¿ã®ã³ãã¥ãã±ãŒã·ã§ã³ïŒ
è±èªã§ãã€ã¢ãã°ãäœæããããã«ãNode.jsãDynamoDBïŒãã¹ãŠAWSã§ïŒã䜿çšããŸããã 次ã«ãçµéšãå ±æããŸãã
âNode.jsã䜿çšãã çç±
ã...ãŠãŒã¶ãŒã«ã³ãã¥ãã±ãŒã·ã§ã³ã®æ©äŒããã¹ãŠæäŸããããã«ãNode.jsãéžæããŸããã ãªãã§ïŒ Node.jsã¯ãèšå€§ãªæ°ã®ã¢ãžã¥ãŒã«ãããã¹ããªãŒã ã§ã®äœæ¥ã«é©ããŠããŸã ã ããã«ãNodeã§äœæ¥ããæèœãªJavaScriptããã°ã©ããŒã¯ããµãŒããŒããŒãã ãã§ãªããã¿ã¹ã¯ã®ã¹ã³ãŒãå šäœãå®è£ ã§ããŸãïŒããšãã°ãErlangã¹ãã·ã£ãªã¹ããšã¯ç°ãªããŸãïŒã
ãµãŒããŒãšã¯ã©ã€ã¢ã³ãéã®ããã©ã³ã¹ããŒãããŒãããšããŠãæ å ±ãé ä¿¡ããæéã®æ¹æ³ãšããŠWebSocketã䜿çšããŸããã
ã¯ãã¹ãã©ãããã©ãŒã ã®åé¡ã解決ããããã«ã Sock.JSã©ã€ãã©ãªãéžæããŸãã ã 第äžã«ãWSã®W3Cæºæ ã«ããã第äºã«ãSock.JSã¯ç§ãã¡ã®ããŒãºã«æé©ã§ãã
è¡ããŸãããã Amazon EC2ã®ãã¯ã©ãŠããæ©èœã§Node.jsããŒã¢ã³ãèµ·åããŸããã ã¢ããªã±ãŒã·ã§ã³ã¯gitãä»ããŠãããã€ãããŸãã foreverã¢ãžã¥ãŒã«ã¯ããã®ã³ã°ãšåèµ·åãæ åœããŸãã ã¡ãªã¿ã«ãAmazonã«ã¯éåžžã«äŸ¿å©ãªãµãŒãã¹ã§ããAmazon CloudwatchããããŸãã ãã®æ©èœã«ãããã·ã¹ãã ã®äž»èŠãªãã©ã¡ãŒã¿ãç£èŠã§ããŸããæãéèŠãªããšã¯ããã®å°å³ã¯ãæ¬åœã«éèŠãªãã®ã ããç£èŠã§ããã«ã¹ã¿ãã€ãºå¯èœãªéç¥ã§ãã ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã«é¢ãã詳现æ å ±ãååŸããã«ã¯ã nodetimeã䜿çšããŸã ã
dynodeã¢ãžã¥ãŒã«ã¯ãDynamoDBãæäœããããã®ãã©ã€ããŒãšããŠäœ¿çšãããŸãã 圌ã¯èªåèªèº«ãç«èšŒããŸããããäžå®å šãªæè¡ææžã¯èèã®æšœã«ã¿ãŒã«ãå ããŸããã Amazonã®å ¬åŒNode.js SDKã¯åŸã§çºè¡šããããŸã éçºè ãã¬ãã¥ãŒæ®µéã«ãããŸãã ãã®ãããª
âNode.jsã®åŸ®åŠãªç¹
ãã€ã¢ãã°ãµãŒããŒã§ã®ãŠãŒã¶ãŒèªèšŒã®åé¡ã«ç¹ã«æ³šæãæããŸããã ãµãŒããŒCookieã®æ¿èªã«ã€ããŠã¯ãåŒç€Ÿã責任ãè² ããŸãã ããã¯é床ã®ç¹ã§ã¯éåžžã«ãé«äŸ¡ãªããœãªã¥ãŒã·ã§ã³ã§ãããå®å®æ§ãšã»ãã¥ãªãã£ã«å ããŠãç¬ç«ãããµãŒãã¹æåã®ã¢ãŒããã¯ãã£ãå°è±¡çã§ãã
ã©ã®ããã«æ©èœããŸããïŒ ãŠãŒã¶ãŒCookieã¯WebSocketãä»ããŠãã€ã¢ãã°ãµãŒããŒã«éä¿¡ãããŸããâãã€ã¢ãã°ãµãŒããŒã¯ãåä¿¡ããCookieãå«ããªã¯ãšã¹ããAPIã«éä¿¡ããããšã§Cookieã®æå¹æ§ã確èªãããŠãŒã¶ãŒããŒã¿ãæ¢ã«éä¿¡ããŸãã ããŒã¿ããšã©ãŒãªãã§åä¿¡ãããå ŽåãDialogãµãŒããŒã¯ãã®ãžã§ããå®è¡ïŒèš±å¯ïŒããããŒã¿ããŠãŒã¶ãŒã«éä¿¡ããŸã ã
å€ãã®äººãèªå® ã ãã§ãªãè·å Žã§ãLinguaLeoãç·Žç¿ããŠããããšãç¥ã£ãŠããŸãã å€ãã®å ŽåãäŒæ¥ã®ãã¡ã€ã¢ãŠã©ãŒã«ãé床ã«å³å¯ã«æ§æãããŠãããããæšæºããŒã以å€ã®ãã¹ãŠã®ããŒãã䜿çšã§ããŸããã ãããèŠããŠãããWebSocketæ¥ç¶ã«ã¯ããŒã443ã䜿çšããŸãïŒhttpsã«ãã€ã³ãããŸããïŒã ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãæœåšçãªãããã¯ãŒã¯ã®åé¡ãåé¿ããŸãã
âDynamoDBã® æ©èœ
1幎ã»ã©åãAmazonã¯åæ£åNoSQLããŒã¿ããŒã¹Amazon DynamoDBããªãªãŒã¹ããŸããã ã·ã¹ãã ã¢ãŒããã¯ãã£ã®èšèšæ®µéã§ãMongoDBãšDynamoDBã®2ã€ã®è£œåããéžæããå¿ èŠããããŸããã 管çã®é£ããããæåã®ãªãã·ã§ã³ãæåŠããŸããã補åã®å Žåã¯ãµããŒããå¿ èŠãªããããéžæã¯Amazonã«å§ããããŸããã ãŸãããã¡ãããããã«äœ¿çšããããã«èªåã§æè¡ããå£ããããšã¯èå³æ·±ãããšã§ããã
DynamoDBã§ã®äœæ¥ã¯ããããŸã§èŠãŠãããã¹ãŠã®ãã®ãšã¯éåžžã«ç°ãªãããšãå€æããŸããã ãã®ããšãããSaaS補åã§ãããããhttpãªã¯ãšã¹ãã®æéãèæ ®ããå¿ èŠããããŸããã AmazonããŒã¿ã»ã³ã¿ãŒå ã§ã¯ãå¹³åã¯ãšãªæéã¯çŽ20ããªç§ã§ãããã®ãããçµè«ã«è³ã£ãã®ã¯ãã€ã³ããã¯ã¹ã®ã¿ã䜿çšããŠãã¹ãŠã®éžæãè¡ãããšãéåžžã«æãŸããããšã§ãïŒããã¯é«éã§å®äŸ¡ã§ãïŒãã¹ãã£ã³èŠæ±ã¯ãåæãŸãã¯ç§»è¡å°çšã«äœ¿çšããå¿ èŠããããŸãã
â ããŒã¿æ§é
ãã€ã¢ãã°-ãã€ã¢ãã°ã®ã¡ã¿ããŒã¿ãä¿åããæåŸã®ã¡ãã»ãŒãžããã£ãã·ã¥ããŸãã
UserDialogs-ãŠãŒã¶ãŒãã€ã¢ãã°ã®ãªã¹ãããã£ãã·ã¥+æªèªã¡ãã»ãŒãžã®ã«ãŠã³ã¿ãŒã
ã¡ãã»ãŒãž-ãã¹ãŠã®ãŠãŒã¶ãŒã¡ãã»ãŒãžã
User2User-ãã€ã¢ãã°ã®åå è ã
äŸ1
ãè±èªã®ãã€ãã€ã¢ãã°ãããŒãžã®ãã¹ãŠã®ãŠãŒã¶ãŒãã€ã¢ãã°ãååŸããããã»ã¹ã¯ãéæšæºã§å®è£ ãããŠããŸãã ãã®ããŒãžã§ã¯ãæªèªã¡ãã»ãŒãžã®ç·æ°ãšåãã€ã¢ãã°ã®æåŸã®ã¡ãã»ãŒãžãå«ãããã¹ãŠã®ãã€ã¢ãã°ããŠãŒã¶ãŒã«è¡šç€ºãããŸãã
ããŒã¿ã¯2ã€ã®ã¯ãšãªã§éžæãããŸãã 1ã€ç®ã¯ã Queryã䜿çšããŠUserDialogsããŒãã«ãããã¹ãŠã®dialogldsããã§ããããããšã§ãã 2çªç®ã¯ãBatchGetItemãä»ããŠãã€ã¢ãã°ãååŸããŸãã ããããªãã¥ã¢ã³ã¹ããããŸã-BatchGetItemã¯äžåºŠã«æ倧100åã®ã¡ãã»ãŒãžãéžæããŸãã ãããã£ãŠããŠãŒã¶ãŒã242ãæã£ãŠããå Žåã3ã€ã®èŠæ±ãè¡ãå¿ èŠããããŸããããã«ã¯çŽ70ã100ããªç§ããããŸãã ããã念é ã«çœ®ããŠãããã©ãŒãã³ã¹ã®æé©åã®åäžã«åªãããã€ã¢ãã°ããŒã¿ãElasticCacheã«ãã£ãã·ã¥ããæ°ããã¡ãã»ãŒãžããšã«æŽæ°ããŸãã
äŸ2
ãã€ã¢ãã°ã«æ°ããã¡ãã»ãŒãžãè¿œå ããããšãéèŠã§ãã DynamoDBã®ã¬ã³ãŒããåŸ æ©ããªããããããŒã¿ããŒã¹ã®é床ã¯ããã»ã©éèŠã§ã¯ãããŸããã çµå±ã倧éã®èšé²ãå®æœããå¿ èŠããããããã¯ãã®åŸã®ãµã³ããªã³ã°ã®é床ã«éèŠãªåœ¹å²ãæãããŸãã æåã«ã Messages PutItemããŒãã«ã«æ°ããã¡ãã»ãŒãžãæžã蟌ã¿ã次ã«Dialogs UpdateItemããŒãã«ããã£ãã·ã¥ããŸãã 次ã«ãåãŠãŒã¶ãŒïŒUpdateItemïŒã®UserDialogsããŒãã«ã§messageCounterãã€ã³ã¯ãªã¡ã³ãããå¿ èŠããããŸãã çµå±ããã¹ãŠãèµ·ãããçªç¶ããŠãŒã¶ãŒã®1人ããã€ã¢ãã°ãåé€ããã¡ãã»ãŒãžã«ãŠã³ã¿ãŒããªã»ããããããšã«ããŸããã åèš= 4ãªã¯ãšã¹ãã§ãçŽ70ã100ããªç§ãæéå ã«åéãããŸãã æ®å¿µãªããããã®ãããªãã©ã³ã¶ã¯ã·ã§ã³ã¯DynamoDBã§ã¯ãµããŒããããŠããŸãããããã«ãããããŒã¿ã®æŽåæ§ãéèŠãªããã»ã¹ã«æ確ãªå¶éã課ããããŸãã
äžè¬ã«ã補åèŠä»¶ã®å€æŽã¯éåžžã«äžè¬çãªåºæ¥äºã§ãã ããã«ã¯ãããŒã¿æ§é ã®å€æãå¿ èŠã«ãªãå ŽåããããŸãã ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã§ã¯ãALTER TABLEã䜿çšããŠããã解決ããŸãããDynamoDBã§ã¯ãã®ããšã¯ãŸã£ãããããŸããã ããã§åè·¯ãå€æŽãããšãéåžžã«è²»çšãããããŸãã ããŒãã«ãåäœæãããã Elastic MapReduceã䜿çšããå¿ èŠããããŸãã äž¡æ¹ã®ãªãã·ã§ã³ãæ¯æãå¿ èŠããããŸãã 倧éã®ããŒã¿=倧éã®ãéã ããã«ã©ãã«ã察åŠããããã«ãScan'om 1ã¡ã¬ãã€ãã®ãã¹ãŠã®ããŒã¿ãéžæããŠãããæ°ããããŒãã«ã«æžã蟌ãå¿ èŠããããŸããã ããã«ã¯å€ãã®æéãããããŸãããããã¯DBAãäžè¶³ããŠããããã®è²»çšã§ãã
âDynamoDBã® å°è±¡
DynamoDBã®äœ¿çšã«é¢ããå®éšã¯æåããŸããã ããã¯ãæ¡åŒµã容æãªçŽ æŽãããããŒã¿ããŒã¹ã§ãã ããã䜿ã£ãŠç®¡çãå¿ããŠãã ããã ãã ããèŠè¿ãã«ãã¢ãŒããã¯ãã£èšèšæ®µéã§æ éã«åŠçããå¿ èŠãããããšãå¿ããªãã§ãã ããã ãã以å€ã®å Žåãããããçš®é¡ã®äºæããªãã¿ãŒã³ãšäžå¿«ãªã¬ãŒããããã§å¯èœã§ãã éèŠã§ã¯ãªãããŒã¿ã倧éã«ãããããããé »ç¹ã«äœ¿çšããå¿ èŠãããå Žåã¯ãDynamoDBã䜿çšããããšããå§ãããŸãã ç§ãã¡ã¯äœ¿çšããŸã-ç§ãã¡ã¯ããã奜ãã§ã:)
***
è±èªã®ãã€ã¢ãã°ã§ç°¡åãã€èªç¶ã«ã³ãã¥ãã±ãŒã·ã§ã³ããšã -å¿«é©ãªäŒç€Ÿã§è±èªãç·Žç¿ãã ããŒã ã«åå ããŸãããïŒ
Facebook ã Vkontakte ã Twitterã§ãã¥ãŒã¹ããã©ããŒããå°è±¡ãå ±æããŠæ¥œããã§ãã ããã ã³ãã¥ãã±ãŒã·ã§ã³ã®èªç±ã¯çŽ æŽãããïŒ
LinguaLeoããŒã