分布式微服务系统架构第113集:CondFuture,网关服务器、Cassandra数据库、Redis缓存、Kafka消息队列、Elasticsearch客户端

74 阅读6分钟

加群联系作者vx:xiaoda0423

仓库地址:webvueblog.github.io/JavaPlusDoc…

1024bat.cn/

“一个基于锁和条件变量(Condition)实现的简易版 Future,用来在某个线程中等待结果,直到被另一个线程显式唤醒并传递结果。”

🔵 举个简单使用场景

假设你在做 异步RPC调用异步消息处理这类事情:

  • 线程A 发起请求,但不知道什么时候结果返回,于是 await() 等待。
  • 线程B 收到响应时,调用 signal(result) 把数据塞进来并唤醒线程A。

小小示意:

CondFuture<String> condFuture = new CondFuture<>();

// 线程A:请求并等待
new Thread(() -> {
    try {
        String result = condFuture.await(5, TimeUnit.SECONDS);
        System.out.println("Got result: " + result);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}).start();

// 线程B:稍后响应
new Thread(() -> {
    try {
        Thread.sleep(1000); // 假装处理了 1秒
        condFuture.signal("Response is here!");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}).start();

输出:

Got result: Response is here!

流量、高并发 IoT 项目(车联网平台)的标准实践

优化点说明
Cassandra 分库分节点xx、xx、业务库分开,减少热数据干扰,提升查询性能
Redis 主备分离热数据实时存储 + 备份灾容,快速读写,减少单点故障
Kafka producer/batch 配置批量提交,延迟优化,内存缓冲提升消息发送吞吐量
Kafka consumer 手动ack + concurrency保证消息消费可靠性,并通过多线程加速消费处理
Elasticsearch restclient轻量高效,适合大数据量检索,降低TCP连接开销

高阶版 JT808 平台服务部署架构图

模块优化策略
JT808服务Netty线程模型+心跳检测+过期剔除
Redis主备双写,主节点故障快速切换备节点
Cassandra按业务分库,数据分离,提升查询效率
Kafka批量提交+异步ACK+3节点副本保障高可用
Elasticsearch异步写入+批量提交+慢查询优化
消费者组线程池消费,超时监控,重试机制

超实用部署建议

点位建议
Redis主备节点使用keepalived+vip做高可用切换
Cassandra每个库单独维护表,设置合理TTL(过期时间)清理旧数据
Kafka生产者开启幂等性 (enable.idempotence=true) ,防止重复投递
ES热数据分离,老数据定期归档,写入前做Bulk压缩
JT808服务器增加防粘包拆包处理,最大包长校验,保护系统
全链路接入链路追踪系统(如Skywalking、Zipkin),监控数据流向

Topic属性设置建议(重点!)

属性建议值解释
replication.factor3防止节点宕机丢数据
min.insync.replicas2写入必须至少2副本成功
acksall生产者端保证强一致性
enable.idempotencetrue开启幂等性,防止重复消息
retention.ms7天(604800000)或按业务定保留时间够补偿
cleanup.policydelete(默认)保证磁盘可控,避免膨胀
segment.ms1小时切小日志段,提升查询速度

📋 Kafka 参数调优表(超详细版)

🛠️ Producer 参数调优

参数建议配置作用解释调优思路
acksall等所有副本确认才算写成功最强数据可靠性
retries3 ~ 5发送失败自动重试次数防止瞬时抖动丢消息
enable.idempotencetrue开启幂等性,避免重复投递高一致性必开
batch.size32KB ~ 64KB单批次最大字节数调大提高吞吐量,减少IO次数
linger.ms5 ~ 10批量发送延迟(毫秒)稍微延迟换更大批次(减少压Kafka)
buffer.memory64MB ~ 128MB生产者内存缓冲池大小内存富裕就调大(抗突发)
compression.typelz4snappy压缩算法降低网络带宽,提升吞吐
max.request.size1MB 或更大单条消息最大尺寸避免超大消息被拒
request.timeout.ms30s请求超时毫秒数保证重试/失败及时切换
delivery.timeout.ms60s允许最大发送时间配合 retries 效果好

🛠️ Consumer 参数调优

参数建议配置作用解释调优思路
fetch.min.bytes1KB ~ 10KB最小抓取字节抓取更多消息,减少拉取次数
fetch.max.bytes5MB ~ 10MB单次最大拉取量合理拉大,防止吞吐低
fetch.max.wait.ms500ms最长等待时间配合 batch 消费更流畅
max.poll.records500 ~ 1000每次拉取最大记录数批量处理提升效率
session.timeout.ms10s ~ 20s消费组心跳超时时间保持平稳Rebalance
heartbeat.interval.ms3s ~ 5s心跳间隔配合session.timeout
enable.auto.commitfalse关闭自动提交手动控制 offset,确保精确一次
max.partition.fetch.bytes1MB单分区最大拉取量高分区场景要调大

🛠️ Broker 集群端参数调优

参数建议配置作用解释调优思路
num.network.threads3 ~ 8网络线程数跟broker流量量级有关
num.io.threads8 ~ 16IO线程数(磁盘/网络)跟磁盘/吞吐相关
log.dirs多磁盘挂载日志存储目录多路径并发刷盘更快
log.segment.bytes512MB ~ 1GB分段文件大小文件过小影响性能
log.retention.hours72h(3天)或按需日志保留时间结合业务定策略
message.max.bytes1MB 或更大单消息最大字节数跟 producer 端对应
replica.fetch.max.bytes10MB副本同步最大字节防止副本落后太多
socket.request.max.bytes100MBsocket请求最大字节数保护broker防止OOM
auto.create.topics.enablefalse禁止自动创建 topic统一topic管理

【实战Tips】

  • 吞吐优先
    → 调大 batch.size、buffer.memory,使用压缩。
  • 可靠性优先
    → 开启 acks=all、幂等、合理设置 retries。
  • 高并发低延迟
    → 合理调 max.poll.records、fetch参数。
  • 集群容灾
    → Replication Factor = 3,ISR列表控制好(min.insync.replicas=2)。
  • 异常处理
    → 配置 DLQ(死信队列)+ 自定义拦截器(如 ProducerInterceptor 抓异常)。

📋 Kafka 流量压测工具推荐表

1. 官方自带工具 - kafka-producer-perf-test.sh

工具位置

一般在安装包里的:

$KAFKA_HOME/bin/kafka-producer-perf-test.sh

基础使用示例

./kafka-producer-perf-test.sh \
  --topic test-topic \
  --num-records 1000000 \
  --record-size 512 \
  --throughput -1 \
  --producer-props bootstrap.servers=localhost:9092
参数说明
--topic压测用的 Topic
--num-records要发送的消息总数
--record-size每条消息字节大小(比如 JT808 标准报文一般几十到几百字节)
--throughput限流速率(条数/秒),-1表示不限速
--producer-props传入Kafka Producer的连接参数

✅ 输出结果:TPS、发送延迟、吞吐量等指标


2. 官方自带工具 - kafka-consumer-perf-test.sh

基础使用示例

./kafka-consumer-perf-test.sh \
  --topic test-topic \
  --bootstrap-server localhost:9092 \
  --messages 1000000
参数说明
--topic要消费的Topic
--messages要消费的消息条数
--bootstrap-serverKafka地址

✅ 输出结果:消费TPS、平均延迟、吞吐量


🚀 高阶压测思路

场景工具建议操作
单机单Topic最大吞吐producer-perf-test.sh配置大批量数据、-1不限速
多分区压测producer-perf-test.sh多开进程,发送到不同分区
压测集群消费能力consumer-perf-test.sh配合group.id并发消费
网络/磁盘瓶颈排查producer/consumer + Linux iostat、sar观察磁盘/网络IO
端到端延迟压测自定义带时间戳的Payload生产+消费后计算RTT

🔥 高阶技巧:配合这些一起压测更稳

  • 调大 Producer batch.sizelinger.ms → 批量发
  • Broker socket.request.max.bytes调大 → 防止大批次失败
  • 保证磁盘I/O够快(SSD最佳)
  • JVM 参数优化(-Xms -Xmx固定堆大小)
  • 配置 Topic 分区数、Replication Factor合理分摊压力

📈 实战Tips总结

  • 小消息(如JT808位置上报)→ 高TPS 压测重点
  • 大消息(报警/多媒体)→ 吞吐量/延迟 双压测
  • 消费端一定要压 → 避免只测发送忽略消费瓶颈!