V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pizida
V2EX  ›  Node.js

使用 nodejs 和 socket.io 搭建了一个推送服务,但是不知道后端如何构建?

  •  
  •   pizida · 2016-03-23 16:45:14 +08:00 · 6571 次点击
    这是一个创建于 3201 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为项目需要实时推送一个消息,现在使用的技术是 nodejs 和 socket.io ,以前没有这方面的经验,后端到底需要如何推送呢?是不是跑一个定时器,执行后端文件?还是前端轮询?轮询的话好像本末倒置了。望各位指教!

    20 条回复    2017-08-25 15:02:09 +08:00
    daysv
        1
    daysv  
       2016-03-23 16:58:32 +08:00
    你似乎什么都不懂,先去了解什么是 socket.io 再说
    pizida
        2
    pizida  
    OP
       2016-03-23 17:24:21 +08:00
    @daysv socket.io 不是封装了 websocket 和 comet 的一个类库么?
    neoblackcap
        3
    neoblackcap  
       2016-03-23 17:30:31 +08:00
    @pizida 那你既然知道 websocket 那你就应该知道 websocket 是不用轮询的,只要你连接一建立,那么服务端就可以往客户端推送消息,直接写就可以了。完全又你服务端决定,这个还要什么轮询
    daysv
        4
    daysv  
       2016-03-23 17:32:33 +08:00
    需要推送就服务端直接推送了啊
    pizida
        5
    pizida  
    OP
       2016-03-23 17:35:12 +08:00
    @neoblackcap 我的实现场景是这样的,服务端什么时候去推送呢?因为数据是实时的。比如全网用户累计的积分,金币之类的东西。
    neoblackcap
        6
    neoblackcap  
       2016-03-23 17:36:42 +08:00
    @pizida 你在服务端实现一个 callback 啊,你数据出来了就调用那个 callback , callback 里面进行推送操作
    pizida
        7
    pizida  
    OP
       2016-03-23 17:37:49 +08:00
    @daysv 场景是前端需要获得实时数据,这个数据每秒都在变化,那后端是不是每秒都要推送?没有接触过 nodejs ,请指点一下。
    pizida
        8
    pizida  
    OP
       2016-03-23 17:46:21 +08:00
    @neoblackcap
    这是我 server 端的代码:

    io.on('connection', function (socket) {
    socket.emit('news', { hello: 'world' });
    socket.on('my other event', function (data) {
    console.log(data);
    });
    });

    这是 client 端代码:
    var socket = io.connect('http://localhost:3000');
    socket.on('news',function(data){
    console.log(data);
    socket.emit('my other event',{my:'data'});
    });

    现在前端已经可以获取到{hello:'world'}这个 json ,那么我如何保证实时推送?
    v370
        9
    v370  
       2016-03-23 17:51:01 +08:00
    socket.io 有内存泄漏
    sun019
        10
    sun019  
       2016-03-23 17:51:09 +08:00
    那现成的来用啊 jpush 啥的
    pizida
        11
    pizida  
    OP
       2016-03-23 18:05:28 +08:00
    @v370 严重么
    pizida
        12
    pizida  
    OP
       2016-03-23 18:05:44 +08:00
    @sun019 项目要自己实现哇
    v370
        13
    v370  
       2016-03-23 18:10:30 +08:00
    @pizida 严重 每天重启服务器
    pizida
        14
    pizida  
    OP
       2016-03-23 18:27:38 +08:00
    @v370 额,那有没有什么靠谱的方案推荐
    fds
        15
    fds  
       2016-03-23 18:30:09 +08:00
    有数据就调用 socket.emit 发送给客户端呗
    vikeria
        16
    vikeria  
       2016-03-23 19:21:19 +08:00 via iPhone
    可以考虑用 redis 的 publish 和 subscribe
    vikeria
        17
    vikeria  
       2016-03-23 19:27:01 +08:00 via iPhone
    对 node 不是很熟,但是如果上层 api 的底层用到 epoll 等异步非阻塞的 io 的话,一半都能做到推送吧,轮询是操作系统内核在做的事情
    tencoldays
        18
    tencoldays  
       2016-03-23 19:30:04 +08:00
    @pizida 可以直接 emqtt.io...
    w3hacker
        19
    w3hacker  
       2016-03-23 21:05:56 +08:00
    嗯 可以试试 emqtt 他支持 MQTT 协议、 sockjs 协议、 stomp 协议,可以用到网页、手机、 pc 都可以,值得一试
    happybirthday
        20
    happybirthday  
       2017-08-25 15:02:09 +08:00
    我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方便,GoEasy 就挺不错的,我昨天试了一下,代码简洁易懂,几分钟我就洗了一个自己的实时推送功能;官网: http://goeasy.io/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2519 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:36 · PVG 12:36 · LAX 20:36 · JFK 23:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.