news 2026/5/3 18:43:25

RocketMQ Streams 1.1.0: 轻量级流处理再出发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RocketMQ Streams 1.1.0: 轻量级流处理再出发

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

01 背景

RocketMQ Streams是一款基于RocketMQ为基础的轻量级流计算引擎,具有资源消耗少、部署简单、功能全面的特点,目前已经在社区开源。RocketMQ Streams在阿里云内部被使用在对资源比较敏感,同时又强烈需要流计算的场景,比如在自建机房的云安全场景下。

自RocketMQ Streams开源以来,吸引了大量用户调研和试用。但是也存在一些问题,在RocketMQ Streams 1.1.0中,主要针对以下问题做出了改进和优化。

1、面向用户API不够友好,不能使用泛型,不支持自定义序列化/反序列化;

2、代码冗余,在RocketMQ Streams中存在将流处理拓扑序列化反序列化模块,RocketMQ Streams作为轻量级流处理SDK,构建好流处理节点之后应该可以直接处理数据,不存在将流处理拓扑图本地保存或者网络传输需求。

3、流处理过程不容易理解,含有大量缓存、刷新逻辑;

4、存在大量支持SQL的代码,这部分和SDK方式运行流处理任务的逻辑无关;

在RocketMQ Streams 1.1.0中,对上述问题做出了改进,期望能带来更好的使用体验。同时,重新设计了流处理拓扑构建过程、去掉冗余代码,使得代码更容易被理解。

从今天起,将推出系列文章介绍RocketMQ Streams 1.1.0版本,本次文章主要介绍RocketMQ Streams 1.1.0的API如何使用,如何利用RocketMQ Streams快速构建流处理应用。

02 典型使用示例

本地运行下列示例的步骤:

1、部署RocketMQ 5.0;

2、使用mqAdmin创建topic;

3、构建示例工程,添加依赖,启动示例。RocketMQ Streams 坐标:

<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-streams</artifactId> <version>1.1.0</version> </dependency>

4、向topic中写入相应数据,并观察结果。

更详细文档请参考:https://github.com/apache/roc...

WordCount

public class WordCount { 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); final CountDownLatch latch = new CountDownLatch(1); Runtime.getRuntime().addShutdownHook(new Thread("wordcount-shutdown-hook") { @Override public void run() { rocketMQStream.stop(); latch.countDown(); } }); try { rocketMQStream.start(); latch.await(); } catch (final Throwable e) { System.exit(1); } System.exit(0); } }

WordCount示例要点:

1、JobId wordCount唯一标识流处理任务;

2、自定义的反序列化;

3、一对多转化;

4、lambda形式从数据中指定Key;

5、支持有状态计算;

窗口聚合

public class WindowCount { public static void main(String[] args) { StreamBuilder builder = new StreamBuilder("windowCountUser"); AggregateAction<String, User, Num> aggregateAction = (key, value, accumulator) -> new Num(value.getName(), 100); builder.source("user", source -> { User user1 = JSON.parseObject(source, User.class); return new Pair<>(null, user1); }) .selectTimestamp(User::getTimestamp) .filter(value -> value.getAge() > 0) .keyBy(value -> "key") .window(WindowBuilder.tumblingWindow(Time.seconds(15))) .aggregate(aggregateAction) .toRStream() .print(); TopologyBuilder topologyBuilder = builder.build(); Properties properties = new Properties(); properties.putIfAbsent(MixAll.NAMESRV_ADDR_PROPERTY, "127.0.0.1:9876"); properties.put(Constant.TIME_TYPE, TimeType.EVENT_TIME); properties.put(Constant.ALLOW_LATENESS_MILLISECOND, 2000); RocketMQStream rocketMQStream = new RocketMQStream(topologyBuilder, properties); rocketMQStream.start(); } }

窗口聚合示例要点:

1、支持指定时间字段;

2、支持滑动、滚动、会话多种类型window;

3、支持自定义UDAF类型聚合;

4、支持自定义时间类型和数据最大迟到时间;

双流JOIN

public class JoinWindow { public static void main(String[] args) { StreamBuilder builder = new StreamBuilder("joinWindow"); //左流 RStream<User> user = builder.source("user", total -> { User user1 = JSON.parseObject(total, User.class); return new Pair<>(null, user1); }); //右流 RStream<Num> num = builder.source("num", source -> { Num user12 = JSON.parseObject(source, Num.class); return new Pair<>(null, user12); }); //自定义join后的运算 ValueJoinAction<User, Num, Union> action = new ValueJoinAction<User, Num, Union>() { @Override public Union apply(User value1, Num value2) { ... } }; user.join(num) .where(User::getName) .equalTo(Num::getName) .window(WindowBuilder.tumblingWindow(Time.seconds(30))) .apply(action) .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); rocketMQStream.start(); } }

双流聚合示例要点:

1、支持window join和非window join,对于非window join,只需要在上述及连表达式中去掉window即可;

2、支持多种窗口类型的window join;

3、支持对join后数据自定义操作;

03 参与贡献

RocketMQ Streams是Apache RocketMQ的子项目,已经在社区开源,参与RocketMQ Streams相关工作,请参考以下资源:

1、试用RocketMQ Streams,并阅读相关文档以了解更多信息;

maven仓库坐标:

<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-streams</artifactId> <version>1.1.0</version> </dependency>

RocketMQ Streams文档:

https://rocketmq.apache.org/z...

2、参与贡献:如果你有任何功能请求或错误报告,请随时提交 Pull Request 来分享你的反馈和想法;

社区仓库:

https://github.com/apache/roc...

3、联系我们:可以在 GitHub上创建 Issue,向 RocketMQ 邮件列表发送电子邮件,或在 RocketMQ Streams SIG 交流群与专家共同探讨,RocketMQ Streams SIG加入方式:添加“小火箭”微信,回复RocketMQ Streams。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 18:42:25

Taotoken 模型广场在项目技术选型阶段提供的便利

Taotoken 模型广场在项目技术选型阶段提供的便利 1. 集中化的模型信息展示 在项目初期进行技术选型时&#xff0c;开发者通常需要评估多个大模型API的特性与适用性。传统方式下&#xff0c;这一过程往往涉及访问不同厂商的独立文档页面&#xff0c;手动整理模型参数、定价策略…

作者头像 李华
网站建设 2026/5/3 18:40:33

基于多智能体强化学习的对抗学习策略优化:从非平稳性到课程学习收敛

基于多智能体强化学习的对抗学习策略优化:从非平稳性到课程学习收敛 1. 引言 对抗性多智能体强化学习(MARL)在许多现实场景中具有广泛应用,如游戏AI、机器人对抗、自动驾驶博弈等。然而,在多智能体环境中,每个智能体的策略更新都会改变环境的动态,导致环境对于单个智能…

作者头像 李华
网站建设 2026/5/3 18:38:30

PeachPy未来展望:汇编编程的发展趋势与创新方向

PeachPy未来展望&#xff1a;汇编编程的发展趋势与创新方向 【免费下载链接】PeachPy x86-64 assembler embedded in Python 项目地址: https://gitcode.com/gh_mirrors/pe/PeachPy PeachPy作为一款将x86-64汇编嵌入Python的创新工具&#xff0c;正在重新定义汇编编程的…

作者头像 李华
网站建设 2026/5/3 18:32:27

告别无效学习:Scholé 如何用 AI 重构职场学习,让学习直接嵌入工作流

摘要在人工智能技术飞速普及的当下&#xff0c;职场 AI 学习正陷入 “学用脱节” 的核心困境&#xff1a;传统 AI 课程普遍采用 “一刀切” 的静态模式&#xff0c;内容与实际工作场景割裂&#xff0c;90% 以上的学习者因实用性不足中途放弃学习。Schol 作为 2022 年成立于美国…

作者头像 李华
网站建设 2026/5/3 18:32:25

RAG并行专家解码架构优化大模型响应速度

1. 项目概述&#xff1a;当RAG遇上并行专家解码 检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术近年来已成为大模型应用落地的标配方案。但在实际业务场景中&#xff0c;传统串行处理方式面临两大痛点&#xff1a;检索耗时导致响应延迟显著增加…

作者头像 李华