基于Kafka与S3实现全局并发安全数字序列的方案可行性问询
首先明确:你的方案确实能保证序列值无重复,但落地时会遇到不少实际问题:
单点故障风险拉满
所有请求都依赖唯一的消费者进程处理,一旦这个进程崩溃、重启或者所在机器出问题,整个序列生成服务直接停摆。就算你搞了单消费者组多实例部署,单分区Kafka的特性也只会让一个实例干活,其余实例只能等主实例挂了之后重新平衡接管,这段时间服务完全不可用,根本没有高可用性可言。S3会成为性能瓶颈
每处理一个请求都要走一次S3读-改-写流程,S3是远程对象存储,网络IO延迟比本地内存高几个数量级。请求量稍微上来,单消费者的吞吐量就会被S3卡死,撑不住高并发场景。同一请求可能拿到多个不同序列值
比如消费者写完S3、发了响应,但还没给Kafka ack就崩溃了。重启后Kafka会重推这条请求,消费者会再读一次S3(此时已经是递增后的数值)、再递增写回,再发新响应。结果就是同一个reqId收到两个不同的seqVal——虽然序列值本身还是唯一的,但如果你的业务里reqId和seqVal需要绑定(比如客户端期望一个请求对应一个序列值),这就会搞乱业务逻辑。计数对象丢失会导致致命问题
如果S3里存计数的对象被误删,整个序列会从头开始生成,直接出现大量重复ID,这是致命风险,得加防护措施(比如开启版本控制、定期备份)。极端场景下的一致性隐患
虽然AWS官方说明S3 PUT操作后的GET是强一致,但极端情况(比如跨区域复制延迟、网络波动)下,还是可能短时间读到旧值。不过因为单分区Kafka保证了请求串行处理,这个情况概率极低,但理论上存在风险。
内容的提问来源于stack exchange,提问作者redzedi

