© Anton Dolganin 2026
У нас есть два потока: streamA и streamB. Нужно объединять их по ключу, но не всегда события есть в обоих потоках.
Различия типов Join:
| Тип Join | Поведение |
|---|---|
| Inner | Только пары, где ключ есть в обоих |
| Left | Все из streamA, + streamB, если есть |
| Outer | Все пары из обоих потоков, даже если в одном нет |
KStream<String, String> streamA = builder.stream("streamA");
KStream<String, String> streamB = builder.stream("streamB");
KStream<String, String> joined = streamA.leftJoin(
streamB,
(valueA, valueB) -> valueA + ":" + (valueB == null ? "NO_MATCH" : valueB),
JoinWindows.of(Duration.ofMinutes(5))
);
joined.to("joined-topic");
Что получится:
Если streamA содержит ключ, а streamB — нет, вернется valueA:NO_MATCH.
Если ключ есть в обоих, вернется объединенное значение.
Outer Join дополнительно возвращает записи из streamB, если нет соответствия в streamA.
Жизненный пример — корреляция заказов и оплат в интернет-магазине:
orders (ключ: order_id, value: заказ)payments (ключ: order_id, value: платёж)Inner Join
Left Join
Outer Join
© Anton Dolganin 2026