积分商城兑完一波福利后,我终于把"发帖奖励"和"每日签到"的积分流水对上了

站长杂谈 11 浏览 0 回复 返回上级

上周社区搞了波积分兑换活动,后台流水一对,发现有人明明发帖了积分却没到账,有人签到成功了总积分却纹丝不动。查了半天,原来是三个模块各写各的,数据库事务没串起来。

先说发帖这块。最早图省事,帖子入库和积分增加拆成两个接口:内容服务负责存帖,积分服务负责加钱。用户点发布,前端先调A再调B。网络一抖,帖子发了积分没加,或者积分加了帖子被拦截了,两边就对不上了。后来改成本地事务包一层,但跨服务还是搞不定,最后上了个消息队列做最终一致,虽然延迟几秒,但至少不会再出现"幽灵帖"或者"空气积分"。

回帖的坑更隐蔽。我们设了"回帖奖励上限",防止刷楼。结果这个上限判断写在应用层,并发一上来,两个请求同时读到"今日已回0帖",同时给积分。加了个数据库唯一索引(用户ID+日期),让数据库兜底,才算堵住。这事让我意识到,业务规则不能全信代码里的if,关键约束得往下沉。

最折腾的是签到。签到按钮看似简单,背后要查连续天数、算奖励倍数、写流水、更新总积分。一开始我把这些全塞一个接口里,慢的时候能卡两秒。后来拆成:签到记录立刻写,积分变动异步算,总积分用缓存顶一阵。但异步就带来显示问题——用户签完到,个人中心积分没刷新,以为没成功,狂点按钮。最后加了条WebSocket推送,积分到账主动通知,才算消停。

对接过程中还有个教训:积分流水表别省字段。我们早期只记"变动数值"和"类型",出问题想溯源,根本不知道这笔积分是发帖得的还是签到得的、对应哪条内容。后来硬逼着补了source_id和source_type,排查效率直接翻倍。

现在三个模块共用一套积分内核,对外暴露统一接口,内部各自管自己的业务触发点。虽然代码量多了,但晚上能睡踏实了。你们积分系统是自己撸的还是接的第三方?有没有遇到过积分对不上账的抓狂时刻?

评论0
回复 · 0
还没有回复
微信客服 微信客服