Upgrade to Pro — share decks privately, control downloads, hide ads and more …

非同期処理を使った応答性能改善 AWS Lambda

非同期処理を使った応答性能改善 AWS Lambda

AWS Lambda,SQS,Dynamodb を利用し、応答性能をお手軽に改善する一つの案の提示ができればと思っています。

3c1ad26469a50dc17504408264c2efcc?s=128

Hyuga-Tsukui

August 03, 2022
Tweet

Transcript

  1. ඇಉظॲཧΛ࢖ͬͨԠ౴ੑೳ վળ ServerlessLTॳ৺ऀ޲͚ LTେձ #24

  2. ࣗݾ঺հ • Hyuga Tsukuiʢ@hy_twenʣ • γΣϧϑΟʔʢגʣͰݐઃۀք޲͚SaaSΛ։ൃ͍ͯ͠·͢ • ࣾ֎LTॳ௅ઓͰ͢👋

  3. ࠓ೔఻͍͑ͨ͜ͱ • ೔ৗ͔Βݟ͑Δඇಉظॲཧͱ͸ʁ • ඇಉظॲཧͷ࢖͍ॴ • ߴίετͳॲཧͷऔΓѻ͍ͱγϯϓϧͳղܾࡦͷ঺հ

  4. ඇಉظॲཧͱ͸ • ޙͰ݁ՌΛฦ͢͜ͱΛ໿ଋ͠ɺҰ౓ॲཧΛ׬ྃͤ͞Δɻ݁Ռ͕༻ҙͰ ͖ͨΒݺͼग़͠ݩʹ͋ΒͨΊͯ݁ՌΛ௨஌͢Δ࢓૊Έͷ͜ͱʢࢀߟ https://www.htmlhi fi ve.com ඇಉظॲཧͱPromiseΛഎܠ͔Βཧղ͠Α͏ʣ

  5. ͋Δ೔ͷ͓ങ͍෺Λߟ͑ͯΈ·͢ • εʔύʔซઃͷༀہͰɺॲํᝦ͔ΒༀΛ࡞ͬͯ΋Β͏ʢλεΫAʣ • ͖ΐ͏ͷ൩͝͸Μͷ৯ࡐΛങ͏ʢλεΫBʣ

  6. ಉظॲཧVer. ॲํᝦड෇ ௐࡎʢNJOʣ ଴ػʢNJOʣ ௐࡎ׬ྃ ങ͍෺ NJO

  7. ඇಉظॲཧVer. ॲํᝦड෇ ௐࡎʢNJOʣ ങ͍෺ NJO ௐࡎ׬ྃ ड෇൪߸ൃߦ

  8. ྆ऀͷҧ͍ • ಉظVer.͸ௐࡎ͕ऴΘͬͨΒങ͍෺Λ։࢝͢Δ • ඇಉظVer.͸ௐࡎதʹങ͍෺Λ։࢝͢Δ

  9. ಉظॲཧVer. ॲํᝦड෇ ௐࡎʢNJOʣ ଴ػʢNJOʣ ௐࡎ׬ྃ ങ͍෺ NJO Ұ࿈ͷॲཧ͕׬ྃ͢Δ·ͰNJO͔͔Δ

  10. ඇಉظॲཧVer. ॲํᝦड෇ ௐࡎʢNJOʣ ങ͍෺ NJO ௐࡎ׬ྃ ड෇൪߸ൃߦ Ұ࿈ͷॲཧ͕׬ྃ͢Δ·ͰNJO͔͔Δ

  11. ௐࡎΛຊ౰ʹ଴ͭඞཁ͕͋Δ͔ʁ

  12. ड෇൪߸(PromiseʣͳͲͰඇಉظతʹ ॲཧͰ͖Δ

  13. ඇಉظॲཧΛݕ౼͢ΔMotivation • λεΫͷ׬ྃΛ଴ͭඞཁ͕ແ͍ͱ͖ • Ұ࿈ͷλεΫͷྲྀΕʢ͋Δ೔ͷ͓ങ͍෺ʣͷதͰɺϘτϧωοΫͱͳ ΔΑ͏ͳλεΫ͕͋Δ࣌

  14. γεςϜͷ࿩

  15. ϦΞϧͳͷߟ͑·ͨ͠ʂ

  16. ͋ΔIOTػثͷར༻։࢝αʔϏεΛߟ͑Δ • ػث͸ࡏݿ؅ཧDBͰͲͷސ٬͕ར༻͢Δ͔؅ཧ͍ͯ͠Δ • ػث͕ωοτϫʔΫΛར༻͢Δʹ͸ɺػثఏڙϕϯμͷAPI΁ϓϩϏ δϣχϯάਃ੥Λ͢Δඞཁ͕͋Δ • ϓϩϏδϣχϯάਃ੥׬ྃʹ͸਺෼Λཁ͢Δ • ࣦഊ͢ΔՄೳੑ΋͋Δ

  17. ུਤ

  18. λεΫΛ෼͚ͯΈΔͱ • ػثࡏݿʹؔ͢ΔॲཧͱɺϓϩϏδϣχϯάΛ͢Δॲཧ͸෼͚Εͦ͏ • ϓϩϏδϣχϯάॲཧ͸͕͔͔࣌ؒΔͷͰɺλεΫΛ෼͚ͳ͍ͱɺԠ ౴ੑ͕͜͜ʹӨڹΛड͚ͯѱ͘ͳΔ • ࣦഊͨ͠ͱ͖ʹϓϩϏδϣχϯά͔Β͚ͩ΍Γ௚ͤͦ͏

  19. ඇಉظॲཧΛݕ౼͢ΔMotivation • λεΫͷ׬ྃΛ଴ͭඞཁ͕ແ͍ͱ͖ • Ұ࿈ͷλεΫͷྲྀΕʢ͋Δ೔ͷ͓ങ͍෺ʣͷதͰɺϘτϧωοΫͱͳ ΔΑ͏ͳλεΫ͕͋Δ࣌

  20. ࠓճखܰʹඇಉظԽ͢Δͷ͸͜͜ʂ

  21. ͍͟ɺServerless΁ʂ

  22. ࠷ऴߏ੒ਤ

  23. ࠷ऴߏ੒ਤ ͜͜

  24. AWS SimpleQueueService(SQS) • AWS͕ఏڙ͢ΔServerlessͳϝοηʔδΩϡʔΠϯάαʔϏεͰ༷ʑ ͳServerlessͰߏ੒͞ΕͨΞϓϦΛ౷߹Ͱ͖Δ • Lambdaͱͷ࿈ܞ͕༰қ • ϦτϥΠ΍ɺࣦഊͨ͠ϝοηʔδͷอଘ͕Մೳ •

    ඇৗʹߴ଎ʢඪ४ΩϡʔͳΒࣄ্࣮ແ੍ݶ
  25. AWS SimpleQueueService(SQS) ͜Μͳײ͡ʹɺൺֱతॊೈͳϝοηʔδΛऔΓѻ͑·͢ɻ(256kb·ͰͷςΩετ) ྫͱͯ͠ɺࠓճͷϓϩϏδϣχϯάAPIʹඞཁͦ͏ͳ஋Λઃఆͯ͠Έ·͠ΐ͏ɻ { “eventId”: “7885ca34-f3ff-4575-b062-da50e9ae746a”, “macAddress”: “00-00-5E-10-00-00-00-00“ //

    document༻ʹ͋Δར༻Մೳͳ஋Ͱ͢ }
  26. AWS SimpleQueueService(SQS) ·ͨࠓճཁ݅ͱͯ͠ɺ֎෦APIͷࣦഊՄೳੑ͕͋ΔͷͰɺDeadLetterQueueͷઃఆ΋ΦεεϝͰ͢ɻ Πϝʔδͱͯ͠͸ɺࣦഊͨ͠ϝοηʔδΛࣗಈͰҰ࣌తʹผͷQueue΁֨ೲ͠ɺܾΊΒΕͨϧʔϧͰ࠶PushʢReDriveʣ͠·͢ɻ ·ͨࢦఆͷճ਺࣮ߦͯ͠΋ফԽͰ͖ͳ͔ͬͨ৔߹͸ɺDeadLetterQueue΁อଘ͞Εɺࢦఆظؒܦաޙ࡟আ͞Ε·͢ɻ

  27. ࠷ऴߏ੒ਤ ͜͜

  28. AWS Lambda • AWS͕ఏڙ͢ΔServerlessͷίϯϐϡʔςΟϯάϦιʔε • ๛෋ͳରԠݴޠɺϥϯλΠϜΛ࣋ͭͷͰϏδωεϩδοΫͷ࣮૷ίε τ͕௿ • ࣮ߦ࣌ؒͰͷ՝ۚͷͨΊɺॲཧʹΑͬͯ͸௿ίετ •

    ߴεέʔϥϏϦςΟ • ࠓճͰ͍͏ͱSQSͱͷ૬ੑ͕ൈ܈ͰɺࣗલͰϙʔϦϯάج൫Λ࣋ͭ
  29. AWS Lambda Lambda͸ଟ͘ͷىಈτϦΨʔΠϕϯτΛ͍࣋ͬͯΔͷͰɺSQSʹϝοηʔδ͕PUT͞ΕͨͷΛܖػʹɺىಈ͢ΔͳͲ͕ઃఆҰͭͰߦ͑ ·͢ɻ

  30. ࠓճߏ੒ͷ஫ҙ఺ ɾSQSʹඪ४ΩϡʔΛࢦఆͨ͠৔߹ɺat least once ͷ࢓༷ʹΑΓɺಉ͡ϝοηʔδ͕ෳ਺PULL͞ΕΔՄೳੑ͕͋Γ·͢ɻ { “eventId”: “7885ca34-f3ff-4575-b062-da50e9ae746a”, “macAddress”: “00-00-5E-10-00-00-00-00“

    // document༻ʹ͋Δར༻Մೳͳ஋Ͱ͢ } 👆͜ͷϝοηʔδ͕ೋճPULL͞ΕΔͷͰɺಉ͡macAddressΛॲཧ͢ΔLambda͕ෳ਺ճ࣮ߦ͞ΕΔՄೳੑ͕͋Δɻ
  31. ࠓճߏ੒ͷ஫ҙ఺ ɾͦͷͨΊɺႈ౳ੑ֬อ·ͨ͸ɺϩοΫػߏΛඞ࣮ͣ૷͢Δඞཁ͕͋Γ·͢ɻ EX. DynamoDBΛར༻ָͨ͠؍Lockʢٙࣅίʔυʣ status = dynamoDB.GetItem(eventId=1) if (status ===

    0) { api.call(macAddress); }else { return }
  32. ͋Δ͔΋͠Εͳ͍ٙ໰఺

  33. ͋Δ͔΋͠Εͳ͍ٙ໰఺ Q1. Lambda΋ࣗಈϦτϥΠ͋Δ͡ΌΜɺͳΜͰSQS? A1. ͦͷͱ͓ΓͰ͕͢ɺ࠷ऴతʹ࣮ߦͰ͖ͳ͔ͬͨevent͕SQSͷ΄͏͕௥͍΍͍ͨ͢ΊͰ͢ɻLambdaͰ΋ࣦഊͨ͠eventΛ DeadLetterQueueʹஷΊ͓ͯ͘ߏ੒͸͋ΔΑ͏Ͱ͢ɻ Q2. ͳΜͰDynamoDBʁRDSͰ͸ବ໨ͳͷ͔ A1. LambdaͱRDSͷ૬ੑ͸ྑ͘ͳ͍ͱ͢Δͷ͕ҰൠతͰ͢ɻཧ༝͸ɺRDS͸ࣄ্࣮εέʔϧΞοϓͰͷରԠ͔͠Ͱ͖ͳ͍ͨΊݶք͕ۙ

    ͍Ͱ͕͢ɺLambda͸ແ੍ݶͷεέʔϧΞ΢τͳͷͰɺ͜͜ͰRDS͕ϘτϧωοΫʹͳΔͨΊͰ͢ɻ ίωΫγϣϯϓʔϧͷ໰୊౳͸Amazon RDS ProxyͳͲΛར༻͢Δ͜ͱͰଧ։Ͱ͖Δ͔΋͠Ε·ͤΜʢ΍ͬͨ͜ͱͳ͍Ͱ͢ɻ
  34. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ