ݫൿɿຊࢿྉͷҰ෦·ͨશ෦ΛɺNatureגࣜձࣾͷڐՄͳ͠ʹɺෳɺసࡌ͢Δ͜ͱΛې͡·͢ɻIntroduce aboutSeptember 3, 2019NatureגࣜձࣾGo ͱNature Bath vol.6 ʮGo։ൃɾӡ༻ͷݱʯ19th November, 2020~ Nature Remoͷཪଆ
View Slide
2Me• দ խ (id:Songmu)• Nature גࣜձࣾ औకCTO• https://songmu.jp/riji• https://github.com/Songmu• ͖ͳݴޠGoͱPerlͱதࠃޠ• 3 Times ISUCON Winner• ஶॻʹʮΈΜͳͷGoݴޠʯ• झຯOSS׆ಈͰ͢
3Created Miscellaneous Go Tools• maltmill• πʔϧΛ؆୯ʹhomebrewͰ͢ΔͨΊͷπʔϧ• horenso• όονδϣϒͷͨΊͷϥούʔ• peep• ϓϩηεͷऴྃ௨Λͯ͘͠ΕΔ܅• gocredits• Goͷπʔϧ࣌ʹґଘϥΠϒϥϦͷLICENSEΛಉࠝ• etc.• ref. ʮGoͰπʔϧΛྔ࢈͢Δͷํ๏ʯ• https://junkyard.song.mu/slides/gocon2019-fukuoka/#0
4Maintaining major Go tools• ghq (github.com/x-motemen/ghq)• ιʔείʔυϦϙδτϦཧπʔϧ• ghq handbook• https://leanpub.com/ghq-handbook• ghr (github.com/tcnksm/ghr)• GitHubͷόΠφϦϦϦʔε༻πʔϧ
5Recent Works• Let's Encryptͷϧʔτূ໌ॻมߋ• Android7.1ҎલͰLet's Encryptূ໌ॻͷαΠτ͕ݟΒΕͳ͘ͳΔ• https://songmu.jp/riji/entry/2020-09-22-letsencrypt.html• Let's Encryptͷূ໌ॻସपΓͦͷޙ• https://songmu.jp/riji/entry/2020-09-22-letsencrypt.html
6Recent Works• GoͷΫϥΠΞϯτͷରԠ• ͝ར༻͍ͩ͘͞
7৽࡞• github.com/Songmu/gotesplit• github.com/Songmu/ecschedule• ޙͰղઆ͠·͢
8We are Hiring• GoΤϯδχΞઈࢍืूதͰ͢ʂ• ݱࡏ3໊• ιϑτΣΞΤϯδχΞ7໊
ࠓ͢͜ͱAgenda9
10Agenda• ܰ͘Nature Remoͷհ• Nature RemoͱGo• ʑͷGo׆༻OSS׆ಈͳͲ
ձࣾͱCompany and Product11
Mission12Mission⾃然との共⽣をテクノロジーでドライブする
Product
֎ग़ઌ͔ΒεϚϗͰΤΞίϯΛON εϚʔτεϐʔΧʔͱ࿈ܞͯ͠ͰՈిΛૢ࡞14Features
How It Works
Traction20ສಥഁೝˍγΣΞۀքNo.1ʢ20202݄࣮ࢪɺࣗࣾௐʣ
Nature RemoͱGoNature Remo and Go17
APIStreamWorkerAmazon ECSSubscribePublishWSWS Pub/SubSystem Diagram
Nature Remoͷཪଆ• αʔόʔαΠυ΄΅શͯGo• ׂ࣮ͱී௨ͷWebٕज़Λ࣮ͬͯݱ͍ͯ͠Δ• WebSocketͷଓཧपΓ͕νϟϨϯδϯά• αʔϏεٸத
Components• API• εϚϗΞϓϦεϚʔτεϐʔΧʔͱͷ௨৴• Stream• Nature RemoͱͷWebSocket௨৴• Worker• ϧʔϧͷ࣮ߦͯ͢GoͰAmazon ECS্Ͱಈ͔͍ͯ͠Δ
Remarkable Points• ૉͳGoͷWebΞϓϦέʔγϣϯ• Redis Pub/SubΛ༻͍ͨɺAPI - StreamؒͷΓͱΓ• Nature RemoALBΛܦ༝ͯ͠streamαʔόʔʹWebSocketଓ͍ͯ͠Δ• AlexaͷΧελϜεΩϧAWS Lambdaܦ༝Λ࣮ͬͯߦ͞ΕΔ
Simple Web Applications with Go• ී௨ͷWebΞϓϦέʔγϣϯ• ͱͱherokuͰϗετ໊͍ͯͨ͠• ϑϨʔϜϫʔΫ• github.com/nbio/hitch• Gorilla web toolkitΛ෦తʹར༻• MySQL/Redis• gorp/redigo• guregu/dynamo
Utilize Redis Pub/Sub• Redis Pub/SubΛ׆༻͍ͯ͠Δ• API͔ΒRedisʹPublish• StreamRedisΛSubscribe• ૬ޓ௨৴͠ͳ͍ૄ݁߹Λ࣮ݱ͍ͯ͠Δ• Streamଆ͋͘·ͰWebSocketͱRedis͔ΒͷSubscribeͰड໋͚͚ͨྩͷ࣮ߦ͔͓͜͠ͳΘͣঢ়ଶΛ࣋ͨͳ͍
WebSocket connection via ALB• Nature RemoALBΛܦ༝ͯ͠streamαʔϏεʹWebSocketଓ͍ͯ͠Δ• ҰͭͷGoΞϓϦͷίϯςφͰສଓ͚͞Δʂ• Goͷ͓खܰͳྑ͞Λ࣮ײ• GoखܰʹͦΕͳΓͷύϑΥʔϚϯε͕ग़ͤΔͷ͕͔ͳΓྑ͍
ʑͷ։ൃɾӡ༻Go Topics25
ʑͷۀ• GitHub্Ͱ։ൃ• CircleCI্ͰCI/CD• developϒϥϯν͔ΒfeatureϒϥϯνΛΔ• ϨϏϡʔͯ͠Ϛʔδ• renovateʹΑΔϥΠϒϥϦࣗಈΞοϓσʔτ• developϒϥϯν͔Βmasterϒϥϯνͷpull request• git-pr-releaseʹΑͬͯࣗಈ࡞• Ϛʔδ͞ΕͨΒࣗಈͰຊ൪deploy
CI/CD Pipelinesgit-pr-releasegit pushgo testgo builddocker builddocker pushecspresso deploy1234
ECSͷdeployʹecspressoಋೖ• github.com/kayac/ecspresso• ecs-deploy͔ΒΓ͑• Γ͑ઌͱͯͪ͠ΐ͏ͲΑ͔ͬͨ• طଘͷTask DefinitionΛར༻ͯͦ͠ͷ··γʔϜϨεʹҠߦՄೳ• CircleCI͔Βdeploy͍ͯ͠Δ• ଞʹ kayac/go-katsubushi ͳͲkayac OSSΛ׆༻
ECS Task Definition͕reviewableʹ• TaskͷαΠυΧʔՃύϥϝʔλʔมߋ͕reviewableʹͳͬͨͷྑ͔ͬͨ
github.com/Songmu/flextime• ςετͰ࣌ࠁܥΛࠩ͠ସ͑ΔͨΊͷϥΠϒϥϦ• timeύοέʔδͱಉ༷ͷΠϯλʔϑΣʔεΛඋ͑Δ
github.com/Songmu/smartcache• ϓϦϑΣον͢ΔΠϯϝϞϦΩϟογϡ• Ωϟογϡߋ৽ॲཧ͕• ॏෳ͠ͳ͍Α͏ʹɾϒϩοΫ͠ͳ͍Α͏ʹ
ECS Scheduled TaskཧͷͨΊͷπʔϧecschedule• github.com/Songmu/ecschedule• όονྨɺECSͷScheduled TaskΛར༻͍ͯ͠Δ͕ͦΕΛόʔδϣϯཧ͍ͨ͠ͱ͍͏ಈػ
খωλ: όονྨͷಈ͔͠ํ• APIͱworkerͱόονಉ͡GoόΠφϦɺಉ͡ίϯςφ• Task Definitionҧ͏ͷ• αϒίϚϯυͰॲཧΛ͚Δ• nature server: APIαʔόʔͷىಈ• nature squadrons: ϫʔΧʔͷىಈ• nature batch hoge ... : όονྨͷىಈ
34ςετߴԽͷͨΊͷgotesplit• github.com/Songmu/gotesplit• CIڥͰͷςετฒྻ࣮ߦΛ؆୯ʹ࣮ݱ• CircleCI / GitHub Actions• ࣾͷςετ͕࣌ؒ15->5ʹ• ͔ͳΓศརͳͷͰͥͻ͝ར༻͍ͩ͘͞
35@soh335࡞ͷOSS• github.com/soh335/go-test-redisserver• github.com/soh335/shukujitsu (new!)• github.com/schemalex/schemalex• ← ͜Ε·ͩಋೖग़དྷ͍ͯͳ͍
36github.com/soh335/shukujitsu• ࡢ൩ੜ• ҎԼͷσʔλΛͱʹຊͷॕఆ• https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv• ͜ΕtypoͰ͋Γ·ͤΜ• σʔλϑΥʔϚοτឯ༨ۂં͋ͬͨΑ͏͕ͩࠓׂͱ·ͱ
37ࣗ࡞OSSΛຊ൪ʹಋೖ͢Δ• ͱΓ͋͑ͣOSSͰ࡞ͬͯΈΔ• ࢼ͠ʹຊ൪ೖͯ͠͠·͏
OSSͷpull request38
39nbio/hitch#11
40nbio/hitch#12
41kayac/go-katsubushi#40
42blang/semver#56
43pressly/goose#180
44pressly/goose#181
45kayac/ecspresso#37
46kayac/ecspresso#38
47kayac/ecspresso#161
48guregu/dynamo#106
49goccy/go-yaml#23
50goccy/go-yaml#36
51go-gorp/gorp#411
52manifoldco/promptui#132
53shogo82148/go-sql-proxy#42
54OSSͷpull request• ʮڠௐʯͰ͖Δ͔Λॏࢹ• pull requestΛૹͬͯΈͯ୳ΓΛೖΕΔ• ࢥ͕Ϛον͍ͯͦ͠͏͔• ϝϯςφϯε͕ΞΫςΟϒ͔• ϝϯςφϯε͕ࢭ·ͬͯΔͱࢥ͍͖͙͢ʹରԠͯ͘͠ΕΔ͜ͱ• 1ܦ͔ͬͯΒϚʔδ͞ΕΔ͜ͱ
·ͱΊ55
Natureͷ։ൃ• αʔόʔαΠυ΄΅શ෦Go• 10ສ͑ͷIoTσόΠεΛϋϯυϦϯά͢ΔWebSocketίϯςφ܈• αʔόʔଆͷ੍ޚ͕݁ߏϔϏʔͰ໘ന͍• ΈࠐΈAppͱͷ࿈ܞͷ໘ന͞• OSSΛͪΌΜͱ׆༻͍ͨ͠• ڠௐͰ͖ΔOSSΛબΜͰߩݙ͍ͯ͘͠• OSSʹͰ͖Δͷͯ͠͠·͏
We are Hiring!ੵۃ࠾༻தͰ͢ʂ• όοΫΤϯυΤϯδχΞ• εϚʔτϑΥϯΤϯδχΞ• ϑϩϯτΤϯυΤϯδχΞ• ػցֶशΤϯδχΞ• ΈࠐΈΤϯδχΞ