Kafka Stream

kafka创建topology的API如下:

  val firstStream = builder.stream[String, String](topic = "from-basic-topic")

查看builder源码,其实是对应了一个“StreamBuilder”,其实内部是

InternalStreamsBuilder

下面是InternalStreamsBuilder,关键在于GraphNode ,他构成了DSL的DAG

    private static final String TOPOLOGY_ROOT = "root";
    private static final Logger LOG = LoggerFactory.getLogger(InternalStreamsBuilder.class);

    protected final GraphNode root = new GraphNode(TOPOLOGY_ROOT) {
        @Override
        public void writeToTopology(final InternalTopologyBuilder topologyBuilder) {
            // no-op for root node
        }
    };

 部分代码:

public abstract class GraphNode {

    private final Collection<GraphNode> childNodes = new LinkedHashSet<>();
    private final Collection<GraphNode> parentNodes = new LinkedHashSet<>();
    private final String nodeName;
    private boolean keyChangingOperation;
    private boolean valueChangingOperation;
    private boolean mergeNode;
    private Integer buildPriority;
    private boolean hasWrittenToTopology = false;
    
    ... ...
}

可以看出它是一个图的邻接表结构,以一个peek操作为例:

    @Override
    public KStream<K, V> peek(final ForeachAction<? super K, ? super V> action,
                              final Named named) {
        Objects.requireNonNull(action, "action can't be null");
        Objects.requireNonNull(named, "named can't be null");

        final String name = new NamedInternal(named).orElseGenerateWithPrefix(builder, PEEK_NAME);
        // ProcessorGraphNode是带有处理功能的Node,也是一个图
        final ProcessorParameters<? super K, ? super V, ?, ?> processorParameters =
            new ProcessorParameters<>(new KStreamPeek<>(action, true), name);
        final ProcessorGraphNode<? super K, ? super V> peekNode =
            new ProcessorGraphNode<>(name, processorParameters);

        // 添加结点到DAG里,graphNode就是当前KStream对应的结点
        builder.addGraphNode(graphNode, peekNode);

        return new KStreamImpl<>(
            name,
            keySerde,
            valueSerde,
            subTopologySourceNodes,
            repartitionRequired,
            peekNode,
            builder);
    }

再看看KStream的构造函数就清楚了,他其实就是一个DAG的结点,被封装了一层:

    KStreamImpl(final String name,
                final Serde<K> keySerde,
                final Serde<V> valueSerde,
                final Set<String> subTopologySourceNodes,
                final boolean repartitionRequired,
                final GraphNode graphNode,
                final InternalStreamsBuilder builder) {
        super(name, keySerde, valueSerde, subTopologySourceNodes, graphNode, builder);
        this.repartitionRequired = repartitionRequired;
    }

 Kafka Stream的API其实就是在构成一个带有process的DAG,后面的优化操作以及复杂的window等等就不去关注了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka Stream是一个用于处理实时数据流的库。它可以从Kafka数据源中读取数据,并进行流式计算和处理。 Kafka Stream的架构包括以下几个部分:整体架构、Processor Topology、并行模型、KTable和KStream、以及状态存储。整体架构描述了Kafka Stream的工作原理和组件之间的关系。Processor Topology定义了数据流的处理逻辑和操作流程。并行模型允许Kafka Stream根据需要调整并行度,以适应不同的处理需求。KTable和KStreamKafka Stream中两个重要的数据结构,分别用于表示实时数据流和实时表。状态存储用于存储和管理处理过程中产生的中间状态和结果。 Kafka Stream解决了流式系统中的几个关键问题:时间、窗口、Join、聚合与乱序处理以及容错。通过对时间的处理,Kafka Stream可以支持实时数据处理和窗口计算。窗口可以用来对数据进行分组和聚合。Kafka Stream还支持对不同数据流进行Join操作,并处理数据流中的乱序问题。同时,Kafka Stream具备容错能力,可以在发生故障时进行恢复和重试。 总体来说,Kafka Stream是一个强大的工具,可以实现实时数据流处理和计算。它的灵活架构、丰富的功能和可靠的容错机制使得它在流式系统中广泛应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Kafka Stream](https://blog.csdn.net/zmzdmx/article/details/111301707)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值