gocqlx是否具有内置方法来执行许多同时查询?我考虑过使用IN选择许多不同的记录,但是根据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
会话是用户用于与数据库进行交互的界面。对于多个goroutine并发使用是安全的,一种典型的使用场景是让一个全局会话对象与整个Cassandra集群进行交互。
典型的使用场景是让多个goroutine访问一个Session。