关于 workerman-json-rpc

evilk

初试 workerman-json-rpc,有几点疑问,希望大大能帮帮忙,谢谢
1.
服务端

$worker = new Worker('JsonNL://0.0.0.0:2015');   

客户端

$address_array = array(
  'tcp://127.0.0.1:2015',
  'tcp://127.0.0.2:2015'
);

这两个地方的协议为何不同 一个是 JsonNL ,一个是tcp,IP也不同,而且为什么客户端要写两个呢

2.
//异步调用User::getInfoByUid方法
$user_client->asend_getInfoByUid($uid);
如果想异步调用,必须在方法名前面加 "asend_"吗? 同理,异步接收也是类似吗?

3.
不是非常理解异步,我的理解是 服务端接收请求,处理请求,此时在处理请求的过程中,服务端不会一直阻塞在这里(不会一直等待处理结果),而是会继续接收其他请求,当处理中的请求处理完成后,会自动向客户端返回处理结果,不知道这样理解对不对,从官网的示例代码中,同步与异步的代码只有些许差别,看得不是很明白

  1. $user_client->asend_getInfoByUid($uid);

//其他业务逻辑代码

$ret_async2 = $user_client->arecv_getInfoByUid($uid);
这两行代码能否再帮忙讲解下,执行了第一行代码,会产生怎样的效果呢(是不是表明处理请求的过程,但并没有返回处理结果,如果这个请求很快就处理完了,那处理完的结果放在哪里的呢),执行完第二句代码(这句代码的意思是,这个时候我需要返回客户端数据了,然后再去拿刚才的处理结果,但这样的话,不是很明白,是去哪里拿刚才处理的结果呢)

5.内部究竟是如何做到异步的呢

有点啰嗦,因为最近公司在做RPC,看到这个,不是很明白,想请教下大大,谢谢了哈

3312 1 0
1个回答

walkor

1、workerman是支持多种协议的,所以workerman上监听要写上JsonNL。json_rpc客户端是专门针对JsonNL协议做的,没必要写JsonNL。设计之初考虑支持tcp或者udp,所以默认写的tcp。
服务端一般不会只是一台服务器,所以客户端一侧要指定服务端ip列表,也就是为什么有多个ip的原因。
这样客户端直接负载均衡,避免了中间再加其它负载均衡服务,速度更快更稳定。

2、如果想异步调用,必须在方法名前面加 "asend_"吗? 同理,异步接收也是类似吗?
是的

3、$user_client->asend_getInfoByUid($uid); 是发送请求,如果服务端很快处理完返回了,返回的数据会在操作系统socket缓冲区存着,这个是操作系统自动的,程序不用干预。
$ret_async2 = $user_client->arecv_getInfoByUid($uid); 是从缓冲区读取返回的数据,如果恰好数据早已返回,则直接能读取到,如果还没返回,就会阻塞等待直到返回或者超时(时间5秒)。

  • evilk 2017-11-11

    谢谢老大,再追问下,不是说服务端与客户端的协议要一致才能通信吗?

  • walkor 2017-11-12

    客户端写死的JsonNL协议,协议是一致的

  • dada 2017-11-15

    @1:大兄弟最近准备搭建个rpc服务,看见workerman-josn-rpc,测试了下还可以。就想问你们稳定不呀

  • walkor 2017-11-16

    稳定

  • 花儿 2020-11-05

    请教下$statistic_address = 'udp://127.0.0.1:55656';这一段代码是干啥用的

  • walkor 2020-11-05

    统计用的

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