Dse \ Exception \ RuntimeException:所有I / O线程上的所有连接正忙

时间:2018-06-25 08:43:40

标签: cassandra datastax-enterprise datastax-startup datastax-php-driver

我们在网络应用程序中提供了删除大量数据的功能。我们通过对根据u_id找到的所有记录进行分页。

我们拥有的键是为应用程序中的其他查询而设计的-理想情况下,为u_id拥有一个主键会很棒,但是这会破坏我们所有其他的查询。

以下方法在大多数情况下效果很好,但是,删除大约6-8百万条记录后,我们得到:

  

Dse \ Exception \ RuntimeException:所有I / O线程上的所有连接都处于忙状态

有时我们还会收到稍微不同的错误消息:

  

Dse \ Exception \ ReadTimeoutException:操作超时-仅收到0个响应

您会在下面的代码usleep(2500000)中注意到该代码暂停了脚本。这是我们的解决方法,但因为Cassandra应该能够处理此数目的删除操作,所以很容易解决此问题。

$cluster        = \Dse::cluster()
                    ->withDefaultTimeout(3600)
                      ->withContactPoints(env('CA_HOST'))
                        ->build();

$session        = $cluster->connect(env('CONNECT'));
$options        = array('page_size' => 50);
$results        = $session->execute("SELECT * FROM datastore WHERE u_id = $u_id;", $options);
$future_deletes = array();

while (true) {

    foreach ($results as $result) {

      $future_deletes[] = $session->executeAsync("DELETE FROM datastore WHERE record_id = '" . $result['record_id'] . "' AND record_version = " . $result['record_version'] . " AND user_id = " . $result['user_id']);
      $future_deletes[] = $session->executeAsync("UPDATE data_count set u_count = u_count - 1 WHERE u_id = " . $u_id);

    }

    if( !empty($future_deletes) ){
      foreach ($future_deletes as $future_delete) {
          // we will not wait for each result for more than 5 seconds
          $future_delete->get(5);
      }
      //usleep(2500000); //2.5 seconds
    }

    $future_deletes = array();

    if ($results->isLastPage()) {
        break;
    }

    $results = $results->nextPage();

}

//Disconnect
$session = NULL;

以下是我们的表格供您参考:

CREATE TABLE datastore (id uuid,
    record_id varchar,
    record_version int,
    user_id int,
    u_id int,
    column_1 varchar,
    column_2 varchar,
    column_3 varchar,
    column_4 varchar,
    column_5 varchar,
PRIMARY KEY((record_id), record_version, user_id)
);
CREATE INDEX u_id ON datastore (u_id);

CREATE TABLE data_count (u_id int PRIMARY KEY, u_count counter);

我们正在运行具有8GB RAM的服务器。

DSE驱动程序的版本为6.0.1。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您需要控制在同一时间点有多少个“运行中”请求。每个连接的查询数和连接数是有限制的。它们由Cluster类的相应功能控制(在PHP文档中找不到足够快的方法,但是它应类似于Cluster functions in the C++ driver,因为PHP是基于C ++驱动程序构建的。)