许多同时查询 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访问
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访问