分布式环境下问题请教
来源:9-6 Kafka 消费消息模型代码编写

乌拉奎的青蛙
2019-11-19
老师好:
有几个问题请教一下:
1. 模板生成的code只在redis中存。redis有持久化功能,但AOF也会存在数据瞬间丢失的可能。在实际应用中,只存储在redis是否会有安全隐患?
2. 如果在一个事务过程中,多次操作redis。如果部分操作成功,中间发生异常,是否会存在事务问题(部分数据已在redis成功,但部分未成功)?
3. 用户券是在redis中完成的,通过kafka,mysql作后端持久化。如果redis操作成功,在给kafka发消息时异常,是否数据会存在问题?如果往kafka生产消费成功,kafka往mysql消费过程中是否会有丢失消息的可能性?(如收到消息成功,在操作数据的过程中消息异常)
4. 对于电商系统扣库存,网上看也可以在redis实现,实现思路和教程中的相似。有个问题是redis扣库存成功,但消息还未写回数据库的时候,查到的库存不是实时的。在实际应用过程中,是如何解决的?
5. 关于定时任务,考虑到在分布式环境中可能会存在多个实例。如果多个实例同时执行定时任务,是否会存在问题?
谢谢!
1回答
-
张勤一
2019-11-19
同学你好:
你这里提出的几个问题思考的点很好,也很全面,我这里给出解决方案:
1. 优惠券码是在使用之前就提前生成的,所以,一定是完全做了持久化处理,不用担心数据丢失的问题。当然,如果实在是觉得不安全,可以在文件或者是数据库中再保存一份;
2. 部分成功当然是存在的,这个时候你需要在可能出现异常的地方打一些日志(通用异常处理的地方也可以),并且需要有一个补偿任务,专门用于处理这种部分成功的 case;
3. 这与第二个问题实际是类似的。都需要根据日志判断操作的过程是否出现数据不一致(错误)的情况,再去利用补偿任务填补错误;
4. 当然不会直接去查询数据库,这样的话,系统还是会存在瓶颈的。应该是所有的操作都去查询 Redis,数据库只是做持久化用;
5. 这个问题就简单了。两个解决办法:在定时任务执行之前,睡眠一个不固定的时间,错开执行;利用分布式锁解决,获取到锁的实例才允许执行定时任务。
欢迎来 QQ 群随时交流、讨论,也非常感谢同学的支持!
50
相似问题