У меня есть несколько java-микросервисов, которые общаются друг с другом через API PubSub Lettuce.io.Для каждого нового «пользователя» я создаю новый канал, и этот пользователь подписывается на этот канал.Проблема, с которой я сталкиваюсь, состоит в том, когда я пытаюсь проверить параллелизм или производительность в целом.Я наблюдаю очень низкую производительность, и только 10-25 сообщений могут публиковаться по разным каналам одновременно, независимо от размера пула потоков ввода-вывода и пула вычислительных потоков в клиентских ресурсах (передаваемых клиенту 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;
}
Я изучил документы для Lettuce.io по адресу https://github.com/lettuce-io/lettuce-core/wiki/Master-Slave, чтобы найтиспособы включения способов для стратегий высокой доступности / отработки отказа, но я не вижу ни одного, который бы также позволял использовать Pub / Sub.В библиотеке есть возможности переключения при отказе Master / Slave, но я не могу создать соединения pub / sub и добавить прослушиватели в StatefulRedisMasterSlaveConnection.
Подводя итог, могу ли я как-нибудь увеличить пропускную способность для Lettuce Pub / Sub?Есть ли что-то в моей конфигурации или способ создания StatefulRedisPubSubConnection, который не позволяет мне публиковать более 25 одновременных сообщений одновременно?Любая помощь / совет по этому вопросу были бы великолепны.