Egg: socket.io

Created on 14 Dec 2017  ·  12Comments  ·  Source: eggjs/egg

请问我想在定时任务里面写 socket定时执行,但是是未定义function,谢谢了
11111111111111

not follow template egg-socket.io

Most helpful comment

这个要分情况讨论:

  • 如果是服务器单机单进程:用这个api https://socket.io/docs/server-api/#server-sockets 拿到所有的socket对象,去筛选需要的socket来推消息即可
  • 如果服务器是多台或者多进程,那就复杂了。

    • 首先,定时任务 egg-schedule 是每台机器的某一个随机worker进程在执行,无法获取到全量的 socket 对象

    • 其次,因为是集群的每台机器都执行,所以就算拿到了 socket 对象,也会被执行多次。

如果是,不从部署架构上确保单机单进程,那么对于这个问题,需要一个分布式的定时器,并且需要有一个调度系统来获取所有的socket的对象,或者做一个单独的消息下发系统。

这个不是一个插件能够解决的问题,需要从系统架构上去设计。

All 12 comments

module.exports = {
  schedule: {
    interval: '1m', // 1 分钟间隔
    type: 'all', // 指定所有的 worker 都需要执行
  },
  async task(ctx) {
    const { app } = ctx;
    const nsp = app.io.of('/');
    nsp.emit('hello', 'world');
  },
};

截图的用法逻辑上不对。

socket 是一个相对概念,是相对于特定 client 的。在定时任务里面的 ctx 是匿名的,并不是任何客户端的指代,这里去调用 socket 没有意义。

楼上的代码,可以获得 io 对象对应的 namespace ,来做特定需求。

这个需求,可以考虑通过外部服务,比如 redis 来中转达到。

最根本的,还是这个需求的逻辑本身比较奇怪。

  • 是每个用户,定时下发特定消息?(每个用户不同)
  • 定时向所有用户下发相同消息?(广播)

我没这需求,代码是给一楼演示一下如何在定时任务里调用 io 发送消息~

@ngot

我遇到一个问题是这样:
通过 nsp.adpter.clients() 获取客户端时,
如果 client 接近同时(5ms)连接到 io , 每个 client 都只能获取到一个在线用户。

请问下这种情况该怎么处理呢?

@thonatos 我没遇到过这个。这个到 socket.io 那边提issue吧。

主要是以php做的系统,sokect.io做推送,所以才会做定时任务.我跑定时任务从数据库拿出来数据,推送给某个人 .希望能给一个好的想法,谢谢了 @thonatos @ngot

这个要分情况讨论:

  • 如果是服务器单机单进程:用这个api https://socket.io/docs/server-api/#server-sockets 拿到所有的socket对象,去筛选需要的socket来推消息即可
  • 如果服务器是多台或者多进程,那就复杂了。

    • 首先,定时任务 egg-schedule 是每台机器的某一个随机worker进程在执行,无法获取到全量的 socket 对象

    • 其次,因为是集群的每台机器都执行,所以就算拿到了 socket 对象,也会被执行多次。

如果是,不从部署架构上确保单机单进程,那么对于这个问题,需要一个分布式的定时器,并且需要有一个调度系统来获取所有的socket的对象,或者做一个单独的消息下发系统。

这个不是一个插件能够解决的问题,需要从系统架构上去设计。

@ngot 这里缺一篇 socket.io 文档~~

image

@thonatos 欢迎 PR 文档

明白了,多谢了 @thonatos @ngot

@atian25

好的,我研究一下怎么写...

egg,参考我最新写的那个 passport 文档

发自我的 iPhone

在 2017年12月15日,15:05,Suyi notifications@github.com 写道:

@atian25

文档是 PR 到哪个项目呢


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

1285

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Leungkingman picture Leungkingman  ·  3Comments

Webjiacheng picture Webjiacheng  ·  3Comments

weijiatan456 picture weijiatan456  ·  3Comments

lvgg3271 picture lvgg3271  ·  3Comments

Quekie picture Quekie  ·  3Comments