【问题标题】:Many simultaneous queries gocqlx许多同时查询 gocqlx
【发布时间】:2020-08-26 02:22:16
【问题描述】:

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

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

【问题讨论】:

    标签: go cql scylla


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2022-07-01
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 2013-05-09
        • 1970-01-01
        相关资源
        最近更新 更多