RocketMQ Streams拓扑构建与数据处理过程

本文详细介绍了RocketMQ Streams 1.1.0版本的改进,特别是流处理拓扑的构建过程,包括逻辑构建、实际构建和第三次构建。文中还阐述了数据处理过程中的状态恢复、存储介质和状态持久化策略。RocketMQ Streams通过RocksDB和RocketMQ结合来保存计算状态,并采用Compact topic和Static topic保证状态数据的正确性。此外,文章还提到了参与贡献的方式。

本文作者:倪泽,Apache RocketMQ committer、RSQLDB/RocketMQ Streams Maintainer

01 背景

RocketMQ Streams 1.1.0版本已于近期发布,相对之前版本有以下改进和优化:

1、API层面支持泛型,可自定义输入输出数据;

2、去掉冗余逻辑,简化代码,重写拓扑图构建和数据处理过程;

本文章承接上篇:RocketMQ Streams 1.1.0: 轻量级流处理再出发,从实现原理上介绍RocketMQ Streams是如何实现流计算拓扑图构建的以及探讨了数据流转过程和流转过程中的状态变化。

02 流处理拓扑构建过程

public class example {
    public static void main(String[] args) {
        StreamBuilder builder = new StreamBuilder("wordCount");


        builder.source("sourceTopic", total -> {
                    String value = new String(total, StandardCharsets.UTF_8);
                    return new Pair<>(null, value);
                })
                .flatMap((ValueMapperAction<String, List<String>>) value -> {
                    String[] splits = value.toLowerCase().split("\W+");
                    return Arrays.asList(splits);
                })
                .keyBy(value -> value)
                .count()
                .toRStream()
                .print();


        TopologyBuilder topologyBuilder = builder.build();


        Properties properties = new Properties();
        properties.put(MixAll.NAMESRV_ADDR_PROPERTY, "127.0.0.1:9876");


        RocketMQStream rocketMQStream = new RocketMQStream(topologyBuilder, properties);




        Runtime.getRuntime().addShutdownHook(new Thread("wordcount-shutdown-hook") {
            @Override
            public void run() {
                rocketMQStream.stop();
            }
        });
        
        rocketMQStream.start();
    }
}

在使用者书写上述及连表达式时,发生第一次构建,即逻辑节点的添加,前后算子具有父子关系,构建后形成逻辑节点,多个逻辑节点形成链表。

逻辑构建结束后,调用StreamBuilder#build()方法进行第二次构建,将逻辑节点中可能包含

### Spring Boot 集成 RocketMQ Streams 实现消息流处理 #### 1. 添加依赖项 为了使Spring Boot项目能够支持RocketMQ Streams,在`pom.xml`文件中需引入必要的依赖库。 ```xml <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!-- 如果需要使用Streams API --> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-streams-client</artifactId> <version>4.9.3</version> </dependency> ``` #### 2. 应用程序属性配置 编辑`application.properties`或`application.yml`来设置RocketMQ的相关参数,比如NameServer地址等基本信息[^2]。 对于YAML格式: ```yaml spring: rocketmq: name-server: localhost:9876 producer: group: default-producer-group ``` #### 3. 创建生产者服务类 定义一个用于发送消息的服务组件,这里假设要向名为`test_topic`的主题发布消息。 ```java import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MessageProducer { @Autowired private RocketMQTemplate rocketMqTemplate; public void sendMessage(String topic, String message){ this.rocketMqTemplate.convertAndSend(topic,message); } } ``` #### 4. 使用RocketMQ Streams 进行消费端开发 创建消费者逻辑时可以利用RocketMQ Streams提供的DSL语法来进行复杂的消息过滤、转换操作。下面是一个简单的例子说明如何订阅特定主题并执行自定义的数据变换过程[^3]。 ```java import org.apache.rocketmq.streams.client.api.StreamBuilder; import org.apache.rocketmq.streams.client.operator.KV; import org.apache.rocketmq.streams.common.context.Message; import org.apache.rocketmq.streams.common.topology.TopologyBuilder; import org.apache.rocketmq.streams.transform.function.Function; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class StreamProcessor implements CommandLineRunner { @Override public void run(String... args) throws Exception { TopologyBuilder builder = new TopologyBuilder(); // 定义输入源 builder.setSource("source", "test_topic"); // 对接收到的信息做进一步加工处理 builder.addOperator("processor", (Function<Message<KV<String,Object>>,Message<KV<String,Object>>>) record -> { System.out.println("Received message:" + record.getValue()); // 假设我们只关心某些类型的记录 if ("interesting".equals(record.getKey())) { return record; // 继续传递给下一个节点 } else { return null; // 跳过不感兴趣的内容 } }); // 启动拓扑结构 try(StreamBuilder streamBuilder = new StreamBuilder()){ streamBuilder.build(builder).start(); } } } ``` 此代码片段展示了如何在一个Spring Boot环境中启动RocketMQ Streams作业,并对接收的消息实施条件性的筛选机制。需要注意的是,实际部署前应当仔细调整配置选项以及优化性能参数以满足具体应用场景的需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值