开发者社区> 问答> 正文

关于消息系统的 三种方案:报错

类似于OSCHINA上面的 消息提醒数字

1 同步刷新 

  数据库插入一条数据,我url每次跳转 刷新下从DB里重新读取一次。

  缺点是不刷新的话 就不知道啥时候有新数据了。


2 前端轮询1分钟一次 

  1分钟自动局部刷新下,获取最新的消息条数。 前端1分钟轮询一次。


3 心跳包实时同步

  类似于QQ消息 有人给你发消息时,数字状态自动改变。



展开
收起
kun坤 2020-06-07 14:05:23 589 0
1 条回答
写回答
取消 提交回答
  • 3######代价比较大巴######http://www.oschina.net/widgets/check-top-log?last=10009347######回复 @kacc850 : ajax论询 打开firebug就可以看到请求######OS首页右侧 是ajax? 前端轮询吗 局部刷新 还是类似于微博哪种######用第三方推送服务呗,时时推送######有具体案例么。。。是服务端监听数据库变化吗######第三种,而且现在都有类似的线程框架。######

    如果限制使用html5 websocket是个不错的选择 

    ######这种WEB网站一般来说本身就不是长连接,用户的理解就是要刷新才能获取新数据,所以我觉得不用推送,至于轮询我也觉得没必要,一般的做法 就是用户发消息给你 然后你会插入数据库 然后把消息的id放到缓存,每次用户刷新从缓存获取....当然如果有全双工的websocket的支持下,可以用推送, 根据具体业务来吧######

    引用来自“Ambitor”的评论

    这种WEB网站一般来说本身就不是长连接,用户的理解就是要刷新才能获取新数据,所以我觉得不用推送,至于轮询我也觉得没必要,一般的做法 就是用户发消息给你 然后你会插入数据库 然后把消息的id放到缓存,每次用户刷新从缓存获取....当然如果有全双工的websocket的支持下,可以用推送, 根据具体业务来吧

    你的意思是:

    1:web一般不需要这样做shi吗,我lz的三点都不是最好解决方案?

    2:如果要做成这种效果,你建议是 其他人发给对方消息后,或者新动态入库时,同时写入到缓存里。 还是新动态入库后,计算多少条信息,然后放在缓存里,用户刷新页面时 从缓存里直接获取?

    那如果这样,DB库怎么直接到缓存呢? 肯定是后端先自己执行一遍是吧。 自己服务器执行 也是多久检查一次 。只不过 我是前端AJAX轮询,你这个是后端检查。因为这个消息不是公共推送消息,后端检查一次放入缓存里,不见得前端所有会员都会看到这条消息,而是不同的人看不同的消息,所以我觉得你这个方案不合适。


    3:OSCHINA用的是前端轮询,多久执行一次呢。 为什么我直接首页点发表,就能实时看到呢。 是不是 他们不直接入库,只是先前端js 把我输入框里的数据嵌套在首页。  造成假象,我只是自己看到而已,同一时间其他人看不到。

    等待下次轮询时,在正式发布,所有人才能看到。

    ######

    引用来自“Ambitor”的评论

    这种WEB网站一般来说本身就不是长连接,用户的理解就是要刷新才能获取新数据,所以我觉得不用推送,至于轮询我也觉得没必要,一般的做法 就是用户发消息给你 然后你会插入数据库 然后把消息的id放到缓存,每次用户刷新从缓存获取....当然如果有全双工的websocket的支持下,可以用推送, 根据具体业务来吧

    引用来自“kacc850”的评论

    你的意思是:

    1:web一般不需要这样做shi吗,我lz的三点都不是最好解决方案?

    2:如果要做成这种效果,你建议是 其他人发给对方消息后,或者新动态入库时,同时写入到缓存里。 还是新动态入库后,计算多少条信息,然后放在缓存里,用户刷新页面时 从缓存里直接获取?

    那如果这样,DB库怎么直接到缓存呢? 肯定是后端先自己执行一遍是吧。 自己服务器执行 也是多久检查一次 。只不过 我是前端AJAX轮询,你这个是后端检查。因为这个消息不是公共推送消息,后端检查一次放入缓存里,不见得前端所有会员都会看到这条消息,而是不同的人看不同的消息,所以我觉得你这个方案不合适。


    3:OSCHINA用的是前端轮询,多久执行一次呢。 为什么我直接首页点发表,就能实时看到呢。 是不是 他们不直接入库,只是先前端js 把我输入框里的数据嵌套在首页。  造成假象,我只是自己看到而已,同一时间其他人看不到。

    等待下次轮询时,在正式发布,所有人才能看到。

    DB库怎么直接到缓存呢?---------用户A发信息给B的请求中,除了把消息写数据库 同时把这条信息的id set到缓存。 而用户每次的刷新都会去get这个缓存,就知道有多少条了? 为什么要轮询捏?######另外 osc没有轮询去查 消息条数吧,首页的轮询是 动弹的 请求吧######

    引用来自“Ambitor”的评论

    这种WEB网站一般来说本身就不是长连接,用户的理解就是要刷新才能获取新数据,所以我觉得不用推送,至于轮询我也觉得没必要,一般的做法 就是用户发消息给你 然后你会插入数据库 然后把消息的id放到缓存,每次用户刷新从缓存获取....当然如果有全双工的websocket的支持下,可以用推送, 根据具体业务来吧

    引用来自“kacc850”的评论

    你的意思是:

    1:web一般不需要这样做shi吗,我lz的三点都不是最好解决方案?

    2:如果要做成这种效果,你建议是 其他人发给对方消息后,或者新动态入库时,同时写入到缓存里。 还是新动态入库后,计算多少条信息,然后放在缓存里,用户刷新页面时 从缓存里直接获取?

    那如果这样,DB库怎么直接到缓存呢? 肯定是后端先自己执行一遍是吧。 自己服务器执行 也是多久检查一次 。只不过 我是前端AJAX轮询,你这个是后端检查。因为这个消息不是公共推送消息,后端检查一次放入缓存里,不见得前端所有会员都会看到这条消息,而是不同的人看不同的消息,所以我觉得你这个方案不合适。


    3:OSCHINA用的是前端轮询,多久执行一次呢。 为什么我直接首页点发表,就能实时看到呢。 是不是 他们不直接入库,只是先前端js 把我输入框里的数据嵌套在首页。  造成假象,我只是自己看到而已,同一时间其他人看不到。

    等待下次轮询时,在正式发布,所有人才能看到。

    引用来自“Ambitor”的评论

    DB库怎么直接到缓存呢?---------用户A发信息给B的请求中,除了把消息写数据库 同时把这条信息的id set到缓存。 而用户每次的刷新都会去get这个缓存,就知道有多少条了? 为什么要轮询捏?
    回复 @Ambitor : 那你的意思就是  我在发消息给B时,入库的同时,自动把这条消息放在缓存里。 这个时候,B读取时就不需要从统一数据库里找,而是直接从缓存里提取了是吗?     ---------------------但这样有个问题啊,需要计算啊,比如我发给B 3条信息,放在缓存里,B那边可以显示三条未读的消息,然后点击缓存里可以看到这3条。  那么F也给B发了2条消息,也放在缓存里, 那么B一共收到五条未读消息,怎么计算呢?######回复 @Ambitor : THANKS 我还以为必须db解决呢。 内存缓存用的比较少######这么easy的问题,自己看下缓存支持的数据结构 然后设计下数据结构和key 就搞定了,比如最最简单的方法 设计两个 一个是记录未读消息数,是一个原子自增的数字(比如redis支持的),另外一个记录消息的id(如果并发不高 不用记录 直接查数据库也可以的。) 然后 点了未读消息数 根据未读的ids查找就是。
    2020-06-07 14:05:28
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
消息队列 Kafka 版差异化特性 立即下载
基于消息队列RocketMQ的大型分布式应用上云最佳实践 立即下载
Apache RocketMQ 云原生统一消息引擎 立即下载