网易首页 > 网易号 > 正文 申请入驻

点赞后红心变灰?一次点击为何发出两次请求

0
分享至

点个赞,红心变红,请求超时。前端重试逻辑再发一次,这次成功回复到了,红心却变灰了。我明明点了赞,代码却另有打算——因为它不具备容错能力。


容错指的是系统某部分失败时,应用仍能正确工作。重试能帮我们从临时连接故障中恢复,但API必须安全地处理第二次尝试。数据库写入这里有个坑:保存变更和返回HTTP响应是两个独立步骤,连接可能在数据库提交之后断开,客户端根本不知道写入到底成没成功。

顺着这次点击,看看它在MongoDB和Neon上的PostgreSQL里分别发生了什么,再把重试变安全。

一次点击,两个请求

端点是这样的:POST /posts/42/toggle-like。它反转当前状态——我的赞存在就删掉,不存在就创建。一次点击如何同时做到两件事:

  • API保存了我的赞。
  • 连接在成功回复到达浏览器之前断开。
  • 浏览器重试。
  • API找到这个赞,把它删掉。这次回复成功送达。

第一次写入成功了,只是它的回复丢了。重试确实从连接故障中恢复了,但它同时反转了用户的操作。要让这个端点容错,两部分都得处理对。

这个赞可以存在MongoDB文档里,也可以存在Neon的PostgreSQL行里。无论哪种数据库,都会老老实实执行一个新请求去删掉它。API让它toggle,它就照做。

包进事务行不行?

可以。事务把数据库变更分组,要么全部提交,要么全部回滚,这就是原子性。MongoDB在副本集和分片集群上支持跨文档事务,Neon支持PostgreSQL事务。

但在我们的例子里,第一个事务在回复消失之前就已经提交了。重试开启一个新事务,把赞反转掉。两个事务都成功,我以极好的数据完整性取消了对你的点赞。行锁同样会随事务结束而释放,后来的重试照样能再改一次。

需要改变的是:重复请求会产生什么效果。

让请求表达我的真实意图

别让API去toggle,让它确保我的赞存在。第一个请求创建它,重试找到它并原样留着。这就是幂等:重复请求与发送一次具有相同的预期效果,响应可以不同,预期效果不变。

用PUT /posts/42/like确保赞存在,取消赞则用DELETE /posts/42/like确保赞不存在。处理器的数据库操作必须兑现这个承诺,只改HTTP动词,原来的toggle行为还在。

MongoDB可以用upsert创建缺失的赞,Neon上的PostgreSQL可以用INSERT … ON CONFLICT DO NOTHING。两者都需要针对用户与帖子组合的唯一规则,这样并发请求也只会产生一个赞。

实现示例

MongoDB:先建一次唯一索引,然后在请求处理器里用upsert,userId从已登录会话中取。

  • 一次性设置:对 { postId: 1, userId: 1 } 建唯一索引。
  • PUT处理器中:以 { postId, userId } 为条件,$setOnInsert 写入 likedAt,开启 upsert。
  • 已存在的赞保留原始时间戳。

Neon上的PostgreSQL:给likes表加上 (post_id, user_id) 主键,然后执行参数化查询 INSERT INTO likes (post_id, user_id) VALUES ($1, $2) ON CONFLICT (post_id, user_id) DO NOTHING。重试找到已存在的组合,原样不动。

如果另外维护了点赞计数器,只在新赞被插入时增加它,并且放在同一个事务里。

非要保留toggle端点怎么办

上面的PUT方案重复的是同一个期望状态。如果保留 POST /posts/42/toggle-like,就需要一种方式识别某个特定操作已经发生过。

给每次有意的点击一个幂等键。这个键在所有重试中标识同一个操作:客户端重试时复用它,新的有意点击则生成新键。在一个事务里,按用户和端点范围在唯一约束下认领这个键,执行toggle,保存结果。同一个键再次到来时,直接返回保存的结果。

然后测试那个确切的故障:让写入成功,丢掉它的HTTP回复,再重试。刷新之后,应该仍然只有一个赞。

无论赞住在MongoDB还是Neon,两次尝试现在都留下我们想要的结果。一次点击,一个赞。红心该保持红色。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
形势很严重了!大家立刻做准备吧,随时会变天!

形势很严重了!大家立刻做准备吧,随时会变天!

东亚财评V
2026-11-09 07:10:09
“他大概率是秦始皇的儿子”!面容复原图公布:约30岁,眼睛橄榄形、鼻梁高挺,头和四肢被肢解后置于棺内;或死于秦二世胡亥的清洗运动

“他大概率是秦始皇的儿子”!面容复原图公布:约30岁,眼睛橄榄形、鼻梁高挺,头和四肢被肢解后置于棺内;或死于秦二世胡亥的清洗运动

都市快报橙柿互动
2026-11-08 23:07:09
人生不易啊!网友晒212096.79元存款,称快50岁可打败95%的人:评论区有人称攒下百万,有人哭诉负债千万

人生不易啊!网友晒212096.79元存款,称快50岁可打败95%的人:评论区有人称攒下百万,有人哭诉负债千万

火山詩话
2026-11-08 19:56:33
日本哥斯拉横扫北美票房!《哥斯拉-0.0》首周末创下历史纪录

日本哥斯拉横扫北美票房!《哥斯拉-0.0》首周末创下历史纪录

桃桃淘电影
2026-11-08 17:34:24
内塔尼亚胡要完了!反对派正在联合组阁,一旦下台大概率要坐牢

内塔尼亚胡要完了!反对派正在联合组阁,一旦下台大概率要坐牢

不掉线电波
2026-11-08 14:58:00
黄仁勋女朋友曝光,粉裙长发美女!若离婚,妻子或分走5000亿

黄仁勋女朋友曝光,粉裙长发美女!若离婚,妻子或分走5000亿

派大星纪录片
2026-11-09 17:25:14
难堪大用!休赛期6笔最差签约正式出炉:湖人看走眼,76人太倒霉

难堪大用!休赛期6笔最差签约正式出炉:湖人看走眼,76人太倒霉

后仰跳投绝杀
2026-11-09 18:29:14
常州⇆无锡,即将提速!

常州⇆无锡,即将提速!

常州大喇叭
2026-11-09 17:36:10
有些事不用试也知道会失败,35岁女生哭诉两万五开的服装店,撑不到一个月就关门大吉,月营业额连三千都做不到。

有些事不用试也知道会失败,35岁女生哭诉两万五开的服装店,撑不到一个月就关门大吉,月营业额连三千都做不到。

捣蛋窝
2026-11-09 13:09:12
油价一周暴跌超16%,网友:别抱太大希望,降个一两毛就算给面子了

油价一周暴跌超16%,网友:别抱太大希望,降个一两毛就算给面子了

东方豪侠
2026-11-09 11:13:14
张雪看到释然了!网友:哈工大实打实985硕士毕业14年,陶伟胜街头卖气球,晴天100元,雨天没有

张雪看到释然了!网友:哈工大实打实985硕士毕业14年,陶伟胜街头卖气球,晴天100元,雨天没有

火山詩话
2026-11-09 08:11:47
52岁毛宁升任司长:30年冷板凳熬出厚积薄发

52岁毛宁升任司长:30年冷板凳熬出厚积薄发

起喜电影
2026-11-09 16:43:26
中方宣布:罗德里格斯将访华

中方宣布:罗德里格斯将访华

政知新媒体
2026-11-09 15:21:25
《绝命毒师》主演去世,34岁,老搭档们现身教堂送别

《绝命毒师》主演去世,34岁,老搭档们现身教堂送别

自愈小日子
2026-11-09 03:37:55
日本自卫队退役少将,把窗户纸给捅破了:再打仗,日本可能就没了

日本自卫队退役少将,把窗户纸给捅破了:再打仗,日本可能就没了

面包夹知识
2026-11-08 23:23:23
四川一老人迎来110岁生日,儿子回应“长寿秘诀”:母亲的3个弟弟都近百岁,与遗传基因有一定关系

四川一老人迎来110岁生日,儿子回应“长寿秘诀”:母亲的3个弟弟都近百岁,与遗传基因有一定关系

环球网资讯
2026-11-09 13:42:53
他曾是八路军旅长,建国后老搭档被授予上将,他却已经沦为剃头匠

他曾是八路军旅长,建国后老搭档被授予上将,他却已经沦为剃头匠

漫步史书
2026-11-08 18:12:00
重磅交易?唐斯,再度引爆NBA话题……

重磅交易?唐斯,再度引爆NBA话题……

体育新角度
2026-11-09 10:38:56
细思极恐!时间点耐人寻味,黄仁勋将赴深圳会前爆绯闻,国会调查同步跟进,网传是丢卒保帅

细思极恐!时间点耐人寻味,黄仁勋将赴深圳会前爆绯闻,国会调查同步跟进,网传是丢卒保帅

火山詩话
2026-11-09 17:30:58
“疯子” 何云昌:取出自己一根肋骨,配上400克黄金做成项链送给爱人,还曾把自己浇筑进水泥里

“疯子” 何云昌:取出自己一根肋骨,配上400克黄金做成项链送给爱人,还曾把自己浇筑进水泥里

磊子讲史
2026-10-28 16:42:42
2026-11-09 19:24:49
爬虫饲养员
爬虫饲养员
业余养了只叫“龙虾”的AI爬虫,主业是给互联网打工。
218文章数 88关注度
往期回顾 全部

科技要闻

AI机房被卡,美股重挫!英伟达大跌9%

头条要闻

丈夫凌晨4点和陌生女子通话 妻子赌气与异性开房3天

头条要闻

丈夫凌晨4点和陌生女子通话 妻子赌气与异性开房3天

体育要闻

40岁,正是绝杀的年纪!

娱乐要闻

黄仁勋与黄乐合照曝光,吃饭氛围暧昧

财经要闻

市场能接受AI繁荣退潮吗?

汽车要闻

限时权益价8.88万 吉利星愿STAR限定系列发布

态度原创

数码
旅游
家居
公开课
军事航空

数码要闻

STEPX Neo体验:当手机开始理解意图,AI交互有了新玩法

旅游要闻

直播间低价旅游卡兑现难 文旅消费陷阱如何破?

家居要闻

2026建博会(广州) 公装联探展交流活动

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

特朗普称伊朗战事何时结束将由其决定

无障碍浏览 进入关怀版