Весенняя интеграция обработка больших соединений

Мы внедрили TCP-сервер с интеграцией Spring.

Конфигурацию сделал как

@Bean
TcpNetServerConnectionFactory cf(){
    TcpNetServerConnectionFactory connectionFactory=new TcpNetServerConnectionFactory(TCP_PORT);

    connectionFactory.setSerializer(new CustomSerializerDeserializer());
    connectionFactory.setDeserializer(new CustomSerializerDeserializer());
    connectionFactory.setSoTimeout(TIMEOUT);
    return connectionFactory;
}

@Bean
TcpInboundGateway tcpGate(){

    TcpInboundGateway gateway=new TcpInboundGateway();
    gateway.setConnectionFactory(cf());
    gateway.setRequestChannel(requestChannel());
    return gateway;
}

@Bean
public MessageChannel requestChannel(){

    return new DirectChannel();
}

И активатор услуги

@MessageEndpoint 
public class Echo {

    @ServiceActivator(inputChannel = "requestChannel")
    public byte[] echo(byte[] in,@SuppressWarnings("deprecation") @Header("ip_address") String ip){

        return "OK".getBytes();
    }
}

У нас более 150 соединений с назначенным портом и более 150 TCP-пакетов каждые 10 секунд.

В настоящее время мы имеем дело с проблемой позднего получения пакетов. Нам требуются данные в реальном времени для нашей работы.

Недавно мы пришли к выводу, что потоки ожидают выполнения, что приводит к позднему получению пакета.

Как мы можем справиться с такими проблемами с помощью Spring Integration и tcp inboudgateways.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
125
2

Ответы 2

TcpNetServerConnectionFactory является подклассом AbstractConnectionFactory, который определяет свойство java.util.concurrent.Executor (taskExecutor).

Спасибо за ваш ответ. Способен ли исполнитель задач по умолчанию обрабатывать большие соединения?

Shridhar kolsure 21.01.2019 13:55

Извините, я не знаю, что означает большой. Также имейте в виду, что Executor просто выполняет задачи. Само по себе оно не имеет никакого отношения к связям любого рода.

Oleg Zhurakousky 21.01.2019 14:04

Хорошо. Позвольте мне объяснить сценарий: у нас более 150 подключений через TCP-порт, и каждый клиент отправляет пакет данных каждые 10 секунд. Мы заметили, что пакеты данных, полученные активатором службы, опаздывают достаточно поздно, чем ожидалось. Время задержки увеличивалось по мере увеличения нагрузки.

Shridhar kolsure 21.01.2019 14:58

Позвольте мне попробовать это по-другому. Вы описываете сценарий, где кажется, что введение более высокого уровня параллелизма может помочь, поэтому я предлагаю добавить исполнителя (например, ThreadPoolTaskExecutor) с более высоким пулом потоков. Теперь это само по себе может не помочь, так как зависит от многих факторов (как аппаратных, так и программных). Я не знаю этих факторов, так как я не знаю вашего окружения, поэтому я не могу строить дальнейшие предположения. Говорить что-то «большое» в этом контексте бессмысленно.

Oleg Zhurakousky 21.01.2019 15:27

вместо большого мы можем сказать, что это слишком много соединений. не вопрос, спасибо за помощь. Я попытаюсь реализовать CompositeExecutor для этого сценария. Если вы знаете об этом, пожалуйста, помогите нам.

Shridhar kolsure 21.01.2019 15:43

Вместо этого попробуйте использовать TcpNioServerConnectionFactory.

Gary Russell 21.01.2019 16:22

Вместо этого используйте TcpNioServerConnectionFactory; ...Net... более эффективен для небольшого количества длительных соединений.

Но см. эта глава в справочном руководстве.

Спасибо, Гэри. Способен ли исполнитель задач по умолчанию обрабатывать любое количество запросов или нам нужно добавить собственный исполнитель задач?

Shridhar kolsure 22.01.2019 06:51

Да; исполнитель задач по умолчанию имеет неограниченное количество потоков, так что это не должно быть проблемой ни для одной из фабрик соединений. На самом деле вы не описываете природу ваших «поздних пакетов», но имейте в виду, что это гораздо больше, чем просто обработка ввода-вывода сокета, например, если процессоры заняты обработкой сообщений из других сокетов, или, возможно, есть некоторая синхронизация кода это вызывает узкое место. Вам нужно посмотреть на использование вашего ЦП и / или профилировать ваше приложение, чтобы выяснить, почему оно не обрабатывает скорость сообщений, которая вам нужна. 15 сообщений в секунду — это очень низкая скорость передачи сообщений.

Gary Russell 22.01.2019 13:53

Вы правы, проблема с подключением может быть не там. Я предполагаю, что обработка пакетов может занимать много времени. Мы используем собственный сериализатор и десериализатор для дифференциации пакетов, а также используем прямой канал, не будет ли это причиной позднего получения данных?

Shridhar kolsure 22.01.2019 14:28

Я понятия не имею о вашем коде, вам придется его профилировать; DirectChannel добавляет очень мало накладных расходов.

Gary Russell 22.01.2019 14:39

Другие вопросы по теме