首页 > 解决方案 > 如何对 Set 进行分片?

问题描述

你能帮我做一件事吗?想象一下,我有一个简单的 RESTful 微服务器,其中一种GET方法简单地响应随机String.

我将所有字符串组合成一个ConcurrentHashSet<String>包含所有答案的字符串。

下面有一个草率的实现,主要是它Set<String>是故障安全的,可以同时修改。

@RestController
public class Controller {

    private final StringService stringService;

    private final CacheService cacheService;

    public Controller(final StringService stringService, final CacheService cacheService) {
        this.stringService = stringService;
        this.cacheService = cacheService;
    }

    @GetMapping
    public String get() {
        final String str = stringService.random();
        cacheService.add(str);
        return str;
    }

}


public class CacheService {

    private final Set<String> set = ConcurrentHashMap.newKeySet();

    public void add(final String str) {
        set.add(str);
    }

}

当您阅读此行时,我的 endpint 正在被 10 亿人使用。我想分片缓存。由于我的系统负载很重,我无法在一台服务器上保存所有字符串。我想拥有 256 个服务器/实例,并利用str.hashCode()%256函数统一分配我的缓存,以确定每个服务器/实例上是否应该保留一个字符串。

你能告诉我下一步该怎么做吗?假设目前,我只在本地运行 Spring Boot 应用程序。

标签: javaspring-bootcloudscalabilitysharding

解决方案


您应该查看Hazelcast,它是开源的,并且在我想在我的应用程序的多个实例之间共享数据的情况下证明对我很有用。hazelcast 提供的内存数据网格可能正是您正在寻找的东西。


推荐阅读