Cassandra - DataSax PHP驱动程序 - 超时

时间:2016-11-21 18:19:04

标签: php cassandra

我使用Cassandra的DataSax php驱动程序遇到超时问题。 每当我执行某个命令时,它总是在10秒后抛出此异常:

PHP Fatal error:  Uncaught exception 'Cassandra\Exception\TimeoutException' with message 'Request timed out'

我的PHP代码是这样的:

$cluster   = Cassandra::cluster()->build();
$session   = $cluster->connect("my_base");
$statement = new Cassandra\SimpleStatement("SELECT COUNT(*) as c FROM my_table WHERE my_colunm = 1 AND my_colunm2 >= '2015-01-01' ALLOW FILTERING")
$result    = $session->execute($statement);
$row = $result->first();

我在 cassandra.yaml 中的设置是:

# How long the coordinator should wait for read operations to complete
read_request_timeout_in_ms: 500000
# How long the coordinator should wait for seq or index scans to complete
range_request_timeout_in_ms: 1000000
# How long the coordinator should wait for writes to complete
write_request_timeout_in_ms: 2000
# How long the coordinator should wait for counter writes to complete
counter_write_request_timeout_in_ms: 50000
# How long a coordinator should continue to retry a CAS operation
# that contends with other proposals for the same row
cas_contention_timeout_in_ms: 50000
# How long the coordinator should wait for truncates to complete
# (This can be much longer, because unless auto_snapshot is disabled
# we need to flush first so we can snapshot before removing the data.)
truncate_request_timeout_in_ms: 60000
# The default timeout for other, miscellaneous operations
request_timeout_in_ms: 1000000

我已经尝试过这个:

$result    = $session->execute($statement,new Cassandra\ExecutionOptions([
        'timeout' => 120
    ])
);

和此:

$cluster   = Cassandra::cluster()->withDefaultTimeout(120)->build();

和此:

set_time_limit(0)

它总是在10秒后抛出TimeoutException .. 我正在使用 Cassandra 3.6 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你做错了两件事。

  1. 允许过滤:小心。使用allow过滤执行此查询可能不是一个好主意,因为它可以使用大量的计算资源。不要在生产中使用允许过滤阅读 有关使用ALLOW FILTERING的datastax doc https://docs.datastax.com/en/cql/3.3/cql/cql_reference/select_r.html?hl=allow,filter
  2. count():使用count()也是一个糟糕的主意。 count()实际上遍历所有数据。因此,来自userdetails而没有限制的选择计数()预计将超过那么多行。这里有一些细节:http://planetcassandra.org/blog/counting-key-in-cassandra/
  3. 如何解决?

    • 您应该创建索引表,而不是使用ALLOW FILTERING 如果您需要不带分区键的查询,请使用您的群集列。
    • 您应该创建一个计数器表
    • ,而不是使用count(*)

答案 1 :(得分:0)

使用withConnectTimeout(而不是withDefaultTimeout或与TimeoutException一起使用)可能有助于避免使用$cluster = Cassandra::cluster()->withConnectTimeout(60)->build(); (在我的情况下如此)

csrf

但是,如果您需要这么长的超时时间,那么可能存在一个潜在的问题,最终需要解决。