Slide 1

Slide 1 text

2 Koji Aomatsu 2021 . 11 . 1 3 .

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

# 2 視 視 1 : N

Slide 5

Slide 5 text

# iOS Go Go 
 
 # GO API

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

# Cloud SQL Datastore # DB # 2

Slide 8

Slide 8 text

# 2 Begin, Prepare, Commit XA Transaction , 2 MySQL PostgreSQL

Slide 9

Slide 9 text

# 視 DB 規 # 視

Slide 10

Slide 10 text

channel goroutine 1 goroutine 2 視 Datastore Cloud SQL

Slide 11

Slide 11 text

# 視 視 sync.WaitGroup 規 // Cloud SQL -> Datastore // ॲཧ201͕ऴΘͬͨ͜ͱΛ஌ΒͤΔ c1 := make(chan int) // Cloud SQL -> Datastore // ॲཧ202Ͱબ୒͞Εͨঢ়ଶΛ఻͑Δ c2 := make(chan int) // Cloud SQL -> Datastore // Prepare (err != nil ͳΒࣦഊ͍ͯ͠Δ) dbPrepareCh := make(chan error) // Datastore -> Cloud SQL // DatastoreͷτϥϯβΫγϣϯ݁Ռ dbTxResultCh := make(chan error, 1)

Slide 12

Slide 12 text

channel goroutine 1 goroutine 2 視 Datastore Cloud SQL

Slide 13

Slide 13 text

// Datastore go func() { defer close(dsTxResultCh) begin() doSomething(101) <-c1 doSomething(102) state := <-c2 doSomething(state) // Prepare err := <-dbPrepareCh if err != nil { dsTxResultCh <- err rollback() } else { err = commit() dsTxResultCh <- err } }() # defer 視 dbPrepareCh

Slide 14

Slide 14 text

// Datastore go func() { ... doSomething(101) _, ok := <-c1 if !ok { rollback() return } doSomething(102) state := <-c2 err := doSomething(state) if err != nil { rollback() // ϒϩοΫΛղআ͢Δඞཁ͕ग़Δ <-dbPrepareCh return } ... }() # select

Slide 15

Slide 15 text

channel goroutine 1 goroutine 2 視 Datastore Cloud SQL

Slide 16

Slide 16 text

// Cloud SQL go func() { defer close(c1) defer close(c2) defer close(dbPrepareCh) begin() doSomething(201) c1 <- 0 doSomething(202) c2 <- SomeState err := doSomething(203) dbPrepareCh <- err err = <-dsTxResultCh if err != nil { commit() } else { rollback() } }() # defer dbPrepareCh Prepare dsTxResultCh Datastore

Slide 17

Slide 17 text

# #

Slide 18

Slide 18 text

# 規 規

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

# API # 視 #

Slide 21

Slide 21 text

# API 30 GAE 10% # runtime.NumGoroutine() 10%

Slide 22

Slide 22 text

# // 3000ඵ͔͔Δ func handle1() { for i := 0; i < 1000; i++ { send(i) } } // 3ඵͰऴΘΔ func handle2() { for i := 0; i < 1000; i++ { go send(i) } } func send(num int) { time.Sleep(3 * time.Second) fmt.Printf("sent %v\n", num) }

Slide 23

Slide 23 text

# func handle() { c := make(chan int, 300) go func() { defer close(c) for i := 0; i < 10000; i++ { c <- i } }() var wg sync.WaitGroup for i := 0; i < 100; i++ { wg.Add(1) go func() { defer wg.Done() for { num, ok := <-c if !ok { return } send(num) } }() } wg.Wait() }

Slide 24

Slide 24 text

# 1

Slide 25

Slide 25 text

# API GAE Context log

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

# 規 視 2 3 1

Slide 28

Slide 28 text

# API DB

Slide 29

Slide 29 text

Thank you for watching. Twitter @kojiaomatsu