比如有5个worker,我在启动的时候想要初始化一下微信公众号的示例,做到有人发消息过来的时候自动回复。
假如只能new一次,不能所有worker都new,要做到所有消息收到的时候,都可以调用的初始化的这个微信公众号示例,怎么做呢?
比如有5个worker,我在启动的时候想要初始化一下微信公众号的示例,做到有人发消息过来的时候自动回复。
假如只能new一次,不能所有worker都new,要做到所有消息收到的时候,都可以调用的初始化的这个微信公众号示例,怎么做呢?
放到 agent 里面做,然后再同步给 worker
@hyj1991 怎么同步呀,真小白,有没有示例什么的呢?
如果是集群部署, egg 这层做不到,必须引入三方服务,如分布式缓存或数据库标志位这样。
@hyj1991 在agent中没法调用ctx获取数据库中保存的微信公众号相关配置信息呀
@atian25 那如果就单机器,不考虑集群,怎么处理呢
@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一次,我就不知道放到哪里了
这个代码就是当别人回复haha的时候,我回复给他welcome, 但是new Telegraf只能new一次,我就不知道放到哪里了
agent 里一样有 ctx,db 也可以配置到 agent 上的,你在 agent 里 new 这个 Telegraf,然后 worker 收到消息后通过 ipc 通知到 agent,agent 处理完毕后再返回给 worker,这样子会稍微复杂一些
@hyj1991 我在agent中new的话,token是需要从数据库中查的,agent中的ctx怎么拿呢,如果可以在agent中拿到,那我就直接在agent中执行我上面的代码,不知道规范不,因为这样的话就不用通知来通知去了,但是怎么在agent中获取ctx我就小白了
你是啥数据库,一般来说这种 db client 不需要和 ctx 绑定吧,比如 egg-mysql 是绑定到 app 上的
ctx 指的是请求上下文,因此 ctx.xxx 一般都是初始化和请求相关的能力,请求结束后就销毁;而 app 生命周期是和应用一致的,db client 在应用生命周期里并不需要重复初始化,所以都会绑定到 app 上
@hyj1991 卡卡罗特, 我用的是egg-sequelize来操作mysql的,所以现在我是想用ctx.service中的方法去取数据
@atian25 @huacnlee 我现在遇到的问题就是在agent中怎么获取数据库的数据,用的是egg-sequelize
egg-sequelize可以挂载到agent了,感谢