首页 > 解决方案 > Storm 数据的最佳缓存提供商

问题描述

我们正面临 Storm 的负载问题。我们使用 Storm 状态持久性从内存中获取数据,以填充实时报告。但是在重负载环境下会有很长的 GC 停顿。因此,我们创建了另一个服务。Storm 将向该服务发送数据,该服务维护内存中的数据结构。尽管长时间的 GC 暂停已经减少,但我们仍然无法针对更重的负载环境进行扩展。我尝试在新服务中使用 REDIS 缓存。但是在重负载下写入 REDIS 非常慢。可能是由于其单线程模型。

有人可以建议一种有效的缓存机制吗?我检查了 Memcached,但它对每个键可以容纳的值的大小有限制。

以下是我尝试的代码更改:

**Pom.xml**
<!-- Spring boot Redis dependency -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>

**Bean Configuration**
@Bean
RedisTemplate<String, List<Data>> redisTemplate() {
    RedisTemplate<String, List<Data>> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(new JedisConnectionFactory()());
} 

**RedisStore abstract class**
public abstract class RedisStore<T extends BaseEvent> implements EventStoreService<Integer, T>{
private ValueOperations<String, List<T>> valOperations;

final String type;  

public RedisStore(String type, RedisTemplate<String, List<T>> redisTemplate) {
    this.valOperations = redisTemplate.opsForValue();
    this.type = type;
}

public void put(Integer id, T elem) {
    List<T> existingElems = valOperations.get(getKey(id));
    if (null == existingElems) {
        existingElems = new ArrayList<>();
    }
    existingElems.add(elem);
    valOperations.set(getKey(id), existingElems);
}
}

标签: cachingredismemcachedapache-storm

解决方案


推荐阅读