我目前在Kubernetes集群内的Spring Boot应用程序中尝试通过生菜从Redis服务器的两个不同主题进行池时遇到了一些问题。尽管来自第一个主题的消息池总是有效的,但第二个主题似乎只是在重新启动Kubernetes集群时偶然有效(这可能表明它可能与部署有关)。
消息被正确发布(它们在redis insight中可见),并且两个池化类都使用相同的Java代码通过生菜进行池化,这使得只有一个在工作变得奇怪。池的实现方式如下所示:
@PostConstruct
@Override
protected void connectToRedis() {
RedisClient redisClient = RedisClient.create("redis://" + REDIS_ADDRESS + ":" + REDIS_PORT);
StatefulRedisConnection<String, String> connection = redisClient.connect();
session = connection.sync();
initialize(session);
}
@Override
@Scheduled(initialDelay = INITIAL_DELAY_MS, fixedDelay = FIXED_DELAY_MS)
public void pullEvents(){
System.out.println("pullEvents for member service entered");
for (String key : STREAMS_KEYS) {
Map<String, String> jsonEvents = pullJSONs(key);
for (Map.Entry<String, String> entry : jsonEvents.entrySet()) {
readEvents(entry.getValue(), key, entry.getKey());
}
}
}
如上所述,我的应用程序与其他微服务一起在Kubernetes集群中运行。我的应用程序会侦听我发布的自己的事件(针对CQRS),以及发布到具有不同主题名称的同一redis服务器的另一个微服务中的事件。所有的微服务在它们各自的redis文件夹中都有一个服务和部署yaml,就像这样(它看起来总是一样的,因为我们想使用一个redis实例,我已经通过kubectl get-All检查了只有一个redi实例在运行):
redisService.yaml:
apiVersion: v1
kind: Service
metadata:
name: redis
labels:
app: redis
spec:
selector:
app: redis
ports:
- name: redis
port: 6379
redisDeploymnt.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:alpine
ports:
- containerPort: 6379
我真的很难找到原因,尤其是当它随机工作时。我猜测这与Kubernetes启动每个容器的顺序有关。
提前感谢!