AWS Lambda,SQS,Dynamodb を利用し、応答性能をお手軽に改善する一つの案の提示ができればと思っています。
ඇಉظॲཧΛͬͨԠੑೳվળServerlessLTॳ৺ऀ͚ LTେձ #24
View Slide
ࣗݾհ• Hyuga Tsukuiʢ@hy_twenʣ• γΣϧϑΟʔʢגʣͰݐઃۀք͚SaaSΛ։ൃ͍ͯ͠·͢• ࣾ֎LTॳઓͰ͢👋
ࠓ͍͑ͨ͜ͱ• ৗ͔Βݟ͑Δඇಉظॲཧͱʁ• ඇಉظॲཧͷ͍ॴ• ߴίετͳॲཧͷऔΓѻ͍ͱγϯϓϧͳղܾࡦͷհ
ඇಉظॲཧͱ• ޙͰ݁ՌΛฦ͢͜ͱΛଋ͠ɺҰॲཧΛྃͤ͞Δɻ݁Ռ͕༻ҙͰ͖ͨΒݺͼग़͠ݩʹ͋ΒͨΊͯ݁ՌΛ௨͢ΔΈͷ͜ͱʢࢀߟhttps://www.htmlhifive.com ඇಉظॲཧͱPromiseΛഎܠ͔Βཧղ͠Α͏ʣ
͋Δͷ͓ങ͍Λߟ͑ͯΈ·͢• εʔύʔซઃͷༀہͰɺॲํᝦ͔ΒༀΛ࡞ͬͯΒ͏ʢλεΫAʣ• ͖ΐ͏ͷ൩͝Μͷ৯ࡐΛങ͏ʢλεΫBʣ
ಉظॲཧVer.ॲํᝦडௐࡎʢNJOʣػʢNJOʣௐࡎྃങ͍ NJO
ඇಉظॲཧVer.ॲํᝦडௐࡎʢNJOʣങ͍ NJOௐࡎྃड൪߸ൃߦ
྆ऀͷҧ͍• ಉظVer.ௐࡎ͕ऴΘͬͨΒങ͍Λ։࢝͢Δ• ඇಉظVer.ௐࡎதʹങ͍Λ։࢝͢Δ
ಉظॲཧVer.ॲํᝦडௐࡎʢNJOʣػʢNJOʣௐࡎྃങ͍ NJOҰ࿈ͷॲཧ͕ྃ͢Δ·ͰNJO͔͔Δ
ඇಉظॲཧVer.ॲํᝦडௐࡎʢNJOʣങ͍ NJOௐࡎྃड൪߸ൃߦҰ࿈ͷॲཧ͕ྃ͢Δ·ͰNJO͔͔Δ
ௐࡎΛຊʹͭඞཁ͕͋Δ͔ʁ
ड൪߸(PromiseʣͳͲͰඇಉظతʹॲཧͰ͖Δ
ඇಉظॲཧΛݕ౼͢ΔMotivation• λεΫͷྃΛͭඞཁ͕ແ͍ͱ͖• Ұ࿈ͷλεΫͷྲྀΕʢ͋Δͷ͓ങ͍ʣͷதͰɺϘτϧωοΫͱͳΔΑ͏ͳλεΫ͕͋Δ࣌
γεςϜͷ
ϦΞϧͳͷߟ͑·ͨ͠ʂ
͋ΔIOTػثͷར༻։࢝αʔϏεΛߟ͑Δ• ػثࡏݿཧDBͰͲͷސ٬͕ར༻͢Δ͔ཧ͍ͯ͠Δ• ػث͕ωοτϫʔΫΛར༻͢ΔʹɺػثఏڙϕϯμͷAPIϓϩϏδϣχϯάਃΛ͢Δඞཁ͕͋Δ• ϓϩϏδϣχϯάਃྃʹΛཁ͢Δ• ࣦഊ͢ΔՄೳੑ͋Δ
ུਤ
λεΫΛ͚ͯΈΔͱ• ػثࡏݿʹؔ͢ΔॲཧͱɺϓϩϏδϣχϯάΛ͢Δॲཧ͚Εͦ͏• ϓϩϏδϣχϯάॲཧ͕͔͔࣌ؒΔͷͰɺλεΫΛ͚ͳ͍ͱɺԠੑ͕͜͜ʹӨڹΛड͚ͯѱ͘ͳΔ• ࣦഊͨ͠ͱ͖ʹϓϩϏδϣχϯά͔Β͚ͩΓͤͦ͏
ࠓճखܰʹඇಉظԽ͢Δͷ͜͜ʂ
͍͟ɺServerlessʂ
࠷ऴߏਤ
࠷ऴߏਤ͜͜
AWS SimpleQueueService(SQS)• AWS͕ఏڙ͢ΔServerlessͳϝοηʔδΩϡʔΠϯάαʔϏεͰ༷ʑͳServerlessͰߏ͞ΕͨΞϓϦΛ౷߹Ͱ͖Δ• Lambdaͱͷ࿈ܞ͕༰қ• ϦτϥΠɺࣦഊͨ͠ϝοηʔδͷอଘ͕Մೳ• ඇৗʹߴʢඪ४ΩϡʔͳΒࣄ্࣮ແ੍ݶ
AWS SimpleQueueService(SQS)͜Μͳײ͡ʹɺൺֱతॊೈͳϝοηʔδΛऔΓѻ͑·͢ɻ(256kb·ͰͷςΩετ)ྫͱͯ͠ɺࠓճͷϓϩϏδϣχϯάAPIʹඞཁͦ͏ͳΛઃఆͯ͠Έ·͠ΐ͏ɻ{“eventId”: “7885ca34-f3ff-4575-b062-da50e9ae746a”,“macAddress”: “00-00-5E-10-00-00-00-00“ // document༻ʹ͋Δར༻ՄೳͳͰ͢}
AWS SimpleQueueService(SQS)·ͨࠓճཁ݅ͱͯ͠ɺ֎෦APIͷࣦഊՄೳੑ͕͋ΔͷͰɺDeadLetterQueueͷઃఆΦεεϝͰ͢ɻΠϝʔδͱͯ͠ɺࣦഊͨ͠ϝοηʔδΛࣗಈͰҰ࣌తʹผͷQueue֨ೲ͠ɺܾΊΒΕͨϧʔϧͰ࠶PushʢReDriveʣ͠·͢ɻ·ͨࢦఆͷճ࣮ߦͯ͠ফԽͰ͖ͳ͔ͬͨ߹ɺDeadLetterQueueอଘ͞Εɺࢦఆظؒܦաޙআ͞Ε·͢ɻ
AWS Lambda• AWS͕ఏڙ͢ΔServerlessͷίϯϐϡʔςΟϯάϦιʔε• ๛ͳରԠݴޠɺϥϯλΠϜΛ࣋ͭͷͰϏδωεϩδοΫͷ࣮ίετ͕• ࣮ߦ࣌ؒͰͷ՝ۚͷͨΊɺॲཧʹΑͬͯίετ• ߴεέʔϥϏϦςΟ• ࠓճͰ͍͏ͱSQSͱͷ૬ੑ͕ൈ܈ͰɺࣗલͰϙʔϦϯάج൫Λ࣋ͭ
AWS LambdaLambdaଟ͘ͷىಈτϦΨʔΠϕϯτΛ͍࣋ͬͯΔͷͰɺSQSʹϝοηʔδ͕PUT͞ΕͨͷΛܖػʹɺىಈ͢ΔͳͲ͕ઃఆҰͭͰߦ͑·͢ɻ
ࠓճߏͷҙɾSQSʹඪ४ΩϡʔΛࢦఆͨ͠߹ɺat least once ͷ༷ʹΑΓɺಉ͡ϝοηʔδ͕ෳPULL͞ΕΔՄೳੑ͕͋Γ·͢ɻ{“eventId”: “7885ca34-f3ff-4575-b062-da50e9ae746a”,“macAddress”: “00-00-5E-10-00-00-00-00“ // document༻ʹ͋Δར༻ՄೳͳͰ͢}👆͜ͷϝοηʔδ͕ೋճPULL͞ΕΔͷͰɺಉ͡macAddressΛॲཧ͢ΔLambda͕ෳճ࣮ߦ͞ΕΔՄೳੑ͕͋Δɻ
ࠓճߏͷҙɾͦͷͨΊɺႈੑ֬อ·ͨɺϩοΫػߏΛඞ࣮ͣ͢Δඞཁ͕͋Γ·͢ɻEX. DynamoDBΛར༻ָͨ͠؍Lockʢٙࣅίʔυʣstatus = dynamoDB.GetItem(eventId=1)if (status === 0) {api.call(macAddress);}else {return}
͋Δ͔͠Εͳ͍ٙ
͋Δ͔͠Εͳ͍ٙQ1. LambdaࣗಈϦτϥΠ͋Δ͡ΌΜɺͳΜͰSQS?A1. ͦͷͱ͓ΓͰ͕͢ɺ࠷ऴతʹ࣮ߦͰ͖ͳ͔ͬͨevent͕SQSͷ΄͏͕͍͍ͨ͢ΊͰ͢ɻLambdaͰࣦഊͨ͠eventΛDeadLetterQueueʹஷΊ͓ͯ͘ߏ͋ΔΑ͏Ͱ͢ɻQ2. ͳΜͰDynamoDBʁRDSͰବͳͷ͔A1. LambdaͱRDSͷ૬ੑྑ͘ͳ͍ͱ͢Δͷ͕ҰൠతͰ͢ɻཧ༝ɺRDSࣄ্࣮εέʔϧΞοϓͰͷରԠ͔͠Ͱ͖ͳ͍ͨΊݶք͕͍ۙͰ͕͢ɺLambdaແ੍ݶͷεέʔϧΞτͳͷͰɺ͜͜ͰRDS͕ϘτϧωοΫʹͳΔͨΊͰ͢ɻίωΫγϣϯϓʔϧͷAmazon RDS ProxyͳͲΛར༻͢Δ͜ͱͰଧ։Ͱ͖Δ͔͠Ε·ͤΜʢͬͨ͜ͱͳ͍Ͱ͢ɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ