月度记录-2025-9月

51 阅读2分钟

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中去。

5. 底层知识的价值,不在于记多少,而在于能让你“解释世界”。