Cloud Datastore 活用術

7 June 2016

Profile

2

Cloud Datastore Update

Indexの数は考慮されず、操作したEntityの数のみがカウントされるように変更

Entity Reads   : $0.06 per 100,000 entities
Entity Writes  : $0.18 per 100,000 entities
Entity Deletes : $0.02 per 100,000 entities
3

Cloud Datastoreらしい構成

4

Kind 設計

5

Key 設計

type User struct {
    ID          int // key value
    AccountName string
    NickName    string
    Email       string // uniqueにするのが難しい
}

// Login時に利用するKind
type EmailToUser struct {
    Email    string // key value
    UserID   int
    Password string
}
6

タブレットサーバの分割問題

7

pagenationは苦手

q := datastore.NewQuery("Item").Order("-UpdatedAt").Limit(limit)
if len(cursorParam) > 0 {
    cursor, err := datastore.DecodeCursor(cursorParam)
    if err == nil {
        q = q.Start(cursor)
    }
}
8

Query

9

Query Price

10

Datastore Write Ops

11

Datastore Read Ops

12

Datastoer Smaill Ops

13

Keys Only Query ?

q := datastore.NewQuery("Item").KeysOnly()
14

Indexの節約

15

Queryに使わないIndexはoffに

type Item struct {
    Title     string    `json:"title" datastore:",noindex"`
}
16

InMemory Filter & Sort

17

Custom Index or Kind分割 (1)

type Item struct {
    KeyStr    string    `json:"key" datastore:"-"`
    Title     string    `json:"title" datastore:",noindex"`
    Category  string    `json:"category"`
    DelFlg    bool      `json:"delFlg"`
    CreatedAt time.Time `json:"createdAt"`
    UpdatedAt time.Time `json:"updatedAt"`
}
18

Custom Index or Kind分割 (2)

type Item struct {
    KeyStr    string    `json:"key" datastore:"-"`
    Title     string    `json:"title" datastore:",noindex"`
    Category  string    `json:"category"`
    CreatedAt time.Time `json:"createdAt"`
    UpdatedAt time.Time `json:"updatedAt"`
}
19

Batch操作

20

Batch操作 Bad !

for key := range keys {
    err := datastore.Get(ctx, key, dst)
}
21

Batch操作 Good !

err := datastore.GetMulti(ctx, keys, dst)
22

集計

23

集計はMemcacheやPull Queueを活用する

集計はputされる時に、やることが多い。

24

集計 Bad !

25

集計 Good ! (1)

26

集計 Good ! (2)

27

Task Queueの活用

28

重たい処理はUser Requestの外で

29

自作IndexをTQで作る

30

大量のデータ更新もTQで

31

非同期処理

32

非同期処理

33

Example

34

同期で呼んだ場合 (code)

var entries []Entry
var comments []Comment
var friends []Friend
var footprint []Footprint
_, err := datastore.NewQuery("Entry").GetAll(ctx, &entries)
_, err = datastore.NewQuery("Comment").GetAll(ctx, &comments)
_, err = datastore.NewQuery("Friend").GetAll(ctx, &friends)
_, err = datastore.NewQuery("Footprint").GetAll(ctx, &footprint)
35

同期で呼んだ場合 (trace)

36

非同期で呼んだ場合 (code)

var entries []Entry
var comments []Comment
var friends []Friend
var footprint []Footprint
errc := make(chan error)
go func() {
    _, err := datastore.NewQuery("Entry").GetAll(ctx, &entries)
    errc <- err
}()
go func() {
    _, err := datastore.NewQuery("Comment").GetAll(ctx, &comments)
    errc <- err
}()
go func() {
    _, err := datastore.NewQuery("Friend").GetAll(ctx, &friends)
    errc <- err
}()
go func() {
    _, err := datastore.NewQuery("Footprint").GetAll(ctx, &footprint)
    errc <- err
}()
err1, err2, err3, err4 := <-errc, <-errc, <-errc, <-errc
37

非同期で呼んだ場合 (trace)

38

Advanced Technic

39

Keyに全てを

datastore.NewKey(c, "Item", fmt.Sprintf("%s-_-%s-_-%s", uuid.New(), title, category) , 0, nil)
40

1 Entityに集約

41

Advertise

42

Resource

43

Thank you

TOPGATE GAEマイスター

Use the left and right arrow keys or click the left and right edges of the page to navigate between slides.
(Press 'H' or navigate to hide this message.)