有没有办法提高生菜发布/订阅连接的吞吐量?

时间:2019-04-03 16:22:20

标签: redis publish-subscribe master-slave topology lettuce

我有多个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条以上的并发消息的内容?关于此事的任何帮助/建议都将很好。

0 个答案:

没有答案