Channel/Client的publish过程是阻塞方式吗?

笑天

现在一个业务模型如下:
worker0:创建httpWorker, 地址:127.0.0.1:1188
创建进程Server
worker1:onWorkerStart回调中异步请求httpWorker, 在异步请求中的onClose方法中调用Worker::stopAll无限重启进程直到连接上httpWorker;
在worker1中的onWorkerStart回调中注册channel/client方法A,
worker2:onMessage方法回调发布方法A;

我想问下, 如果worker1处于无限重启中, worker2发布的方法A以及数据会被同时注销吗?
或者请教有没有更好的办法,使得如果worker1在无法请求到httpWorker的时候,能实worker2发布的数据阻塞直到连接上httpWorker

2841 1 0
1个回答

walkor

worker间通讯直接用channel就行了,不明白为什么还要在worker1中http异步连接worker0。

如果非要在worker1中http异步去连,可以在worker1->onWorkerStart时设置定时器,延迟去连就好了。

channel订阅和发布都是异步非阻塞的

  • 笑天 2016-05-01

    因为worker0跟worker1之间是2台不同的机器, 如果相互订阅部署起来太麻烦了.而且worker0是多进程运行的, 好像订阅数据在多进程下是同时多个订阅的.如果channel能做到多进程轮询订阅就完美了, 可以使用在容易阻塞的worker进程中.

  • walkor 2016-05-01

    多台服务器和单台服务器使用channel没有区别,既然已经部署了channel,直接就可以用了,更没有相互订阅部署麻烦一说。不懂你说的多进程轮询订阅是什么意思。

  • 笑天 2016-05-02

    @1:多进程轮询订阅就是 一个worker是几十个进程, 该worker有channel订阅, 目前是发布一次任务 该worker是全部执行一次,我想不知道能不能做到想java一样那种多线程调用发布任务

  • 笑天 2016-05-02

    @1:或者使用类似gateway的路由功能那样.随机模式也行呀

  • 笑天 2016-05-02

    @1:不好意思,我是个php初学者,说的不清楚. 上面说的就是channel::on注册的时候能设置类似gateway的路由功能吗,因为其实很多业务场景也需要这样, channel::on是注册在y一个多进程数的worker下, 其他worker进程发布任务的时候, channel订阅是被随机订阅的,或者抢占订阅,让多进程数的worker下能因为一个进程被阻塞了其他进程能订阅这个事件

  • walkor 2016-05-02

    不用那么麻烦,可以让每个进程监听自己独有的事件,例如监听的事件为"A.$worker->id",也就是方法A加当前进程编号作为事件名,发布者发布事件的时候选择一个进程编号发布事件即可

年代过于久远,无法发表回答
🔝