Как реализовать липкий сеанс в шлюзе Spring-интеграции tcp? - PullRequest
1 голос
/ 24 октября 2019

В настоящее время я работаю на сервере сокетов TCP, используя интеграцию Spring. пока у меня есть ниже упомянутый код. Но есть возможности балансировки нагрузки нескольких узлов этого сокет-сервера. Для этого мне нужно иметь стики сеансов контекста соединений сокетов, которые могут быть разделены между узлами. Кто-нибудь может предложить возможное решение?

@Bean
    public IntegrationFlow listnerServerFlow(
            TcpNetServerConnectionFactory serverConnectionFactory,
            DeviceListenerService deviceListenerService) {
        return IntegrationFlows
                .from(Tcp.inboundGateway(serverConnectionFactory))
                .handle(deviceListenerService::processRequest)
                .get();
    }

@Bean
    public TcpNetServerConnectionFactory serverConnectionFactory() {
        TcpNetServerConnectionFactory connectionFactory = new TcpNetServerConnectionFactory(2424);
        connectionFactory.setSerializer(new ByteArrayCrLfSerializer());
        connectionFactory.setDeserializer(new ByteArrayCrLfSerializer());
        connectionFactory.setSingleUse(false);
        connectionFactory.setSoKeepAlive(true);
        return connectionFactory;
    }

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

В общем случае вы можете добавить уникальный запрос в запрос и сохранить данные сеанса в отдельном Redis.

Независимо от того, какой узел обрабатывает запрос, узел может извлечь данные сеанса из Redis с учетом идентификатора в запросе.

Надеюсь, это поможет вам найти решение.

1 голос
/ 24 октября 2019

С этим параметром

connectionFactory.setSingleUse(false);

существует только одно общее подключение, поэтому оно всегда привязано (к одному серверу).

Вы можете использовать ThreadAffinityConnectionFactory дляпривязать соединение к каждому вызывающему потоку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...