解决方案
核心思路是不论浏览器打开了多少窗口,浏览器内的所有窗口在单位时间内(15 秒),只能发送一个请求。怎么做到呢?利用现代浏览器内置的 localStorage 功能可以很容易实现:
- JS 端使用 localStorage 在请求成功后记录
notification_requested_at
的值为Date.now()
; - 在每一次请求发送前,拿当前时间
Date.now()
减去notification_requested_at
时间; - 如果大于 15 秒,就发送请求;
- 否则放弃请求,直接读取 localStorage 里的
notification_count
; - 请求成功后将获取到未读消息数存入 localStorage 键为
notification_count
; - 每次刷新页面,JS 初始化时未读消息数存入 localStorage 键为
notification_count
。
有同学在问为啥不使用长链接,首先这里要求的实时性不需要那么高,其次,我有意保持程序架构的简单,Keep it simple and stupid ,越简单越方便维护,够用就行。