许多同时查询gocqlx

问题描述 投票:1回答:2

gocqlx是否具有内置方法来执行许多同时查询?我考虑过使用IN选择许多不同的记录,但是根据this answer,使用许多查询比使用IN子句更好。

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

go cql scylla
2个回答
1
投票

关于您可以运行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


0
投票

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

会话是用户用于与数据库进行交互的界面。对于多个goroutine并发使用是安全的,一种典型的使用场景是让一个全局会话对象与整个Cassandra集群进行交互。

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

© www.soinside.com 2019 - 2024. All rights reserved.