许多同时查询 gocqlx

Many simultaneous queries gocqlx

gocqlx 是否有一个内置的方法来做很多同时查询? 我考虑过使用 IN 来 select 许多不同的记录,但根据 this answer,使用许多查询比使用 IN 子句更好。

如果 gocqlx 不具备 运行 本机并行查询的能力,我如何才能最有效地自己实现它?我需要使用它来同时进行 100 个查询,并且这个过程可能需要 运行 每秒最多 10 次,因此每秒大约 100 * 10 = 1000 个查询。

关于可以 运行 100 个并发查询的方法的一个建议是生成 100 个 goroutine,然后在它们全部 运行 之后收集它们的结果。这是否会满足您的 1000 QPS 要求我不能说,但您可以尝试在您的硬件上以该 QPS 测试它以找出答案。

这是它的样子(伪代码):

type queryResult struct { ... }

func doQuery(qry MyQuery, resChan chan queryResult, wg *sync.WaitGroup) {
   result := // do query
   resChan <- result
   wg.Done()
}

// in main:

resChan = make(chan queryResult, len(queries))
var wg sync.WaitGroup

for _, query := range queries {
  go doQuery(query, resChan, &wg)
  wg.Add(1)
}

wg.Wait()
close(resChan)

for res := range resChan {
  // get results
}

如果您不需要结果,可以使用没有结果通道的 sync.WaitGroup 来验证您的所有查询是否已完成。

如果您不想用完与数据库的所有连接,或者出于任何原因不想拥有 1000 个 goroutine,您可以使用此处所述的工作池:https://gobyexample.com/worker-pools

https://godoc.org/github.com/gocql/gocql#Session

Session is the interface used by users to interact with the database. It's safe for concurrent use by multiple goroutines and a typical usage scenario is to have one global session object to interact with the whole Cassandra cluster.

典型的使用场景是一个Session被多个goroutine访问