我有多个Java微服务通过Lettuce.io的PubSub API相互通信。对于每个新的“用户”,我创建一个新频道,并且该频道订阅了该用户。我遇到的问题是我通常尝试测试并发性或性能时。我看到的是性能很低,并且一次只能通过不同的渠道发布大约10-25条消息,而不管客户端资源中的IO线程池和计算线程池的大小如何(作为参数传递给Redis客户端) )。这是我当前的PubSub配置:
@Bean
public RedisURI redisURI(){
RedisURI uri = new RedisURI();
uri.setHost(host);
uri.setPort(port);
uri.setPassword(passWord);
uri.setTimeout(Duration.ofSeconds(redisTimeout));
return uri;
}
@Bean
@Primary
public RedisClient redisClient(){
return RedisClient.create(clientResources(), redisURI());
}
@Bean
@Primary
public ClientResources clientResources(){
return DefaultClientResources.builder()
.ioThreadPoolSize(50)
.computationThreadPoolSize(50)
.build();
}
我的应用程序使用WebSockets处理来自客户端的消息,然后将这些消息传递到适当的PubSub通道。这是我的WebSocketMessageHandler的构造函数,该构造函数从上方自动插入Bean中并创建Async命令。
private RedisPubSubAsyncCommands subscribingCommands;
private RedisPubSubAsyncCommands publishingCommands;
private InvictusCacheService invictusCacheService;
@Autowired
public WebSocketMessageHandler(RedisClient redisClient, InvictusCacheService invictusCacheService) {
StatefulRedisPubSubConnection subscribingConnection = redisClient.connectPubSub();
StatefulRedisPubSubConnection publishingConnection = redisClient.connectPubSub();
subscribingConnection.addListener(new LettuceMessageListener(redisClient, invictusCacheService));
this.subscribingCommands = subscribingConnection.async();
this.publishingCommands = publishingConnection.async();
this.invictusCacheService = invictusCacheService;
}
我已经在https://github.com/lettuce-io/lettuce-core/wiki/Master-Slave处研究了Lettuce.io的文档,以找到整合高可用性/故障转移策略方法的方法,但我发现没有一个方法也允许使用Pub / Sub 。该库具有主/从故障转移功能,但是我无法创建pub / sub连接,也无法在StatefulRedisMasterSlaveConnection上添加侦听器。
总而言之,我有什么办法可以提高莴苣发布/订阅的吞吐量?我的配置中或创建StatefulRedisPubSubConnection的方式中是否有不允许我一次发布25条以上的并发消息的内容?关于此事的任何帮助/建议都将很好。