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

5 年にわたる “ Perl の ” REST API を “ Perl で ” GraphQL API 化し作り直す

mangano-ito
March 05, 2022
3.9k

5 年にわたる “ Perl の ” REST API を “ Perl で ” GraphQL API 化し作り直す

mangano-ito

March 05, 2022
Tweet

Transcript

  1. id:mangano-ito / גࣜձࣾ͸ͯͳ
    5 ೥ʹΘͨΔ
    “ Perl ͷ ” REST API Λ
    “ Perl Ͱ ” GraphQL API Խ͠࡞Γ௚͢

    View Slide

  2. ࢲ ୡ
    ʹ͍ͭͯ

    View Slide

  3. ࢲʹ͍ͭͯ
    id:mangano-ito
    גࣜձࣾ͸ͯͳ(ϚϯΨνʔϜ
    ΞϓϦέʔγϣϯΤϯδχΞ 8FC

    View Slide

  4. גࣜձࣾ͸ͯͳ(ϚϯΨνʔϜ
    ΞϓϦέʔγϣϯΤϯδχΞ 8FC

    ˣ
    ϚϯΨΞϓϦνʔϜΤϯδχΞ "OESPJE

    ࢲʹ͍ͭͯ
    id:mangano-ito

    View Slide

  5. ࢲୡͷϓϩμΫτʹ͍ͭͯ

    View Slide

  6. GigaViewer
    ࣾɾαʔϏεʹಋೖ͞Ε͍ͯΔ
    8FCϚϯΨ޲͚Ϗϡʔϫʔ
    2017 ʙ

    View Slide

  7. ৽ͨʹϚϯΨΞϓϦʹରԠͨ͠ϏϡʔϫͰ͋Δ
    ʮ(JHB7JFXFSGPS"QQTʯΛఏڙ
    2021 ʙ
    GigaViewer for Apps
    +5 years
    https://hatenacorp.jp/press/release/entry/2021/11/04/153000

    View Slide

  8. ͍··Ͱͷࢲୡ

    View Slide

  9. ͍··Ͱͷ API ։ൃ
    3&45"1*

    "1*ͷυΩϡϝϯςʔγϣϯ

    όϦσʔγϣϯ

    View Slide

  10. hitode909 / APISchem
    a

    https://github.com/hitode909/APISchema
    Made with/for Perl ♥
    ࢖ΘΕ͍ͯͨ΋ͷ

    View Slide

  11. l"1*Λ࡞ΔͳΒ
    εΩʔϚϑΝʔετʹ͍ͨ͠ΑͶz

    View Slide

  12. 👍

    View Slide

  13. lҰํɼ
    ͍··Ͱͷ3&45"1*։ൃͰ͸
    ͜͏͍͏ࠔΓ͝ͱ͕͋ͬͨΑͶz

    View Slide

  14. ΤϯυϙΠϯτͷϨεϙϯεܗ͕ࣜݻఆ
    Ұํɺը໘͝ͱʹඞཁͱͳΔϑΟʔϧυ͸ҟͳΔ

    ࣅͨΑ͏ͳϦιʔε͕ཚཱ

    View Slide

  15. ͦͷ݁Ռ
    302 resource
    s

    54 endpoints
    series
    series_detail
    series_detail_of_free_series_campaign
    series_info_of_free_series_campaign
    ticket_series
    Series of `series` resources …
    serial_series

    View Slide

  16. ͜ͷը໘͸͜͏ͳΔ
    ࡞඼λΠτϧ
    ஶऀ
    ֓ཁ

    View Slide

  17. ͜ͷը໘͸͜͏ͳΔ
    episode_with_series

    View Slide

  18. Ұํ ͜ͷը໘Ͱ͸͜͏ͳΔ
    ࡞඼λΠτϧ
    ֓ཁ
    ࠷৽ΤϐιʔυλΠτϧ
    νέοτ
    ར༻Մ൱
    ͍͍Ͷ਺

    View Slide

  19. Ұํ ͜ͷը໘Ͱ͸͜͏ͳΔ
    serial_series

    View Slide

  20. ҧ͍͸…
    episode_with_series
    episode
    author
    serial_series
    series

    View Slide

  21. ҧ͍͸…
    episode_with_series
    episode
    author
    serial_series
    series_supports_ticket series_detail
    series

    View Slide

  22. ҧ͍͸…
    episode_with_series
    episode
    author
    serial_series
    series_supports_ticket series_detail
    series

    View Slide

  23. ༻్Ͱ෼Խ͍͍ͯͬͯ͠Δ…
    • series

    • Ϧετը໘Ͱ͸ܰΊͷσʔλͰ΄͍͠ΑͶʙ

    • series_detail

    • ৄࡉը໘Ͱ͸ΑΓଟ͘ͷؔ࿈৘ใ΋͚ͬͭͯ͘΄͍͠ΑͶʙ
    series
    series_detail

    View Slide

  24. ͞Βʹ…
    • listed_series_info

    • series + author + ৽ணΤϐιʔυ೔࣌ ͕߹ମͨ͠όʔδϣϯ

    • listed_series_info_with_ticket

    • listed_series_info + ticket ৘ใ͕߹ମͨ͠όʔδϣϯ
    listed_series_info
    listed_series_info_with_ticket

    View Slide

  25. 🤯

    View Slide

  26. ॊೈੑ
    දࣔ݅਺΍ूܭ৚݅ͳͲ͕͢΂ͯ
    αʔόʔαΠυʹ࣮૷͞Ε͍ͯΔ
    ΞϓϦͷ։ൃલʹαʔόʔαΠυͰ
    ઌߦͨ͠։ൃͱϦϦʔε͕ඞཁ

    View Slide

  27. ͋Δ͍͸ϫʔΫϑϩʔ
    αʔόʔαΠυͰͷඇޓ׵ͳมߋ͸
    ڧ੍Ξοϓσʔτ͕ඞཁʹͳΓ͏ΔͷͰ
    ͳΔ΂͘ͳΒආ͚͍ͨʜʜ

    View Slide

  28. ͋Δ͍͸ϫʔΫϑϩʔ
    ഁյతͳมߋΛ๷͙ͨΊʹ
    ৽ͨͳόʔδϣϯͱͯ͠
    Ϧιʔε͕஀ੜͨ͠Γ͢Δ
    /api/v1/rankings
    /api/v2/rankings

    View Slide

  29. l(SBQI2-Ͱ͸Ͳ͏ͳͷ͔z

    View Slide

  30. GraphQL ͷҰൠతͳϝϦοτ
    👉ɹؔ࿈͢ΔσʔλΛάϥϑͱͯ͠औಘͰ͖Δ
    👍ɹΫϥΠΞϯτଆ͕ඞཁͳ΋ͷ͚ͩ
    ɹɹॊೈʹऔಘՄೳ
    👍ɹαʔόʔଆ͸୯ମͷϦιʔεͱ
    ɹɹͦͷؔ܎Λهड़͠࠶ར༻Մೳ
    Ϧιʔεͷരൃ
    มߋʹର͢Δॊೈੑ

    View Slide

  31. ͖ͬ͞ͷը໘͸͜͏ॻ͚Δ

    View Slide

  32. ͖ͬ͞ͷը໘͸͜͏ॻ͚Δ
    series.titl
    e

    series.author.nam
    e

    series.description

    View Slide

  33. ผͷը໘Ͱʴα͚ͨ͠Ε͹…

    View Slide

  34. ผͷը໘Ͱʴα͚ͨ͠Ε͹…
    ࡞඼λΠτϧ
    series.description
    series.latestEpisode.title
    serie
    s

    .supportsTicket
    series.likeCount

    View Slide

  35. series.titl
    e

    series.author.nam
    e

    series.description

    View Slide

  36. ผͷը໘Ͱ-α͚ͨ͠Ε͹…
    series.titl
    e

    series.author.nam
    e

    series.description

    View Slide

  37. ॊೈੑόπάϯʂ

    View Slide

  38. ։ൃޮ཰
    (SBQIJ2-ศརͳ(SBQI2-ΫϥΠΞϯτ

    View Slide

  39. View Slide

  40. ΧελϚΠζͨ͠Γ΋…
    https://developer.hatenastaff.com/entry/2021/05/14/093000

    View Slide

  41. 3&45ˠ(SBQI2-
    ͯ͠Έͨ͋͘Γ·ͤΜ͔

    View Slide

  42. l1FSMͰͰ͖Δͷ͔ʁz

    View Slide

  43. 👍΋ͪΖΜͰ͖Δ
    ࣾ಺Ͱ΋࠾༻࣮੷͋Γ
    ฐࣾͰ͸1FSMͳΒ͜ΕҰ୒
    ͱ͍͏ҹ৅

    View Slide

  44. lͳʹΛ͢Ε͹Α͍ͷ͔z

    View Slide

  45. ઌʹεΩʔϚΛॻ͘

    View Slide

  46. ͨͱ͑͹ series ͸͜͏ॻ͚Δ

    View Slide

  47. series ΁ͷΫΤϦ͸͜Ε͚ͩ

    View Slide

  48. ղܾͷγεςϜ

    View Slide

  49. ରԠ͢Δ࣮૷Λॻ͍͍ͯ͘
    Resolver

    View Slide

  50. ରԠ͢Δ࣮૷Λॻ͘

    View Slide

  51. View Slide

  52. ͜͏ͯ͠εΩʔϚϑΝʔετͰ
    ఆٛˠ࣮૷Λ͍ͯ͘͠

    View Slide

  53. جຊ
    εΩʔϚͱ࣮૷ͷͭͳ͗͜Έ

    View Slide

  54. View Slide

  55. View Slide

  56. εΩʔϚఆٛΛجʹ Resolver ࣮૷΁
    { }
    Giga::GraphQL::Resolver::Query::Series
    Giga::GraphQL::Resolver::Series
    Giga::GraphQL::Resolver::Author
    GraphQL Schema

    View Slide

  57. ൃల
    গ͠ؤுΓ͸ඞཁʹͳΔ͚ΕͲʜ

    View Slide

  58. Τϥʔͷදݱ
    ͍··ͰΤϥʔΛฦ͍ͯͨ͠෦෼͸Ͳ͏͢Δͷ͔ʁ

    View Slide

  59. GraphQL ͷΤϥʔදݱ

    View Slide

  60. View Slide

  61. View Slide

  62. ΤϥʔϋϯυϥʔΛಋೖ
    ErrorHandler
    { }
    GraphQL::Error
    Error Report
    Raised Error Object
    Error Response
    { }
    Query
    ΤϥʔΛू໿
    🧨

    View Slide

  63. Ͱ͖͕͋Δ

    View Slide

  64. N+1 ໰୊

    View Slide

  65. View Slide

  66. DataLoader Λಋೖ͢Δ

    View Slide

  67. ϖʔδωʔγϣϯ
    Relay GraphQL Cursor Connections Specificatio
    n

    https://relay.dev/graphql/connections.htm

    View Slide

  68. ΞμϓλʔΛಋೖ͢Δ
    Connection Repository
    Offset = 2
    0

    Limit = 10
    First = 1
    0

    After = %ABC$
    { }

    View Slide

  69. ύϑΥʔϚϯε΁ͷऔΓ૊Έ
    ط஌ͷΫΤϦͷΩϟογϡΛࣄલ࡞੒͠΢ΥʔϜΞοϓ͢Δ
    ఆظతʹ
    ΩϟογϡΛ
    ͭ͘Δ
    ࣄલʹΫΤϦΛ
    ετοΫ͓ͯ͘͠
    ΞΫηε࣌ʹ͸
    Ωϟογϡ͕
    ͋ͨͨ·ͬͯΔ

    View Slide

  70. ܗ͕Ͱ͖ͨʂ

    View Slide

  71. ͋ͱ͸ίʔυΛॻ͚ͩ͘ʁ

    View Slide

  72. ϑϩϯτΤϯυͰͷ࢖ΘΕํʹΑͬͯ
    ٻΊΒΕΔεΩʔϚ͕ܾ·Δ
    "1*։ൃଆ͚ͩͰ͸ܾΊΒΕΔΘ͚Ͱ͸ͳ͍
    👱👱👨🦱👨🦰

    View Slide

  73. App νʔϜͱ࿈ܞͨ͠ҙࢥܾఆΛ͍ͨ͠
    l྆νʔϜͰ߹ҙΛऔΓͳ͕ΒɹεΩʔϚΛܾΊ͍͖͍ͯͨz
    ͱ͍͏ͷ͕
    3&45࣌୅͔Βड͚ܧ͕ΕΔߟ͔͑ͨ
    👱🤝👱🤝👨🦱🤝👨🦰

    View Slide

  74. εΩʔϚϑΝʔετ™

    View Slide

  75. ͨͩ…೉͍͠෦෼͕͋Δ
    εΩʔϚΛߟ͑Δ͜ͱ͕·ͣ೉͍͠
    εΩʔϚϑΝʔετΛ࣮ݱ͢Δ೉͠͞
    ϫʔΫϑϩʔతͳ೉͠͞΋͋Δ

    View Slide

  76. ٕज़͚ͩͰ͸ͳ͍
    εΩʔϚϑΝʔετ

    View Slide

  77. νʔϜӽڥͨ͠औΓ૊Έ΋ඞཁ

    View Slide

  78. View Slide

  79. զʑͷऔΓ૊Έϧʔϓ
    ΍Γ͍ܾͨΊ͍ͨ΋ͷ͝ͱ͕͋Δ
    ͖ͨͨ୆Λߟ͑Δ
    ձͰಉظతʹ૬ஊ
    ܾఆ͸ه࿥Λ࢒͢
    ࣮૷͢Δ

    View Slide

  80. 1. ࣮ݱ͍ͨ͠ػೳ͕͋Δ
    ʮ͜ͷϞσϧΛͲ͏͍͏εΩʔϚͰఆٛ͠Α͏ʯ͸͜Ε

    View Slide

  81. 2. ͖ͨͨ୆Λߟ͑Δ
    w ͜͜Ͱ۩ମతͳεΩʔϚҊΛఏࣔͨ͠Γ͢Δ
    w দ஛കγεςϜͰෳ਺ҊΛఏࣔ͠ɼQSPTDPOTͰٞ࿦ͨ͠Γ

    View Slide

  82. 3. ձͰಉظతʹ૬ஊ
    w ຖ೔ΞϓϦνʔϜͷனձʹಥܸ͢Δ
    w ͦ͜ʹʮ"1*૬ஊίʔφʔʯΛઃ͚ͯ΋Β͍ɼͦ͜Ͱձ࿩͢Δ
    w ि࣍(JHB(SBQI2-ձ
    w ͜͜Ͱ͸ΑΓ(SBQI2-"1*ʹಛԽ͍ͯ͠Δ
    w ೖΓ૊Μͩ࿩Λͨ͠Γ͢Δ

    View Slide

  83. 4. େ͖͍ܾఆ͸ه࿥Λ࢒͢
    w ҙݟ͕͍Ζ͍Ζ͋Δͱ͖΍ࠓޙʹؔΘΔେ͖ͳܾఆ
    w ૬ஊͷܦҢΛࢀরͰ͖ΔΑ͏ʹ͢Δ
    w େ͖͘ͳ͍ͱ͖͸୯ʹٞࣄ࿥ʹॻ͚ͩ͘ϓϩμΫτͷه࿥ʹ࢒ͨ͠Γ

    View Slide

  84. ༷ʑͳܾఆ͕ߦΘΕΔ
    OVMMBCMF͔OPOOVMM͔ *%Ͳ͏͢Δ͔
    ͳΜͰ΋/PEFʹ͸͠ͳ͍
    ෳ਺ͷࣅͨܕΛΠϯλʔ
    ϑΣΠεʹͰ͖ͳ͍͔
    ΤϥʔϋϯυϦϯά
    ৽ͨͳܕͷఆٛ

    View Slide

  85. ͜͏ͯ͠
    "1*͕׬੒

    View Slide

  86. ΞϓϦ͕Ͱ͖͕͋Δ
    (JHB7JFXFSGPS"QQT͕Ͱ͖͕͋Δ

    View Slide

  87. ͞Βʹ Web Ͱ΋׆༻
    αʔόʔαΠυϑϩϯτΤϯυʹͱͬͯ΋׆༻͠΍͍͢ɽ
    ॊೈʹσʔλΛऔͬͯ͜ΕΔɽ
    ࠓޙΑΓ׆༻͕ਐΜͰ͍͘༧ఆɽ

    View Slide

  88. ·ͱΊ
    1FSMͰ(SBQI2-"1*Λ࡞Δͷ͸ ࣮૷Λ௥Ճͯ͠
    શવͰ͖Δʂ
    3&45"1*Ͱͷ։ൃޮ཰ͷ՝୊͸(SBQI2-ʹΑΓվળ͞Εͨʂ
    αʔόʔɾΫϥΠΞϯταΠυؒͷ࿈ܞ͕։ൃʹ͓͍ͯ؊ཁʂ

    View Slide

  89. ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide