如何每秒处理数十亿事件而不影响延迟
想象这样一个场景:你需要在支付过程中实时检查银行交易是否存在欺诈。你只有几毫秒的时间来做决定。Apache Kafka 正在持续流式传输事件,但对于每条事件,你都需要从数据库中调取客户的历史记录。如果你对每条消息都查询传统的 PostgreSQL 或 MySQL,系统会瞬间因负载而崩溃。
这是工程师在设计高负载系统时经常遇到的困境。普通的缓存(如 Redis)可以加速单个键的读取,但当需要在数据流之上构建复杂的业务逻辑和分析时,它的局限性就显现出来了。你被迫将缓存、消息代理和第三方处理引擎组合在一起。在这种情况下,不妨了解一下 Hazelcast。
Hazelcast 将分布式内存存储和流处理引擎整合在单一系统中。你不再需要从三个不同的服务中拼凑架构,而是获得一个统一的平台,能够实时摄取、丰富和分析数据。
平台内部是如何运作的
平台的核心是 Jet 引擎。它负责构建数据处理管道。Jet 能够同样出色地处理连续数据流和静态数据集,例如 Amazon S3 中的存储桶或关系数据库中的表。
这里的性能数据值得关注。单个 Hazelcast 节点每秒可聚合 1000 万个事件,同时将延迟控制在 10 毫秒以内。如果将服务器组成集群,吞吐量可扩展到每秒 10 亿个事件。
编写数据流查询不需要深入研究底层 Java API。该平台支持标准 SQL。你可以对传入的数据流编写熟悉的 SELECT,将其与内存表连接,然后立即将结果路由到目标服务。
以下是连接外部数据源的方式。开箱即用,你获得一组连接器:
- Apache Kafka 和 JMS 用于处理队列
- Hadoop 和 Amazon S3 用于访问文件存储
- 通过标准 JDBC 连接关系数据库
- Python 模型用于直接在管道中运行机器学习
分布式内存与协调
如果抛开流分析不谈,Hazelcast 本身就是一个分布式键值存储。数据以分区形式分布在集群节点上。开发者可以使用熟悉的 Java 结构(IMap、IQueue、ITopic),唯一的区别是它们在网络上分布式的。键的点查询耗时仅需微秒级。
数据库操作支持经典缓存模式:读穿透、写穿透和写回。使用写回模式时,应用程序仅将数据保存到 Hazelcast 的内存中,平台会异步将其刷新到磁盘和主数据库。如果关系型数据库管理系统暂时宕机,应用程序将继续接受请求而不会发生故障。
另一个独立功能是微服务协调。Hazelcast 可以管理分布式锁、生成唯一 ID 序列和维护共享计数器。这消除了为日常同步任务部署和维护独立 Apache ZooKeeper 集群的需要。
如何构建和运行项目
项目源代码采用 Java 编写。构建源代码需要 JDK 17 或更高版本。最简单的构建方式是使用 Maven Wrapper 脚本:
git pull origin master
./mvnw clean package -DskipTests
包含所有检查的完整构建可能需要一些时间。如果只需要快速验证本地更改,请传递 -Dquick 标志:
./mvnw clean package -DskipTests -Dquick
此参数禁用 Javadoc 生成、Checkstyle 检查和辅助模块的构建。
测试情况值得关注。该仓库有数千个测试,分为三个配置文件:
- 标准的
./mvnw test配置运行快速集成测试。 - 夜间的
./mvnw test -P nightly-build配置包含无法并行运行的慢速测试。 - 完整的
./mvnw test -P all-tests配置使用网络顺序运行所有检查。
部分测试依赖 Docker。如果你的机器上未安装 Docker,这些测试会失败。要禁用它们,请使用 -Dhazelcast.disable.docker.tests 参数。创建 Pull Request 时,项目的 CI 服务器会运行完整套件,所以在本地只需运行自己模块的测试就足够了。
你不仅可以用 Java 编写客户端。社区和公司为 Python、Node.js、.NET、C++ 和 Go 维护官方库。
许可协议及几个实践细节
仓库中的代码分为两部分。核心代码采用宽松的 Apache License 2.0 分发。然而,部分企业功能和模块受 Hazelcast Community License 保护。该许可禁止使用代码创建与公司原始云产品竞争的付费托管服务(云服务提供商)。
第二点是资源需求。由于所有热数据都驻留在内存中,你需要购买大量内存来处理大规模数据。此外,在 Java 环境中,应密切关注垃圾回收器设置,以避免清理数 GB 内存时出现停顿。不过,Hazelcast 工程师通过堆外存储来缓解这个问题,将数据移到 Java 堆之外。
谁应该关注 Hazelcast
该平台在实时事件响应至关重要的场景中表现出色:
- 金融科技中的欺诈预防和评分
- 处理遥测数据和高频物联网信号
- 在电商中客户点击的瞬间计算价格和折扣
- 在分布式数据中心之间同步数据(WAN 复制)
如果只需要为几个端点提供简单缓存,Hazelcast 就显得过于复杂了:简单的 Redis 就能很好地处理这个任务。但如果你的项目已经发展到流分析与分布式内存必须交叉协作、同时避免频繁磁盘访问的规模,Hazelcast 将为你节省数月的开发时间。
相关项目