使用Flux、Mono案例

生产环境中前后端使用Flux的典型案例及技术实现方案:


1. 实时监控大屏(后端Flux推送 + 前端SSE消费)

场景‌:金融交易监控、IoT设备状态追踪
技术栈‌:

  • 后端:Spring WebFlux + Reactor Netty
  • 前端:EventSource API + React/Vue
    实现逻辑‌:

javaCopy Code

// 后端示例 @GetMapping(value = "/sensor/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<SensorData> streamSensorData() { return sensorService .getRealtimeUpdates() // 返回Flux<SensorData> .delayElements(Duration.ofMillis(500)); // 控制推送频率 }

前端消费‌:


javascriptCopy Code

const eventSource = new EventSource('/sensor/stream'); eventSource.onmessage = (e) => { const data = JSON.parse(e.data); updateDashboard(data); // 实时更新UI };

优势‌:

  • 背压控制避免客户端过载
  • 长连接复用降低TCP握手开销

2. 批量文件处理(分块流式响应)

场景‌:CSV导出、日志文件下载
技术栈‌:

  • 后端:Spring WebFlux + Reactive MongoDB
  • 前端:Fetch API流式处理
    实现‌:

javaCopy Code

@GetMapping("/export/large-data") public Flux<DataChunk> exportLargeData() { return reactiveMongoTemplate .streamQuery(query, DataEntity.class) .map(this::convertToChunk) // 分块转换 .take(1000); // 限制总量 }

前端处理‌:


javascriptCopy Code

fetch('/export/large-data') .then(response => { const reader = response.body.getReader(); const processChunk = ({done, value}) => { if (!done) { appendToFile(value); // 流式写入文件 return reader.read().then(processChunk); } }; return reader.read().then(processChunk); });


3. 聊天应用(WebSocket双向流)

技术栈‌:

  • 后端:Spring Boot WebFlux + RSocket
  • 前端:SockJS + Stomp.js
    核心代码‌:

javaCopy Code

@MessageMapping("chat.{roomId}") public Flux<Message> joinRoom(@DestinationVariable String roomId) { return chatService .subscribe(roomId) // 返回Flux<Message> .onBackpressureBuffer(100); // 缓冲溢出保护 }

前端连接‌:


javascriptCopy Code

const stompClient = new Stomp.Client(...); stompClient.subscribe('/topic/chat.123', (msg) => { showMessage(JSON.parse(msg.body)); });


关键设计原则

  1. 背压策略‌:

    • 服务端:.limitRate(100) 限制推送速率
    • 客户端:取消订阅或滑动窗口控制
  2. 错误恢复‌:

    • 自动重试逻辑:.retryWhen(Retry.backoff(3, Duration.ofSeconds(1)))
  3. 生产级增强‌:

    • 服务端指标:Micrometer监控Flux的订阅/完成率
    • 客户端:添加心跳检测(如每30秒ping/pong)

实际案例参考:

  • 阿里双11大屏使用类似方案处理每秒百万级事件
  • 特斯拉车辆状态同步采用WebFlux+RSocket实现低延迟更新

生产环境中前后端使用Mono的典型场景及技术实现方案:


1. 用户身份认证(JWT令牌签发)

场景‌:登录接口返回单条令牌
技术栈‌:

  • 后端:Spring Security + WebFlux
  • 前端:React/Axios
    实现逻辑‌:

javaCopy Code

@PostMapping("/auth/login") public Mono<AuthResponse> login(@RequestBody LoginRequest request) { return authService .authenticate(request.getUsername(), request.getPassword()) .flatMap(user -> Mono.just(jwtUtil.generateToken(user))); // 明确返回单个结果 }

前端调用‌:


javascriptCopy Code

axios.post('/auth/login', credentials) .then(response => { localStorage.setItem('token', response.data.token); });

优势‌:

  • 明确语义:操作结果唯一且确定
  • 自动HTTP 404处理(当Mono为空时)

2. 电商订单支付状态查询

场景‌:获取单笔订单的实时支付结果
技术栈‌:

  • 后端:Spring WebFlux + Redis
  • 前端:Vue/Composition API
    服务端代码‌:

javaCopy Code

@GetMapping("/orders/{id}/payment-status") public Mono<PaymentStatus> getPaymentStatus(@PathVariable String id) { return redisTemplate .opsForValue() .get("payment:" + id) // 返回Mono<PaymentStatus> .switchIfEmpty(Mono.error(new OrderNotFoundException())); }

前端消费‌:


typescriptCopy Code

const fetchStatus = async (orderId: string) => { const { data } = await api.get(`/orders/${orderId}/payment-status`); updateUI(data); // 更新支付状态组件 };


3. 分布式锁申请(Redis实现)

场景‌:全局资源互斥访问控制
技术栈‌:

  • 后端:Lettuce + Reactor
  • 前端:无直接交互(后台服务间调用)
    核心代码‌:

javaCopy Code

public Mono<Boolean> tryLock(String lockKey, String clientId, Duration ttl) { return redisTemplate.execute(connection -> Mono.from(connection .stringCommands() .set( lockKey.getBytes(), clientId.getBytes(), SetArgs.nx().px(ttl.toMillis()) ) ).map("OK"::equalsIgnoreCase) ); }

调用示例‌:


javaCopy Code

lockService.tryLock("inventory:1", "node-1", Duration.ofSeconds(30)) .subscribe(locked -> { if (locked) processInventory(); });


关键设计原则

  1. 语义明确性‌:

    • 当业务逻辑必然返回单个结果(如主键查询)时强制使用Mono
    • 与Flux的流式场景形成鲜明对比
  2. 错误处理优化‌:

    • onErrorResume:自动降级为默认值
    • Mono.empty():表示合法空结果(HTTP 204)
  3. 生产增强‌:

    • 指标监控:通过Micrometer跟踪Mono的订阅/完成耗时
    • 熔断保护:与Resilience4j集成防止长时间阻塞

典型应用案例:

  • 微信支付状态查询接口严格使用单结果响应
  • 银行核心系统的账户余额查询服务

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值