Advertisement

再思考分布式系统课程电商秒杀项目

阅读量:

项目源码: https://github.com/AlexanderChiuluvB/DistrubutedSystemProject

本项目曾经历一次架构上的调整,其主要理念是将确保数据安全的机制由基于MySQL的乐观锁机制迁移至Redis/Zookeeper所支持的分布式锁机制。默认情况下,只要Redis减库存操作成功,系统就会向用户反馈秒杀成功的提示。然而,在实际应用中,这种方法存在一定的缺陷:首先,未能充分考虑如何保障缓存与数据库之间的最终一致性。例如,Redis减库存可能成功了,但将消息发送至Kafka时却失败了,或者MySQL在消费过程中出现问题,最终导致MySQL未能成功生成订单,并且库存数据也未被持久化。

该方法假设Redis减库存操作完成后即视为秒杀成功或“预减库存成功”,接下来的重点在于如何确保MySQL能够接收到这一减库存的消息。但如果Redis后续的操作出现失败呢?需要注意到的是,Redis事务本身并不支持回滚功能!当前的做法是让Redis的变化引发MySQL的变化,而更为理想的方案应是让MySQL的变化驱动Redis的变化。实际上存储于Redis中的数据稳定性较差,一旦发生故障很容易造成数据丢失。因此更为稳妥的做法是只有在确保MySQL减库存操作完成之后才向用户返回秒杀成功的反馈。

此外,在Redis减库存操作成功的情况下,若MySQL尚未完成订单创

全部评论 (0)

还没有任何评论哟~