Есть ли способ увеличить пропускную способность для соединений Pub / Sub Lettuce? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть несколько 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 одновременных сообщений одновременно?Любая помощь / совет по этому вопросу были бы великолепны.

...