egg icon indicating copy to clipboard operation
egg copied to clipboard

新手小白请教一下,egg 2.0版本中所有worker中只执行一次怎么做呢?

Open leosj opened this issue 4 years ago • 14 comments

比如有5个worker,我在启动的时候想要初始化一下微信公众号的示例,做到有人发消息过来的时候自动回复。

假如只能new一次,不能所有worker都new,要做到所有消息收到的时候,都可以调用的初始化的这个微信公众号示例,怎么做呢?

leosj avatar Dec 02 '21 03:12 leosj

放到 agent 里面做,然后再同步给 worker

hyj1991 avatar Dec 02 '21 04:12 hyj1991

@hyj1991 怎么同步呀,真小白,有没有示例什么的呢?

leosj avatar Dec 02 '21 06:12 leosj

如果是集群部署, egg 这层做不到,必须引入三方服务,如分布式缓存或数据库标志位这样。

atian25 avatar Dec 02 '21 06:12 atian25

@hyj1991 在agent中没法调用ctx获取数据库中保存的微信公众号相关配置信息呀

leosj avatar Dec 02 '21 06:12 leosj

@atian25 那如果就单机器,不考虑集群,怎么处理呢

leosj avatar Dec 02 '21 06:12 leosj

@hyj1991 @atian25

就比如一个这个代码

const telapp = new Telegraf(token);

telapp.command('haha', (tt) => {
    let {chat, reply } = tt;

    return reply('welcome');
});

telapp.startPolling();

这个代码就是当别人回复haha的时候,我回复给他welcome, 但是new Telegraf只能new一次,我就不知道放到哪里了

leosj avatar Dec 02 '21 07:12 leosj

这个代码就是当别人回复haha的时候,我回复给他welcome, 但是new Telegraf只能new一次,我就不知道放到哪里了

agent 里一样有 ctx,db 也可以配置到 agent 上的,你在 agent 里 new 这个 Telegraf,然后 worker 收到消息后通过 ipc 通知到 agent,agent 处理完毕后再返回给 worker,这样子会稍微复杂一些

hyj1991 avatar Dec 02 '21 07:12 hyj1991

可以参考下 https://eggjs.org/zh-cn/core/cluster-and-ipc.html#%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E8%AE%AFipc

hyj1991 avatar Dec 02 '21 07:12 hyj1991

@hyj1991 我在agent中new的话,token是需要从数据库中查的,agent中的ctx怎么拿呢,如果可以在agent中拿到,那我就直接在agent中执行我上面的代码,不知道规范不,因为这样的话就不用通知来通知去了,但是怎么在agent中获取ctx我就小白了

leosj avatar Dec 02 '21 07:12 leosj

你是啥数据库,一般来说这种 db client 不需要和 ctx 绑定吧,比如 egg-mysql 是绑定到 app 上的

hyj1991 avatar Dec 02 '21 07:12 hyj1991

ctx 指的是请求上下文,因此 ctx.xxx 一般都是初始化和请求相关的能力,请求结束后就销毁;而 app 生命周期是和应用一致的,db client 在应用生命周期里并不需要重复初始化,所以都会绑定到 app 上

hyj1991 avatar Dec 02 '21 07:12 hyj1991

@hyj1991 卡卡罗特, 我用的是egg-sequelize来操作mysql的,所以现在我是想用ctx.service中的方法去取数据

leosj avatar Dec 02 '21 07:12 leosj

@atian25 @huacnlee 我现在遇到的问题就是在agent中怎么获取数据库的数据,用的是egg-sequelize

leosj avatar Dec 02 '21 08:12 leosj

egg-sequelize可以挂载到agent了,感谢

leosj avatar Dec 02 '21 08:12 leosj