Я хочу, чтобы мое приложение реагировало на события UDP, отправленные тысячами разных клиентов. Каждый клиент отправляет 1-10 пакетов UDP каждые 5-10 секунд. Каждый пакет будет и должен обрабатываться очень быстро (в основном в памяти и небольших вычислениях, помог с Redis, только случайные вызовы БД). Возврат данных вызывающим абонентам невозможен.
Я внедрил Reactor в Spring, как описано в вики. Затем я реализовал входящий канал UDP, как описано в их документах Spring Integration. Вот конфиг:
<int-ip:udp-inbound-channel-adapter id="receiverChannel"
channel="stringConvert"
port="9000"
multicast="false"
check-length="false"
pool-size="10"
lookup-host="false"
/>
<int:transformer id="convertChannel"
input-channel="stringConvert"
output-channel="toProcess"
ref="transformer"
method="transform"
/>
<int:service-activator input-channel="toProcess"
ref="accumulator"
method="accumulate"/>
<bean id="accumulator" class="hello.UDPAccumulator" />
<bean id="transformer" class="hello.UDPTransformer" />
И затем в UDPAccumulator я публикую это сообщение в реактор:
@Service
public class UDPAccumulator {
@Autowired
ReactorProducer producer;
public void accumulate(String quote) {
producer.fireEvent(quote);
}
}
Является ли это «правильным» способом сделать это, учитывая, что мне нужна высокая производительность? Какова внутренняя работа int-ip:udp-inbound-channel-adapter и может ли он быть узким местом перед передачей сообщений в реактор? Я вижу, что у реактора есть некоторые классы и поддержка, связанные с TCP, но нет UDP. Любое предложение о том, как сделать это наилучшим образом, приветствуется!
Бонусный вопрос. Что, если сообщения приходят быстрее, чем отправляются в реактор? Будет хранилище сообщений Redis (внизу статьи) помочь? А что, если мой метод, который перемалывает эти пакеты в реакторе, работает медленно?