Cloud Datastore is the best friend for App Engine developers, yeay!
However, it may be awkward to implement an incremental counter (like AUTO_INCREMENT in MySQL) over Datastore. The good alternative is to use Bigtable to implement a counter service.
Here is a prototype of such a counter service. getCount() returns an auto increment integer number starting from 1 with strong consistency. In this sample, five of go-routines keep getting counts until they receive 100 counts per routine which results in 500 counts in total.
Before running this on Cloud Shell, you need to create a Bigtable cluster and install golang client SDK with the following command.
$ go get -u all
main.go
package main
import (
"flag"
"encoding/binary"
"log"
"sync"
"cloud.google.com/go/bigtable"
"golang.org/x/net/context"
)
const (
tableName = "CounterTable"
columnFamilyName = "count"
columnName = ""
rowName = "mycounter"
)
func sliceContains(list []string, target string) bool {
for _, s := range list {
if s == target {
return true
}
}
return false
}
func main() {
project := flag.String("project", "", "The Google Cloud Platform project ID. Required.")
instance := flag.String("instance", "", "The Google Cloud Bigtable instance ID. Required.")
flag.Parse()
for _, f := range []string{"project", "instance"} {
if flag.Lookup(f).Value.String() == "" {
log.Fatalf("The %s flag is required.", f)
}
}
ctx := context.Background()
adminClient, err := bigtable.NewAdminClient(ctx, *project, *instance)
if err != nil {
log.Fatalf("Could not create admin client: %v", err)
}
tables, err := adminClient.Tables(ctx)
if err != nil {
log.Fatalf("Could not fetch table list: %v", err)
}
if !sliceContains(tables, tableName) {
log.Printf("Creating table %s", tableName)
if err := adminClient.CreateTable(ctx, tableName); err != nil {
log.Fatalf("Could not create table %s: %v", tableName, err)
}
}
tblInfo, err := adminClient.TableInfo(ctx, tableName)
if err != nil {
log.Fatalf("Could not read info for table %s: %v", tableName, err)
}
if !sliceContains(tblInfo.Families, columnFamilyName) {
if err := adminClient.CreateColumnFamily(ctx, tableName, columnFamilyName); err != nil {
log.Fatalf("Could not create column family %s: %v", columnFamilyName, err)
}
}
client, err := bigtable.NewClient(ctx, *project, *instance)
if err != nil {
log.Fatalf("Could not create data operations client: %v", err)
}
tbl := client.Open(tableName)
mut := bigtable.NewMutation()
mut.Set(columnFamilyName, columnName, bigtable.Now(),[]byte{0, 0, 0, 0, 0, 0, 0, 0})
if err := tbl.Apply(ctx, rowName, mut); err != nil {
log.Fatalf("Could not create row: %v", err)
}
getCount := func() uint64 {
rmw := bigtable.NewReadModifyWrite()
rmw.Increment(columnFamilyName, columnName, 1)
row, err := tbl.ApplyReadModifyWrite(ctx, rowName, rmw)
if err != nil {
log.Fatalf("Could not update row: %s %v", row, err)
}
data := binary.BigEndian.Uint64(row[columnFamilyName][0].Value)
return data
}
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(id int) {
log.Printf("Start client:%d", id)
for j := 1; j < 101; j++ {
data := getCount()
log.Printf("\tclient:%d\t%s = %d\n", id, rowName, data)
}
log.Printf("Finished client:%d", id)
wg.Done()
}(i)
}
wg.Wait()
log.Printf("Finished.")
}
$ go run main.go -project bt-counter -instance mycounter
2016/11/11 10:55:54 Start client:4
2016/11/11 10:55:54 Start client:0
2016/11/11 10:55:54 Start client:1
2016/11/11 10:55:54 Start client:2
2016/11/11 10:55:54 Start client:3
2016/11/11 10:55:54 client:2 mycounter = 1
2016/11/11 10:55:54 client:1 mycounter = 2
2016/11/11 10:55:54 client:2 mycounter = 3
2016/11/11 10:55:54 client:0 mycounter = 4
2016/11/11 10:55:54 client:1 mycounter = 5
2016/11/11 10:55:54 client:2 mycounter = 6
2016/11/11 10:55:54 client:3 mycounter = 7
2016/11/11 10:55:54 client:0 mycounter = 8
2016/11/11 10:55:54 client:4 mycounter = 9
2016/11/11 10:55:54 client:2 mycounter = 10
2016/11/11 10:55:54 client:1 mycounter = 11
2016/11/11 10:55:54 client:3 mycounter = 12
2016/11/11 10:55:54 client:4 mycounter = 14
2016/11/11 10:55:54 client:2 mycounter = 15
2016/11/11 10:55:54 client:1 mycounter = 16
2016/11/11 10:55:54 client:4 mycounter = 17
2016/11/11 10:55:54 client:2 mycounter = 18
2016/11/11 10:55:54 client:1 mycounter = 19
2016/11/11 10:55:54 client:2 mycounter = 20
2016/11/11 10:55:54 client:1 mycounter = 21
2016/11/11 10:55:54 client:2 mycounter = 22
2016/11/11 10:55:54 client:0 mycounter = 13
2016/11/11 10:55:54 client:2 mycounter = 23
2016/11/11 10:55:54 client:1 mycounter = 24
2016/11/11 10:55:54 client:4 mycounter = 25
2016/11/11 10:55:54 client:3 mycounter = 26
2016/11/11 10:55:54 client:0 mycounter = 27
2016/11/11 10:55:54 client:2 mycounter = 28
2016/11/11 10:55:54 client:1 mycounter = 29
2016/11/11 10:55:54 client:4 mycounter = 30
2016/11/11 10:55:54 client:3 mycounter = 31
2016/11/11 10:55:54 client:0 mycounter = 32
2016/11/11 10:55:54 client:2 mycounter = 33
2016/11/11 10:55:54 client:1 mycounter = 34
2016/11/11 10:55:54 client:4 mycounter = 35
2016/11/11 10:55:54 client:3 mycounter = 36
2016/11/11 10:55:54 client:2 mycounter = 38
2016/11/11 10:55:54 client:0 mycounter = 37
2016/11/11 10:55:54 client:1 mycounter = 39
2016/11/11 10:55:54 client:4 mycounter = 40
2016/11/11 10:55:54 client:3 mycounter = 41
2016/11/11 10:55:54 client:2 mycounter = 42
2016/11/11 10:55:54 client:0 mycounter = 43
2016/11/11 10:55:54 client:1 mycounter = 44
2016/11/11 10:55:54 client:4 mycounter = 45
2016/11/11 10:55:54 client:3 mycounter = 46
2016/11/11 10:55:54 client:2 mycounter = 47
2016/11/11 10:55:54 client:1 mycounter = 49
2016/11/11 10:55:54 client:4 mycounter = 50
2016/11/11 10:55:54 client:0 mycounter = 48
2016/11/11 10:55:54 client:2 mycounter = 52
2016/11/11 10:55:54 client:1 mycounter = 53
2016/11/11 10:55:54 client:4 mycounter = 54
2016/11/11 10:55:54 client:0 mycounter = 55
2016/11/11 10:55:54 client:3 mycounter = 51
2016/11/11 10:55:54 client:2 mycounter = 56
2016/11/11 10:55:54 client:1 mycounter = 57
2016/11/11 10:55:54 client:4 mycounter = 58
2016/11/11 10:55:54 client:0 mycounter = 59
2016/11/11 10:55:54 client:3 mycounter = 60
2016/11/11 10:55:54 client:2 mycounter = 61
2016/11/11 10:55:54 client:1 mycounter = 62
2016/11/11 10:55:54 client:4 mycounter = 63
2016/11/11 10:55:54 client:0 mycounter = 64
2016/11/11 10:55:54 client:3 mycounter = 65
2016/11/11 10:55:54 client:2 mycounter = 66
2016/11/11 10:55:54 client:1 mycounter = 67
2016/11/11 10:55:54 client:4 mycounter = 68
2016/11/11 10:55:54 client:3 mycounter = 70
2016/11/11 10:55:55 client:4 mycounter = 73
2016/11/11 10:55:55 client:1 mycounter = 72
2016/11/11 10:55:55 client:2 mycounter = 71
2016/11/11 10:55:55 client:0 mycounter = 69
2016/11/11 10:55:55 client:3 mycounter = 74
2016/11/11 10:55:55 client:4 mycounter = 75
2016/11/11 10:55:55 client:1 mycounter = 76
2016/11/11 10:55:55 client:2 mycounter = 77
2016/11/11 10:55:55 client:0 mycounter = 78
2016/11/11 10:55:55 client:3 mycounter = 79
2016/11/11 10:55:55 client:4 mycounter = 80
2016/11/11 10:55:55 client:2 mycounter = 82
2016/11/11 10:55:55 client:1 mycounter = 81
2016/11/11 10:55:55 client:0 mycounter = 83
2016/11/11 10:55:55 client:3 mycounter = 84
2016/11/11 10:55:55 client:4 mycounter = 85
2016/11/11 10:55:55 client:2 mycounter = 86
2016/11/11 10:55:55 client:1 mycounter = 87
2016/11/11 10:55:55 client:0 mycounter = 88
2016/11/11 10:55:55 client:3 mycounter = 89
2016/11/11 10:55:55 client:4 mycounter = 90
2016/11/11 10:55:55 client:2 mycounter = 91
2016/11/11 10:55:55 client:1 mycounter = 92
2016/11/11 10:55:55 client:4 mycounter = 94
2016/11/11 10:55:55 client:0 mycounter = 93
2016/11/11 10:55:55 client:3 mycounter = 95
2016/11/11 10:55:55 client:2 mycounter = 96
2016/11/11 10:55:55 client:1 mycounter = 97
2016/11/11 10:55:55 client:0 mycounter = 98
2016/11/11 10:55:55 client:4 mycounter = 99
2016/11/11 10:55:55 client:3 mycounter = 100
2016/11/11 10:55:55 client:2 mycounter = 101
2016/11/11 10:55:55 client:1 mycounter = 102
2016/11/11 10:55:55 client:0 mycounter = 103
2016/11/11 10:55:55 client:4 mycounter = 104
2016/11/11 10:55:55 client:3 mycounter = 105
2016/11/11 10:55:55 client:2 mycounter = 106
2016/11/11 10:55:55 client:1 mycounter = 107
2016/11/11 10:55:55 client:0 mycounter = 108
2016/11/11 10:55:55 client:4 mycounter = 109
2016/11/11 10:55:55 client:3 mycounter = 110
2016/11/11 10:55:55 client:2 mycounter = 111
2016/11/11 10:55:55 client:1 mycounter = 112
2016/11/11 10:55:55 client:0 mycounter = 113
2016/11/11 10:55:55 client:4 mycounter = 114
2016/11/11 10:55:55 client:3 mycounter = 115
2016/11/11 10:55:55 client:2 mycounter = 116
2016/11/11 10:55:55 client:0 mycounter = 118
2016/11/11 10:55:55 client:4 mycounter = 119
2016/11/11 10:55:55 client:3 mycounter = 120
2016/11/11 10:55:55 client:2 mycounter = 121
2016/11/11 10:55:55 client:1 mycounter = 117
2016/11/11 10:55:55 client:0 mycounter = 122
2016/11/11 10:55:55 client:4 mycounter = 123
2016/11/11 10:55:55 client:3 mycounter = 124
2016/11/11 10:55:55 client:2 mycounter = 125
2016/11/11 10:55:55 client:1 mycounter = 126
2016/11/11 10:55:55 client:0 mycounter = 127
2016/11/11 10:55:55 client:4 mycounter = 128
2016/11/11 10:55:55 client:3 mycounter = 129
2016/11/11 10:55:55 client:2 mycounter = 130
2016/11/11 10:55:55 client:1 mycounter = 131
2016/11/11 10:55:55 client:0 mycounter = 132
2016/11/11 10:55:55 client:4 mycounter = 133
2016/11/11 10:55:55 client:3 mycounter = 134
2016/11/11 10:55:55 client:2 mycounter = 135
2016/11/11 10:55:55 client:1 mycounter = 136
2016/11/11 10:55:55 client:0 mycounter = 137
2016/11/11 10:55:55 client:4 mycounter = 138
2016/11/11 10:55:55 client:3 mycounter = 139
2016/11/11 10:55:55 client:1 mycounter = 140
2016/11/11 10:55:55 client:2 mycounter = 141
2016/11/11 10:55:55 client:0 mycounter = 142
2016/11/11 10:55:55 client:4 mycounter = 143
2016/11/11 10:55:55 client:3 mycounter = 144
2016/11/11 10:55:55 client:1 mycounter = 145
2016/11/11 10:55:55 client:2 mycounter = 146
2016/11/11 10:55:55 client:0 mycounter = 147
2016/11/11 10:55:55 client:4 mycounter = 148
2016/11/11 10:55:55 client:3 mycounter = 149
2016/11/11 10:55:55 client:1 mycounter = 150
2016/11/11 10:55:55 client:2 mycounter = 151
2016/11/11 10:55:55 client:4 mycounter = 152
2016/11/11 10:55:55 client:0 mycounter = 153
2016/11/11 10:55:55 client:3 mycounter = 154
2016/11/11 10:55:55 client:1 mycounter = 155
2016/11/11 10:55:55 client:2 mycounter = 156
2016/11/11 10:55:55 client:4 mycounter = 157
2016/11/11 10:55:55 client:0 mycounter = 158
2016/11/11 10:55:55 client:3 mycounter = 159
2016/11/11 10:55:55 client:1 mycounter = 160
2016/11/11 10:55:55 client:2 mycounter = 161
2016/11/11 10:55:55 client:4 mycounter = 162
2016/11/11 10:55:55 client:0 mycounter = 163
2016/11/11 10:55:55 client:3 mycounter = 164
2016/11/11 10:55:55 client:1 mycounter = 165
2016/11/11 10:55:55 client:2 mycounter = 166
2016/11/11 10:55:55 client:4 mycounter = 167
2016/11/11 10:55:55 client:0 mycounter = 168
2016/11/11 10:55:55 client:3 mycounter = 169
2016/11/11 10:55:55 client:2 mycounter = 171
2016/11/11 10:55:55 client:4 mycounter = 172
2016/11/11 10:55:55 client:0 mycounter = 173
2016/11/11 10:55:55 client:1 mycounter = 170
2016/11/11 10:55:55 client:3 mycounter = 174
2016/11/11 10:55:55 client:2 mycounter = 175
2016/11/11 10:55:55 client:4 mycounter = 176
2016/11/11 10:55:55 client:0 mycounter = 177
2016/11/11 10:55:55 client:1 mycounter = 178
2016/11/11 10:55:55 client:3 mycounter = 179
2016/11/11 10:55:55 client:2 mycounter = 180
2016/11/11 10:55:55 client:4 mycounter = 181
2016/11/11 10:55:55 client:0 mycounter = 182
2016/11/11 10:55:55 client:1 mycounter = 183
2016/11/11 10:55:55 client:3 mycounter = 184
2016/11/11 10:55:55 client:2 mycounter = 185
2016/11/11 10:55:55 client:4 mycounter = 186
2016/11/11 10:55:55 client:0 mycounter = 187
2016/11/11 10:55:55 client:1 mycounter = 188
2016/11/11 10:55:55 client:3 mycounter = 189
2016/11/11 10:55:55 client:2 mycounter = 190
2016/11/11 10:55:55 client:4 mycounter = 191
2016/11/11 10:55:55 client:0 mycounter = 192
2016/11/11 10:55:55 client:1 mycounter = 193
2016/11/11 10:55:55 client:3 mycounter = 194
2016/11/11 10:55:55 client:2 mycounter = 195
2016/11/11 10:55:55 client:4 mycounter = 196
2016/11/11 10:55:55 client:0 mycounter = 197
2016/11/11 10:55:55 client:1 mycounter = 198
2016/11/11 10:55:55 client:3 mycounter = 199
2016/11/11 10:55:55 client:2 mycounter = 200
2016/11/11 10:55:55 client:4 mycounter = 201
2016/11/11 10:55:55 client:0 mycounter = 202
2016/11/11 10:55:55 client:1 mycounter = 203
2016/11/11 10:55:55 client:3 mycounter = 204
2016/11/11 10:55:55 client:2 mycounter = 205
2016/11/11 10:55:55 client:4 mycounter = 206
2016/11/11 10:55:55 client:0 mycounter = 207
2016/11/11 10:55:55 client:1 mycounter = 208
2016/11/11 10:55:55 client:3 mycounter = 209
2016/11/11 10:55:55 client:2 mycounter = 210
2016/11/11 10:55:55 client:4 mycounter = 211
2016/11/11 10:55:55 client:0 mycounter = 212
2016/11/11 10:55:55 client:1 mycounter = 213
2016/11/11 10:55:55 client:3 mycounter = 214
2016/11/11 10:55:55 client:2 mycounter = 215
2016/11/11 10:55:55 client:4 mycounter = 216
2016/11/11 10:55:55 client:0 mycounter = 217
2016/11/11 10:55:55 client:1 mycounter = 218
2016/11/11 10:55:55 client:3 mycounter = 219
2016/11/11 10:55:55 client:2 mycounter = 220
2016/11/11 10:55:55 client:4 mycounter = 221
2016/11/11 10:55:55 client:0 mycounter = 222
2016/11/11 10:55:55 client:1 mycounter = 223
2016/11/11 10:55:55 client:3 mycounter = 224
2016/11/11 10:55:55 client:2 mycounter = 225
2016/11/11 10:55:55 client:0 mycounter = 227
2016/11/11 10:55:55 client:1 mycounter = 228
2016/11/11 10:55:55 client:4 mycounter = 226
2016/11/11 10:55:55 client:2 mycounter = 230
2016/11/11 10:55:55 client:3 mycounter = 229
2016/11/11 10:55:55 client:0 mycounter = 231
2016/11/11 10:55:55 client:1 mycounter = 232
2016/11/11 10:55:55 client:4 mycounter = 233
2016/11/11 10:55:55 client:2 mycounter = 234
2016/11/11 10:55:55 client:3 mycounter = 235
2016/11/11 10:55:55 client:0 mycounter = 236
2016/11/11 10:55:55 client:1 mycounter = 237
2016/11/11 10:55:55 client:4 mycounter = 238
2016/11/11 10:55:55 client:2 mycounter = 239
2016/11/11 10:55:55 client:3 mycounter = 240
2016/11/11 10:55:55 client:0 mycounter = 241
2016/11/11 10:55:55 client:1 mycounter = 242
2016/11/11 10:55:55 client:4 mycounter = 243
2016/11/11 10:55:55 client:2 mycounter = 244
2016/11/11 10:55:55 client:3 mycounter = 245
2016/11/11 10:55:55 client:0 mycounter = 246
2016/11/11 10:55:55 client:1 mycounter = 247
2016/11/11 10:55:55 client:4 mycounter = 248
2016/11/11 10:55:55 client:3 mycounter = 250
2016/11/11 10:55:55 client:2 mycounter = 249
2016/11/11 10:55:55 client:0 mycounter = 251
2016/11/11 10:55:55 client:1 mycounter = 252
2016/11/11 10:55:55 client:4 mycounter = 253
2016/11/11 10:55:55 client:3 mycounter = 254
2016/11/11 10:55:55 client:2 mycounter = 255
2016/11/11 10:55:55 client:0 mycounter = 256
2016/11/11 10:55:55 client:1 mycounter = 257
2016/11/11 10:55:55 client:4 mycounter = 258
2016/11/11 10:55:55 client:3 mycounter = 259
2016/11/11 10:55:55 client:2 mycounter = 260
2016/11/11 10:55:55 client:0 mycounter = 261
2016/11/11 10:55:55 client:1 mycounter = 262
2016/11/11 10:55:55 client:4 mycounter = 263
2016/11/11 10:55:55 client:3 mycounter = 264
2016/11/11 10:55:55 client:2 mycounter = 265
2016/11/11 10:55:55 client:0 mycounter = 266
2016/11/11 10:55:55 client:1 mycounter = 267
2016/11/11 10:55:55 client:4 mycounter = 268
2016/11/11 10:55:55 client:3 mycounter = 269
2016/11/11 10:55:55 client:2 mycounter = 270
2016/11/11 10:55:55 client:0 mycounter = 271
2016/11/11 10:55:55 client:1 mycounter = 272
2016/11/11 10:55:55 client:4 mycounter = 273
2016/11/11 10:55:55 client:3 mycounter = 274
2016/11/11 10:55:55 client:2 mycounter = 275
2016/11/11 10:55:55 client:0 mycounter = 276
2016/11/11 10:55:55 client:1 mycounter = 277
2016/11/11 10:55:55 client:4 mycounter = 278
2016/11/11 10:55:55 client:3 mycounter = 279
2016/11/11 10:55:55 client:2 mycounter = 280
2016/11/11 10:55:55 client:0 mycounter = 281
2016/11/11 10:55:55 client:1 mycounter = 282
2016/11/11 10:55:55 client:4 mycounter = 283
2016/11/11 10:55:55 client:3 mycounter = 284
2016/11/11 10:55:55 client:2 mycounter = 285
2016/11/11 10:55:55 client:0 mycounter = 286
2016/11/11 10:55:55 client:1 mycounter = 287
2016/11/11 10:55:55 client:4 mycounter = 288
2016/11/11 10:55:55 client:0 mycounter = 290
2016/11/11 10:55:55 client:3 mycounter = 289
2016/11/11 10:55:55 client:2 mycounter = 291
2016/11/11 10:55:55 client:1 mycounter = 292
2016/11/11 10:55:55 client:4 mycounter = 293
2016/11/11 10:55:55 client:0 mycounter = 294
2016/11/11 10:55:55 client:3 mycounter = 295
2016/11/11 10:55:55 client:2 mycounter = 296
2016/11/11 10:55:55 client:1 mycounter = 297
2016/11/11 10:55:55 client:4 mycounter = 298
2016/11/11 10:55:55 client:0 mycounter = 299
2016/11/11 10:55:55 client:3 mycounter = 300
2016/11/11 10:55:55 client:2 mycounter = 301
2016/11/11 10:55:55 client:1 mycounter = 302
2016/11/11 10:55:55 client:4 mycounter = 303
2016/11/11 10:55:55 client:0 mycounter = 304
2016/11/11 10:55:55 client:3 mycounter = 305
2016/11/11 10:55:55 client:2 mycounter = 306
2016/11/11 10:55:55 client:1 mycounter = 307
2016/11/11 10:55:55 client:4 mycounter = 308
2016/11/11 10:55:55 client:0 mycounter = 309
2016/11/11 10:55:55 client:3 mycounter = 310
2016/11/11 10:55:55 client:2 mycounter = 311
2016/11/11 10:55:55 client:1 mycounter = 312
2016/11/11 10:55:55 client:4 mycounter = 313
2016/11/11 10:55:55 client:3 mycounter = 315
2016/11/11 10:55:55 client:0 mycounter = 314
2016/11/11 10:55:55 client:2 mycounter = 316
2016/11/11 10:55:55 client:1 mycounter = 317
2016/11/11 10:55:55 client:3 mycounter = 318
2016/11/11 10:55:55 client:4 mycounter = 319
2016/11/11 10:55:55 client:0 mycounter = 320
2016/11/11 10:55:55 client:1 mycounter = 322
2016/11/11 10:55:55 client:2 mycounter = 321
2016/11/11 10:55:55 client:3 mycounter = 323
2016/11/11 10:55:55 client:4 mycounter = 324
2016/11/11 10:55:55 client:0 mycounter = 325
2016/11/11 10:55:55 client:1 mycounter = 326
2016/11/11 10:55:55 client:2 mycounter = 327
2016/11/11 10:55:55 client:3 mycounter = 328
2016/11/11 10:55:55 client:1 mycounter = 330
2016/11/11 10:55:55 client:4 mycounter = 329
2016/11/11 10:55:55 client:0 mycounter = 331
2016/11/11 10:55:55 client:2 mycounter = 332
2016/11/11 10:55:55 client:3 mycounter = 333
2016/11/11 10:55:55 client:1 mycounter = 334
2016/11/11 10:55:55 client:4 mycounter = 335
2016/11/11 10:55:55 client:0 mycounter = 336
2016/11/11 10:55:55 client:2 mycounter = 337
2016/11/11 10:55:55 client:3 mycounter = 338
2016/11/11 10:55:55 client:1 mycounter = 339
2016/11/11 10:55:55 client:4 mycounter = 340
2016/11/11 10:55:55 client:0 mycounter = 341
2016/11/11 10:55:55 client:2 mycounter = 342
2016/11/11 10:55:55 client:3 mycounter = 343
2016/11/11 10:55:55 client:4 mycounter = 345
2016/11/11 10:55:55 client:0 mycounter = 346
2016/11/11 10:55:55 client:2 mycounter = 347
2016/11/11 10:55:55 client:1 mycounter = 344
2016/11/11 10:55:55 client:3 mycounter = 348
2016/11/11 10:55:55 client:4 mycounter = 349
2016/11/11 10:55:55 client:0 mycounter = 350
2016/11/11 10:55:55 client:2 mycounter = 351
2016/11/11 10:55:55 client:1 mycounter = 352
2016/11/11 10:55:55 client:4 mycounter = 354
2016/11/11 10:55:55 client:3 mycounter = 353
2016/11/11 10:55:55 client:0 mycounter = 355
2016/11/11 10:55:55 client:2 mycounter = 356
2016/11/11 10:55:55 client:1 mycounter = 357
2016/11/11 10:55:55 client:4 mycounter = 358
2016/11/11 10:55:55 client:3 mycounter = 359
2016/11/11 10:55:55 client:0 mycounter = 360
2016/11/11 10:55:55 client:2 mycounter = 361
2016/11/11 10:55:55 client:1 mycounter = 362
2016/11/11 10:55:55 client:4 mycounter = 363
2016/11/11 10:55:55 client:3 mycounter = 364
2016/11/11 10:55:55 client:2 mycounter = 366
2016/11/11 10:55:55 client:1 mycounter = 367
2016/11/11 10:55:55 client:0 mycounter = 365
2016/11/11 10:55:55 client:4 mycounter = 368
2016/11/11 10:55:55 client:3 mycounter = 369
2016/11/11 10:55:55 client:1 mycounter = 371
2016/11/11 10:55:55 client:2 mycounter = 370
2016/11/11 10:55:55 client:0 mycounter = 372
2016/11/11 10:55:55 client:4 mycounter = 373
2016/11/11 10:55:55 client:3 mycounter = 374
2016/11/11 10:55:55 client:1 mycounter = 375
2016/11/11 10:55:55 client:2 mycounter = 376
2016/11/11 10:55:55 client:0 mycounter = 377
2016/11/11 10:55:55 client:4 mycounter = 378
2016/11/11 10:55:55 client:3 mycounter = 379
2016/11/11 10:55:55 client:1 mycounter = 380
2016/11/11 10:55:55 client:2 mycounter = 381
2016/11/11 10:55:55 client:0 mycounter = 382
2016/11/11 10:55:55 client:4 mycounter = 383
2016/11/11 10:55:55 client:3 mycounter = 384
2016/11/11 10:55:55 client:2 mycounter = 386
2016/11/11 10:55:55 client:1 mycounter = 385
2016/11/11 10:55:55 client:0 mycounter = 387
2016/11/11 10:55:55 client:4 mycounter = 388
2016/11/11 10:55:55 client:3 mycounter = 389
2016/11/11 10:55:55 client:2 mycounter = 390
2016/11/11 10:55:55 client:1 mycounter = 391
2016/11/11 10:55:55 client:0 mycounter = 392
2016/11/11 10:55:55 client:4 mycounter = 393
2016/11/11 10:55:55 client:3 mycounter = 394
2016/11/11 10:55:55 client:2 mycounter = 395
2016/11/11 10:55:55 client:1 mycounter = 396
2016/11/11 10:55:55 client:4 mycounter = 398
2016/11/11 10:55:55 client:0 mycounter = 397
2016/11/11 10:55:55 client:3 mycounter = 399
2016/11/11 10:55:55 client:2 mycounter = 400
2016/11/11 10:55:55 client:4 mycounter = 402
2016/11/11 10:55:55 client:1 mycounter = 401
2016/11/11 10:55:55 client:0 mycounter = 403
2016/11/11 10:55:55 client:3 mycounter = 404
2016/11/11 10:55:55 client:4 mycounter = 405
2016/11/11 10:55:55 client:2 mycounter = 406
2016/11/11 10:55:55 client:1 mycounter = 407
2016/11/11 10:55:55 client:0 mycounter = 408
2016/11/11 10:55:55 client:3 mycounter = 409
2016/11/11 10:55:55 client:4 mycounter = 410
2016/11/11 10:55:55 client:2 mycounter = 411
2016/11/11 10:55:55 client:1 mycounter = 412
2016/11/11 10:55:55 client:3 mycounter = 414
2016/11/11 10:55:55 client:0 mycounter = 413
2016/11/11 10:55:55 client:4 mycounter = 415
2016/11/11 10:55:55 client:2 mycounter = 416
2016/11/11 10:55:55 client:3 mycounter = 418
2016/11/11 10:55:55 client:1 mycounter = 417
2016/11/11 10:55:55 client:0 mycounter = 419
2016/11/11 10:55:55 client:4 mycounter = 420
2016/11/11 10:55:55 client:2 mycounter = 421
2016/11/11 10:55:55 client:3 mycounter = 422
2016/11/11 10:55:55 client:1 mycounter = 423
2016/11/11 10:55:55 client:0 mycounter = 424
2016/11/11 10:55:55 client:2 mycounter = 426
2016/11/11 10:55:55 client:4 mycounter = 425
2016/11/11 10:55:55 client:3 mycounter = 427
2016/11/11 10:55:55 client:1 mycounter = 428
2016/11/11 10:55:55 client:0 mycounter = 429
2016/11/11 10:55:55 client:2 mycounter = 430
2016/11/11 10:55:55 client:4 mycounter = 431
2016/11/11 10:55:55 client:3 mycounter = 432
2016/11/11 10:55:55 client:0 mycounter = 433
2016/11/11 10:55:55 client:2 mycounter = 435
2016/11/11 10:55:55 client:1 mycounter = 434
2016/11/11 10:55:55 client:4 mycounter = 436
2016/11/11 10:55:55 client:3 mycounter = 437
2016/11/11 10:55:55 client:0 mycounter = 438
2016/11/11 10:55:55 client:2 mycounter = 439
2016/11/11 10:55:55 client:1 mycounter = 440
2016/11/11 10:55:55 client:3 mycounter = 442
2016/11/11 10:55:55 client:0 mycounter = 443
2016/11/11 10:55:55 client:4 mycounter = 441
2016/11/11 10:55:55 client:2 mycounter = 444
2016/11/11 10:55:55 client:0 mycounter = 446
2016/11/11 10:55:55 client:1 mycounter = 445
2016/11/11 10:55:55 client:3 mycounter = 447
2016/11/11 10:55:55 client:4 mycounter = 448
2016/11/11 10:55:55 client:2 mycounter = 449
2016/11/11 10:55:55 client:1 mycounter = 450
2016/11/11 10:55:55 client:0 mycounter = 451
2016/11/11 10:55:55 client:3 mycounter = 452
2016/11/11 10:55:55 client:1 mycounter = 454
2016/11/11 10:55:55 client:4 mycounter = 453
2016/11/11 10:55:55 client:2 mycounter = 455
2016/11/11 10:55:55 client:0 mycounter = 456
2016/11/11 10:55:55 client:1 mycounter = 458
2016/11/11 10:55:55 client:3 mycounter = 457
2016/11/11 10:55:55 client:4 mycounter = 459
2016/11/11 10:55:55 client:2 mycounter = 460
2016/11/11 10:55:55 client:0 mycounter = 461
2016/11/11 10:55:55 client:3 mycounter = 463
2016/11/11 10:55:55 client:1 mycounter = 462
2016/11/11 10:55:55 client:4 mycounter = 464
2016/11/11 10:55:55 client:2 mycounter = 465
2016/11/11 10:55:55 client:0 mycounter = 466
2016/11/11 10:55:55 client:3 mycounter = 467
2016/11/11 10:55:55 client:1 mycounter = 468
2016/11/11 10:55:55 client:2 mycounter = 469
2016/11/11 10:55:55 client:4 mycounter = 470
2016/11/11 10:55:55 client:0 mycounter = 471
2016/11/11 10:55:55 client:3 mycounter = 472
2016/11/11 10:55:55 client:2 mycounter = 473
2016/11/11 10:55:55 Finished client:2
2016/11/11 10:55:55 client:1 mycounter = 474
2016/11/11 10:55:55 client:4 mycounter = 475
2016/11/11 10:55:55 client:0 mycounter = 476
2016/11/11 10:55:55 client:3 mycounter = 477
2016/11/11 10:55:55 client:4 mycounter = 478
2016/11/11 10:55:55 client:1 mycounter = 479
2016/11/11 10:55:55 client:0 mycounter = 480
2016/11/11 10:55:55 client:4 mycounter = 481
2016/11/11 10:55:55 client:3 mycounter = 482
2016/11/11 10:55:55 client:1 mycounter = 483
2016/11/11 10:55:55 client:0 mycounter = 484
2016/11/11 10:55:55 client:4 mycounter = 485
2016/11/11 10:55:55 client:3 mycounter = 486
2016/11/11 10:55:55 client:1 mycounter = 487
2016/11/11 10:55:55 client:0 mycounter = 488
2016/11/11 10:55:55 client:1 mycounter = 491
2016/11/11 10:55:55 Finished client:1
2016/11/11 10:55:55 client:3 mycounter = 490
2016/11/11 10:55:55 client:4 mycounter = 489
2016/11/11 10:55:55 client:0 mycounter = 492
2016/11/11 10:55:55 client:3 mycounter = 493
2016/11/11 10:55:55 client:4 mycounter = 494
2016/11/11 10:55:55 Finished client:4
2016/11/11 10:55:55 client:0 mycounter = 495
2016/11/11 10:55:55 client:3 mycounter = 496
2016/11/11 10:55:55 client:0 mycounter = 497
2016/11/11 10:55:55 client:3 mycounter = 498
2016/11/11 10:55:55 client:0 mycounter = 499
2016/11/11 10:55:55 Finished client:0
2016/11/11 10:55:55 client:3 mycounter = 500
2016/11/11 10:55:55 Finished client:3
2016/11/11 10:55:55 Finished.
It works! Now you can create an API service for providing counters running on App Engine. You may need to use a flexible environment since go client library is not supported on the standard environment at the time of writing.
Disclaimer: All code snippets are released under Apache 2.0 License. This is not an official Google product.