GameWithͰݕࡧγεςϜ͕ΘΕΔ·ͰElasticsearchษڧձ2019/02/20 αʔϏε։ൃ෦ R&DνʔϜΊΓʔ(@m3m0r7)
View Slide
Έͳ͞ΜɺHello Worldʂ
ͩΕʁΊΓʔ(@m3m0r7) Ͱ͢ɻը૾͏ͪͷϋϜελʔͷ Lily ͪΌΜͰ͢ɻ౦ژͷຊʹ͋Δ גࣜձࣾ GameWith ͱ͍͏ձࣾͰಇ͍ͯ·͢ɻ
ͱ͜ΖͰɺΈͳ͞Μ GameWith ͝ଘͰ͔͢ʁ
GameWith ʹ͍ͭͯ
GameWith ʹ͍ͭͯήʔϜ߈ུʮGameWithʯͰ͕͢ɺ࣮ΣϒαΠτҎ֎ʹΞϓϦ͕͋Γ·͢
ࠓ͜͜ͷݕࡧػೳʹ͍͓ͭͯ͠·͢
ॴ
͜ͷืू͔ΒݕࡧγεςϜͷ։ൃ͕࢝·Δ
ݕࡧγεςϜͷ։ൃͰҙࣝͨ͜͠ͱ
θϩϕʔε͔Βͷ։ൃͰҙࣝͨ͜͠ͱ• ҙࣝͨ͜͠ͱ5• ᶃ ୭Ͱ։ൃͰ͖ΔΑ͏ʹ͢ΔϝϯλϦςΟ• ᶄ ৽͍͜͠ͱʹઓ͢ΔϝϯλϦςΟ• ᶅ ࠳͚ͳ͍ϝϯλϦςΟ• ᶆ ਏ͍ঢ়گΛָ͠ΉϝϯλϦςΟ• ᶇ ۀ͠ͳ͍ͧͱ͍͏ڧ͍ϝϯλϦςΟ
νʔϜߏ
νʔϜߏ• ݕࡧγεςϜࣗମͷνʔϜߏ4໊ମ੍• αʔόʔαΠυΤϯδχΞ × 1• GameWith ͷΣϒ໘ͷ։ൃվम݉• ΠϯϑϥΤϯδχΞ × 1• ଞͷΠϯϑϥ໘ͷλεΫ݉• σΟϨΫλʔ × 1• GameWith ͷΣϒ໘ͷσΟϨΫγϣϯ݉• ίʔυϨϏϡϫʔ × 1• ෦• ଞʹiOS, AndroidΤϯδχΞ
༨ஊ
ϓϩδΣΫτ։࢝࣌ࢲͱ෦͚ͩ
ߟ͑ͳ͍͜ͱʹ͠Α͏
εέδϡʔϧ
9݄Ϛετ
ਖ਼ϦιʔεΓͳ͍
ͦΕͰΓ͖Δͧ
ٕज़બఆ
ٕज़બఆ• ։ൃڥDockerͰߏͨ͠• DockerΛ͏͜ͱʹΑΓɺԿ͕ڥʹ͋Δͷ͔໌֬ʹΘ͔ΔΑ͏ʹͳͬͨ• GameWith Vagrant Λ͏෩ை͕͋ΓɺͲ͏͍ͬͨϛυϧΣΞ͕͋Δ͔ɺͲ͏͍͏ߏʹͳ͍ͬͯΔͷ͔Ѳͮ͠Β͔ͬͨ• ։ൃڥͱϓϩμΫγϣϯڥͰඞཁͳڥͷࠩҟΛແ͔ͨͬͨ͘͠• ϓϩμΫγϣϯڥʹ͋Δ͕ɺ։ൃڥʹͳ͍ɺͱ͍͏ঢ়ଶΛ࡞Γͨ͘ͳ͔ͬͨ• ࣾͰDockerΛϓϩμΫγϣϯʹར༻͢Δͷ͜ͷϓϩδΣΫτ͕ॳΊͯ• ৽͍͠ઓΛ͢Δ͜ͱ͍͍͜ͱɻ৽͍͜͠ͱʹઓΛͨ͠ͱ͍͏લྫΛ࡞ΓपΓͷϝϯόʔɺࣗΒਐΜͰઓ͍ͯ͘͠෩ʹ͍͖͔ͯͨͬͨ͠
ٕज़બఆ• Elasticsearch ͱ PHP + Laravel Λࠓճٕज़બఆͨ͠• GameWith AWS Λ༻͍ͯ͠Δ͕ɺAWS Elasticsearch ServiceΘͣAWSEC2 ͱ Docker ্ʹElasticsearchΛཱͯΔ͜ͱʹɻ• GameWith ήʔϜ߈ུใΛऔΓѻ͏ಛੑ͔Βݻ༗໊ࢺଟࣙ͘ॻͷ͕ݒ೦͞Εͨɻ• ࣙॻ Sudachi Λ༻• ৽ͨͳࢼΈΛ͔ͨͬͨ͠• ϊϦɺදهਖ਼نԽͯ
ٕज़બఆ• Elasticsearch ͱ PHP + Laravel Λࠓճٕज़બఆͨ͠• Elasticsearchຊମͱͷ௨৴PHPΛٕज़બఆͨ͠• GameWithPHPΛϝΠϯݴޠͱͯ͠ѻ͍ͬͯΔձࣾ• ຊ৽ͨͳઓͱ͍͏ϚΠϯυͰ Go ʹ͠Α͏ͱࢥ͕ͬͨɺelasticެࣜͷϥΠϒϥϦ͕࣌ͳ͔ͬͨɻ• PHPͰ͋Εɺelasticެ͔ࣜΒϥΠϒϥϦ͕৴͞Ε͍ͯΔ• ͨͩɺࠓճͷݕࡧγεςϜͰ PHP ͷGuzzle ΛͬͯεΫϥονͰ࡞ͬͨɻ
Πϯϑϥߏ
Πϯϑϥߏ※μογϡϘʔυͱGameWithͷϥΠλʔ͕༻͢Δཧը໘ͷ͜ͱͰ͢
Πϯϑϥߏ• ͳͥ͜ͷߏʹ͠Α͏ͱͨ͠ͷ͔• શจݕࡧΤϯδϯΞϓϦ͔ΒࢀরɺμογϡϘʔυ͔Βॻ͖ࠐΈ͕ߦΘΕΔɻ• ήʔϜͷ߈ུهࣄසൟʹߋ৽͞ΕΔͨΊɺߋ৽ใআใΛΩϡʔͰॲཧ͔ͨͬͨ͠ͷͰɺAmazon SQSΛՃ͑ͨ• ElasticsarchͷԽͷͨΊσʔλϊʔυ͕2Ҏ্ඞཁͩͬͨ• ࠓճͷϓϩμΫτͰͲΕ͚ͩͷΞΫηε͕͋Δ͔ఆͰ͔͠ग़ͤͳ͔͕ͬͨ1ͩͱϊʔυ͕յΕͨࡍͷରॲ͕Ͱ͖ͳͦ͞͏Ͱ͋ΔͨΊ
Πϯϑϥߏ• ࣮ࡍͷߏ
ࣾʹݟ͕ͳ࣌͘͜ͷΠϯϑϥߏ͕ݶքͩͬͨ
ϖʔδωʔγϣϯ
ϖʔδωʔγϣϯ• ϖʔδωʔγϣϯΛͲ͏͠Α͏͔໎ͬͨ• ࠷ॳIDϕʔε͔ɺϕʔεͰͷϖʔδωʔγϣϯΛߟ͍͑ͯͨ• OFFSETϕʔεͰߟ͍͑ͯͳ͔ͬͨ• GameWith ͷಛੑ্ɺϦΞϧλΠϜʹهࣄ͕ߋ৽͞ΕΔ͜ͱ͕ݒ೦͞ΕΔ• ಛʹήʔϜͷΠϕϯτ։࢝࣌ʹݕࡧγεςϜͷτϥϑΟοΫ͕૿େ͢Δ͜ͱ͕ఆ͞Εͨ• ·ͨͦΕͱಉ࣌ʹΠϕϯτͷใΛϦΞϧλΠϜͰߋ৽͍ͯͨ͘͠ΊɺOFFSETϕʔεͩͱ1݅ͱ2݅ʹಉ͡ใ͕ग़ݱ͢ΔՄೳੑ͕͋ͬͨͨΊɺࠓճର֎ͱͨ͠ɻ
໎ͬͨ݁Ռ
͜Ε
ϖʔδωʔγϣϯ• ϖʔδωʔγϣϯ Elasticsearch ͷ Scroll Λ͏͜ͱʹ• ͜ͷػೳΛ͑ɺϦΞϧλΠϜʹهࣄ͕ߋ৽͞Εͯେৎͦ͏• ϢʔβʔମݧΛଛͳΘͣʹݕࡧ݁ՌΛදࣔͰ͖ͦ͏
ൃੜ
ൃੜ• ݕࡧ݁Ռ͕ݕࡧΛ͢Δͨͼʹҟͳͬͨ• ࠷ॳݪҼ͕Α͘Θ͔Βͳ͔ͬͨ• Α͘Α͘ௐΔͱ AWS ͷ Internal Elastic Load Balancing Ͱෛՙࢄ͍ͤͯ͞Δ͜ͱʹؾ͍ͮͨ• Elasticsearch ͷ Scroll ͕ฦ͕͢ҟͳΔͷͨΓલͩͬͨAWS ͷ Sticky Session Λͬͯϖʔδωʔγϣϯ͢ΔΠϯελϯεΛಉ͡ରʹ͢ΔΑ͏ʹͨ͠
ൃੜϔομ͔ΒAWS ELBΛऔಘ͢Δηογϣϯใͱͯ͠อ࣋͞Ε͍ͯΕ༻͢Δ
ݕࡧ݁Ռ͕ਖ਼ৗʹ
ϓϩμΫγϣϯʹϦϦʔε͢Δ·Ͱ• ϓϩμΫγϣϯڥΛߏங• QA (Quality Assurance) Λ࣮ࢪ͢ΔͨΊʹϓϩμΫγϣϯڥͷߏஙΛ͢Δඞཁ͕͋ͬͨ• iOS, AndroidΤϯδχΞɺσΟϨΫλʔ͔Β࣮ࡍͷσʔλΛݟͯ֬ೝΛ͍ͨ͠ཁʹ͑ΔͨΊ• ϓϩμΫγϣϯڥͷ Elasticsearch ʹهࣄΛೖ͍ͯ͘͠• هࣄͷ͕݅ेສ݅͋Γ͕͔͔࣌ؒΔ͠ɺࣦഊ͢Δͱೖ͠͠ͳͷͰਏ͔ͬͨ
ϓϩμΫγϣϯʹϦϦʔε͢Δ·Ͱ• QA (Quality Assurance) ͷ࣮ࢪ• ΠϯςάϨʔγϣϯςετ ݉Ͷͯ iOS, Android ΤϯδχΞɺαʔόʔαΠυΤϯδχΞɺσΟϨΫλʔɺ෦ͷશһ͕ू݁ͯ͠ɺ࣮ࡍʹεϚϗΛ৮Δɻ͜͜Ͱग़ͨόάػೳͷ࣮ʹ͍ͭͯͷϑΟʔυόοΫΛड͚ͯௐΛ͍ͯ͘͠
ϓϩμΫγϣϯʹϦϦʔε͢Δ·Ͱ• ෛՙςετͷ࣮ࢪ• ΠϯϑϥΤϯδχΞʹґཔΛ͠ɺ Gatling Λ༻͍ͯෛՙςετͷ࣮ࢪΛߦͬͨɻ
ࠓޙͷ՝
ࠓޙͷ՝• ੵΈͨ͠՝͕͍͔ͭ͋͘ΔͷͰR&DνʔϜͰͦΕΛվम͍ͯ͘͠• R&DνʔϜ࠷ۙ৽ઃ͞ΕͨνʔϜͰ͢ɻ• ݕࡧγεςϜͷϝϯςφϯεํੑɺػցֶश etc Λѻ͏ઐͷνʔϜͰ͢ɻ• ҙ֎ͱݕࡧ͕ΘΕ͍ͯͨ• ҙ֎ͱΞϓϦଆͰݕࡧ͕ΘΕ͍ͯͨ• ߏͷݟ͠ɺAPIͷݟ͠ͳͲ• ࣙॻ• ࣙॻʹొ͢ΔϫʔυΛ୭͕ొ͢Δͷ͔ͱ͍͏՝͕͋Δ• ͜Ε͕Ұ൪ͭΒ͍• ΠϯϑϥͷߏΛվળ͢Δʢେ୩͞ΜʹΑΔࢦఠ͕͋ͬͨʣ• ϚελʔϊʔυΛશ໘ʹग़͍ͯ͠ΔͷͰޙΖʹͳΔΑ͏ʹ͍࣋ͬͯ͘
ࠓޙͷ՝• ੵΈͨ͠՝͕͍͔ͭ͋͘ΔͷͰR&DνʔϜͰͦΕΛվम͍ͯ͘͠• ݕࡧਫ਼ͷ্• Ϣʔβʔ͝ͱʹ͓͚ΔΛͬͯϢʔβʔʹରͯ͠దͳݕࡧ݁ՌΛฦ͢• ͨͱ͑ɺϢʔβʔ͕ొ͍ͯ͠ΔήʔϜͷ༏ઌΛߴΊΔͳͲ• αδΣετػೳͷ࣮• Α͘ݕࡧ͞ΕΔΩʔϫʔυͳͲΛαδΣετͰ͖ΔΑ͏ͳΈ• ଞϓϩδΣΫτͷల։• ΞϓϦʹཹ·Β͍͚ͣ͛ͯΔΑ͏ʹ͢Δ• ͦͷͨΊɺιʔείʔυͷΛߦ͏ඞཁ͕͋ͬͨΓ͢ΔͷͰ͍ͬͯ͘• etc…
ϦϦʔεͨ͋͠ͱ
ϦϦʔεͨ͋͠ͱৼΓฦΔͱ։ൃظؒ 1.5 ϲ݄΄ͲͰ͜Ε͚ͩͷίϛοτΛͯ͠͠·ͬͨ
ϦϦʔεͨ͋͠ͱ։ൃʹܞΘͬͨਓͰɺৼΓฦΓΛߦͬͨ
ϦϦʔεͨ͋͠ͱχΫΞβϒͰম৯ͨ
ϦϦʔεͨ͋͠ͱGameWith Tech Blog Ͱॻ͍ͯΈͨɻͯͿ͍ͬͺ͍͍ͭͯͯخ͍͠https://tech.gamewith.co.jp/entry/2018/09/21/122154
ϦϦʔεͨ͋͠ͱେ୩͞Μ͔ΒϦϓϥΠΛΒ͑ͨ
ͦΕͰɺ͍Ζ͍Ζʹ໘ͨ͠
໘ͨ͠•ϦϦʔεͨ͋͠ͱʹ͍͔ͭ͘όά͕ग़͖ͯͨ•GameWith ຊମαΠτͷରԠ͕૿͑ͨ•໘ͷԠื͕ଟ͍࣌ظʹॏͳͬͯɺ໘ϥογϡ•MTG͕ଟ͘ͳͬͨ•ϦϦʔεऴΘͬͨ͋ͱʹΞαΠϯͨͯ͢͠ͷλεΫͷܹ͕Γͳ͍ͱײ͡Δ
ͦΕͰͳΜͱ͔ϦϦʔεͰ͖ͨͷͰΊͰͨ͠ΊͰͨ͠
ൃදҎ্Ͱ͢
THANK YOU