GoCon 2014 Autmun
Golang @ISUCONy_matsuwitter
View Slide
[email protected]Gunosy inc., ࣥߦһ!Goྺ1ऑ͘Β͍!όϥϯεϘʔϧਖ਼࠲ͷਓ
ීஈͷۀGoʹΑΔAPIαʔόߏங (2014.3~)iOS/AndroidͷΞϓϦ։ൃDjango/RailsʹΑΔWebApp։ൃ
ʊਓਓਓਓਓਓਓਓਓਓਓਓਓʊʼɹGolangΤϯδχΞืूதɹʻʉY^Y^Y^Y^Y^Y^Y^Y^Y^Yʉ
ࠓͷॳΊͯͷISUCONΛGolangͰઓͬͯΈͨ※GolangҎ֎ͷ͠·ͤΜҐͱத్ͳ݁ՌͰ͕ͨ͠ʜ
ISUCONͱIikanjini Speed Up CONtest!8࣌ؒͰ༩͑ΒΕͨWebAppΛग़དྷΔݶΓߴԽ͢Δίϯςετ
༧બαʔό: 1େMySQLΛDBࠓۜߦͷϩάΠϯϖʔδ͕ࡐͰͨ͠
ܾউαʔό: 3~4ը૾ॲཧಈըͷ৴ͳͲ͋Δఔෛՙͷߴ͍ॲཧΛؚΉWebAppࠓಈըࠂͷ৴αʔόͰͨ͠
ߴͳWebαʔόͷͨΊʹϦιʔεΛ͍ΔCPU … Encode/decode, ը૾ॲཧͳͲMemory … ϓϩηε্ͷσʔλྔData Transfer … αʔόؒɺαʔόΫϥΠΞϯτؒͷ૯௨৴ྔ!ͦͷ্ͰదͳॲཧʹϦιʔεΛׂΓͯΔ
ݴޠੑೳܾఆతͳࠩʹͳΒͳ͍
Why Go?վળͷޮͷߴ͞- ߏจ͕SimpleͳͨΊ࣌ؒͷνʔϜ։ൃ͖- ฒྻɾฒߦॲཧͰͷϝϞϦपΓͷѻָ͍͕- σϓϩΠָ͕- ඪ४ύοέʔδ͕ඇৗʹ࣮༻త
औΓΜͩ͜ͱ1. ϓϩηεΩϟογϡ2. λεΫࢄॲཧ
ϓϩηεΩϟογϡσʔλΛϓϩηε্ʹશͯอ͓࣋ͯ͘͠!ӬଓԽదͳλΠϛϯάͰRedisʹอଘͳΓϑΝΠϧʹdumpͳΓ͢Δ
߹ੑવɺෳͷGoroutine͔ΒಡΈॻ͖͞ΕΔͨΊͷ߹ੑΛอূ͢Δඞཁ͕͋Δ
Race Conditionڝ߹͢Δมૢ࡞Λߦ͏ͱෆ҆ఆͳڍಈGoroutine·͍ͨͰڞ༗ͷΛಡΈॻ͖͢Δࡍrace conditionΛආ͚ΔͨΊLock͕ඞཁ
sync֤छͷϩοΫΛѻ͏ύοέʔδ!sync.RWMutex- ReadΛWriteͰϩοΫϨϕϧΛͨ͠Locksync/atomic- ΧϯλͳͲͷॲཧΛ࡞Δͷʹॏๅ
atomic.Valuefrom golang1.4!ϓϩηε্ʹatomicʹσʔλߋ৽Ͱ͖ΔετΞͱͯ͠ઃܭ͞Ε͍ͯ·͢
ಡΈࠐΈଆ7BMVF͔Β-PBE
ॻ͖ࠐΈଆ-PDLऔͬͨ͋ͱ7BMVFʹ4UPSF
λεΫͷࢄॲཧཁ݅- ॲཧʹ͔͔࣌ؒΔͷΛඇಉظɺ͔ͭฒߦ࣮ߦΛ੍ݶ࣮ͯ͠ߦ͍ͨ͠!- ը૾ɾಈըͳͲॏෳͯ͠ॲཧͨ͘͠ͳ͍
Task Queueingcapacity͖ͷchannelΛ͏goroutine͕ͦͷ··workerతʹ͑Δ
ॏෳॲཧΛආ͚Δྫ͑ը૾ॲཧதʹɺͦͷը૾Λऔಘ͠ʹདྷΔϦΫΤετΛfailͤͯ͞ͳΒͳ͍!͔͠͠ɺऔಘ࣌ʹॏෳॲཧ͕࣌ؒମແ͍
αʔό͕1ͷ߹
sync.CondॲཧதͷͷΛબతʹͭ
αʔό͕ෳͷ࣌
y-matsuwitter/mcondෳͷαʔόؒͰsync.CondΛѻ͑ΔΑ͏ʹͨ͠ͷ!Redis + net/httpΛར༻
ೋͷαʔόͰͷmcond
ॲཧଆಡΈࠐΈଆ
ॲཧઌΛৼΓ͚Δ
stathat/consistentίϯγεςϯτϋογϡϥΠϒϥϦ!Ұఆͷ໊લʹରͯ͠ඞͣಉ͡ॲཧઌΛܾఆࠓճଳҬΛ͍௵ͨ͢ΊෳͷwebdavαʔόʹৼΓ͚Δ༻్Ͱར༻
ͪͳΈʹഊҼCache-Control HeaderͰͨ͠IUUQTTV[[email protected]
࠷ޙʹ
ProductionͰ͓͏
ࢀߟඪ४ύοέʔδ http://golang.org/pkg/go1.4 http://tip.golang.org/doc/go1.4mcond https://github.com/y-matsuwitter/mcondconsistent https://github.com/stathat/consistent