c/s 端做消息推送通知的话,如何选择? websocket 还是选择长轮询? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tctc4869
V2EX    程序员

c/s 端做消息推送通知的话,如何选择? websocket 还是选择长轮询?

  •  
  •   tctc4869 2020-08-25 14:53:31 +08:00 4525 次点击
    这是一个创建于 1875 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要做实时数据显示功能,当然这里主要指手机客户端,在客户端后台挂起,实时监听,如果有内容则判断是否要显示通知栏。那么是选择长轮询,还是用 websocket ?然后服务端增加 websocket 服务端处理。

    在这个帖子里: t/477876?r=julyclyde 。有 V 友指出“长连的资源消耗不比轮询低”,“受网络限制比较大,需要处理好重连”

    那么到底要怎样考虑做选择?

    第 1 条附言    2020-08-25 16:53:14 +08:00
    这里指 app 没有被杀死的情况下,用 http 长轮询或 websocket 去联通自家服务器搞 app 通知,或实时数据显示
    第 2 条附言    2020-08-26 08:39:20 +08:00
    要监视一组某个类型的数据的最新状态的一对一数据。

    假设有实体 A,以及实体 A 的最新状态的一对一数据。 数据表名称上分别叫 t_test 和 t_test_new,是一对一关系。

    用户可选择指定的多个实体 A 的实例作为一组进行监视,web 后端架构上是怎么设计,在排除只用 http 长轮询查数据库的情况下,还有哪些方法?
    27 条回复    2020-08-26 14:41:07 +08:00
    unco020511
        1
    unco020511  
       2020-08-25 14:59:04 +08:00
    使用第三方推送 SDK
    xuanbg
        2
    xuanbg  
       2020-08-25 15:07:59 +08:00
    手机你不走系统通知?
    chinvo
        3
    chinvo  
       2020-08-25 15:08:54 +08:00
    手机你还想保活当流氓咋地?

    当然是老老实实系统推送 /FCM 啊
    Hanggi
        4
    Hanggi  
       2020-08-25 15:11:24 +08:00
    Firebase 国内收得到吗?跟其他国内厂商比哪个好?
    有谁用过 mobpush 吗?跟极光比哪个好?
    tctc4869
        5
    tctc4869  
    OP
       2020-08-25 15:52:53 +08:00
    @xuanbg 系统通知?你的意思要离线推送么?
    internelp
        6
    internelp  
       2020-08-25 15:55:25 +08:00
    @Hanggi 我用过 mobpush,因为做的是监控 APP,需要消息到达及时,它不满足,转战阿里云了。
    coderxy
        7
    coderxy  
       2020-08-25 16:03:57 +08:00
    第三方推送吧,不然 app 不在进程中时你收不到的。
    tctc4869
        8
    tctc4869  
    OP
       2020-08-25 16:14:33 +08:00
    @coderxy
    @unco020511

    第三方推送?安卓第三方推送听说是群魔乱舞,不同的手机要接入不同的第三方接入服务。
    unco020511
        9
    unco020511  
       2020-08-25 16:17:35 +08:00
    @tctc4869 目前的最优选择就是第三方,你如果要自己开发,想想准备投入多少人力
    BlackGrasshopper
        10
    BlackGrasshopper  
       2020-08-25 16:18:15 +08:00
    统一推送联盟
    tctc4869
        11
    tctc4869  
    OP
       2020-08-25 16:24:11 +08:00
    @unco020511 我目前的系统通知是在 app 没有被安卓系统杀死的情况下进行消息通知
    coderxy
        12
    coderxy  
       2020-08-25 16:29:11 +08:00
    @tctc4869 可以接第三方的,比如极光推送啥的。 因为你自己搞会有很多问题,比如像小米啥的它在后台限制了后台长连接,你要想在 app 不启动的情况下推送消息下去,比如走小米的推送渠道。 还有好几家都是这样。 所以最好的方案就是走极光一类的第三方推送。
    chinvo
        13
    chinvo  
       2020-08-25 16:30:53 +08:00
    @Hanggi #4 FCM 国内收得到的, 除了被禁止装 Google Play Service 的华为
    tctc4869
        14
    tctc4869  
    OP
       2020-08-25 16:35:05 +08:00
    @coderxy 在 app 不被系统杀死的情况下,可以用轮询 http 或 websocket 直接与自家后台服务联通做 app 消息通知把
    stevenkang
        15
    stevenkang  
       2020-08-25 16:47:27 +08:00
    凡是手机上 app 想自启动做推送,不用统一推送的,见一个杀一个。
    learningman
        16
    learningman  
       2020-08-25 16:49:26 +08:00
    @chinvo 前提是用户有 GMS
    摸摸良心,国内有多少用户装了 GMS 。。。真要推送还得当流氓
    chinvo
        17
    chinvo  
       2020-08-25 16:50:06 +08:00
    @learningman #16 7.0 及之后除了华为都自带 GMS 的
    IGJacklove
        18
    IGJacklove  
       2020-08-25 18:46:51 +08:00
    @tctc4869 看你愿不愿意花钱了,肯花钱别人都帮你做好了.
    learningman
        19
    learningman  
       2020-08-25 22:45:14 +08:00
    @chinvo MIUI 和 ColorOS 这种的应该都没有吧,原生安卓才多少人啊
    tctc4869
        20
    tctc4869  
    OP
       2020-08-26 00:37:35 +08:00 via Android
    @IGJacklove 你的意思是安卓系统通知不用第三方系统通知服务都会出问题用不了。必须要花钱?
    IGJacklove
        21
    IGJacklove  
       2020-08-26 07:33:43 +08:00 via Android
    @tctc4869 没有这个意思,我的意思是想少点麻烦就多花点钱,想自己弄就麻烦一点,自己做取舍。
    opengps
        22
    opengps  
       2020-08-26 08:09:20 +08:00
    app 没有被杀死的情况下,用原生 socket 更实时
    tctc4869
        23
    tctc4869  
    OP
       2020-08-26 08:32:35 +08:00
    @opengps 那么你觉得 websocket,或 http 长轮询,哪个方式更好。
    opengps
        24
    opengps  
       2020-08-26 08:53:02 +08:00
    @tctc4869 http 轮训比较简单。建议首选,做大了在考虑 websocket
    websocket 实时性好,但是大部分人没经历过长连接项目,可能得有些坑需要踩。作为一个客户端,可控性更低,有问题难以分析
    unco020511
        25
    unco020511  
       2020-08-26 09:04:56 +08:00
    @tctc4869 不管是从消息送达率,还是耗电,还是投入 /产出比 上来说,使用第三方推送都会比你自己做要好,你要考虑好;你使用 http 轮询不用考虑耗电问题吗,再说现在的 rom 很多会限制你后台的活动,再其次你使用 socket 长连接,你的心跳包间隔是多少,怎么根据不同运营商来优化心跳频率,还有国内 row 有诸多改动和限制,也会涉及适配的问题;以上你都得考虑
    sioncheng
        26
    sioncheng  
       2020-08-26 09:47:36 +08:00
    手机后台存活不了多少时间,不要想啦。 退而求其次,有数据需要刷新了,发送 APP 推送( ios apns 或者国内 android 厂商推送服务),提醒用户打开 APP 然后拉取最新数据。
    0x8192dd
        27
    0x8192dd  
       2020-08-26 14:41:07 +08:00
    移动端直接利用推送通道不就完事了?接个推送 SDK 就行了,保活就别想了
    都 2020 年了,移动端没有后台挂起这种说法,用户退出应用之后,就是靠推送通道推送消息,用户点了消息,唤起应用,重连,你用 iOS,微信启动之后有个“收取中”,就是执行重连和数据同步。

    轮询和 socket 的区别主要是在应用位于前台的时候
    如果你是要做 IM,或者股票 K 线图那样实时的东西,那必须用 socket 让客户端接收服务器主动下发的数据,如果只是个什么中奖通知,工单反馈之类实时性要求不高的推送,那么在移动端轮询或者写一些触发点(比如切页面)来查询就可以了。

    简而言之:需要频繁主动下发 - socket ;需要用户在某一页面的时候更新数据状态 - 轮询
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1427 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 16:51 PVG 00:51 LAX 09:51 JFK 12:51
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86