1. 依赖三方的接口,三方如果故障怎么办?怎么保证高可用?
只要依赖三方接口,就是引入了外部不确定性。你无法控制第三方的可用性,但是必须保证:即使三方挂了,你自己的系统仍然可用,可控。
可以从以下几个层面来设计高可用:
层面
目标
手段
依赖隔离
第三方挂了,不影响我核心服务
超时、限流、熔断、降级、隔离
失败缓冲
我能“先记账”,以后再补偿
消息队列、重试队列、补偿任务
多源冗余
不依赖单点供应商
多通道、动态路由、优先级机制
监控与熔断恢复
自动感知并恢复调用
熔断自动恢复机制、健康检查
用户体验层降级
保留核心功能
提示、兜底方案、延迟处理
2. CompletableFuture
CompletableFuture 是 JDK 8 引入的类,属于 异步编程和并行计算工具,结合了 Future 和 CompletionStage 两个接口。它既能表示一个异步任务的结果,又能在结果完成后继续做链式处理。
常见用法:
a.异步执行任务
b.异步执行并有返回值
c.串行执行(thenApply/thenAccept)
d.并行执行并合并
e.任意完成(竞争关系)
f.异常处理
在实际的业务中,经常用于:
a.并发调用多个外部服务
b.复杂异步任务的编排
3. Spring Modulith 在事件驱动上的增强
事件语义更清晰(内部 vs 外部事件):在 Modulith 中,可以显式区分:内部事件 和 外部事件,这样可以避免“事件到处乱飞”,边界更清晰。
事件持久化(Event Publication Registry)
- Spring 原生事件是内存级别的,监听器挂了事件就丢了。
- Modulith 内置 事件发布注册表,可以把事件持久化到数据库,做到:
- 可靠投递(即使宕机也能恢复);
- 事件回放(replay),用于调试或系统恢复;
- 异步保证最终一致性。
并不是说远程的@EventListener就没用了,而是要结合使用,模块内还用spring原生的。而模块间(@ApplicationModule标识模块边界)可靠异步事件可以用@ApplicationModuleListener 或 @ApplicationModuleEventListener。 Spring Modulith 是单体模块化利器,但它不是分布式事件总线,大型多服务项目只靠它不够。
4. redis slot
Redis Slot 是 Cluster 特有概念。Redis Cluster 的 事务、Lua 脚本等,如果涉及多个 key 的操作,要求这些 key 在同一个槽位,否则无法保证原子性。
解决方案:使用哈希标签(Hash Tag),把key搞到一个slot中去。