У меня проблема с веб-приложением Spring Boot + cassandra.Он начал появляться с ростом данных, и теперь это супер распространенный сценарий.
Все запросы иногда не работают, CassandraRepository
возвращает null
.И через несколько секунд он снова работает, а через несколько секунд он снова не работает.Таким образом, веб-приложение постоянно возвращает 200
или 404
ответ.Тот же запрос работает в cqlsh
все время.
Я использую:
- spring-boot-starter-parent # 2.1.3
- spring-boot-starter-data-cassandra # 2.1.3
- Cassandra 3.11.3 (несколько кластеров)
Структура данных:
CREATE KEYSPACE data WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': '2'} AND durable_writes = true;
CREATE TABLE data.image (
hash text PRIMARY KEY,
image blob
) WITH bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99PERCENTILE';
Настройка соединения CassandraЯ использую:
@Configuration
@EnableCassandraRepositories(basePackages = "...path...")
public class CassandraConfig extends AbstractCassandraConfiguration {
@Bean
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
cluster.setContactPoints("127.0.0.1");
cluster.setPort(91234);
return cluster;
}
Для извлечения данных я использую CassandraRepository
с @Query(("select * from image where id = ?0"))
QueryAnnotation.Извлеченные данные содержат изображения больших двоичных объектов.
Я думаю, что здесь тайм-аут чтения является проблемой, на серверах медленные жесткие диски и не очень мощные процессоры.Но как мне перезаписать эти настройки с помощью пружинного стартера?
Я пытался использовать
SocketOptions so = new SocketOptions();
so.setConnectTimeoutMillis(10000);
so.setReadTimeoutMillis(20000);
cluster.setSocketOptions(so);
, но безуспешно.
Что еще можно сделать, чтобы иметь стабильно работающее решение?