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

2025-10-27 990 views
4

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

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

回答

9

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

2

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

9

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

0

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

4

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

0

@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一次,我就不知道放到哪里了

5

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

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

3

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

2

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

5

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

5

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

6

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

8

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