-
Notifications
You must be signed in to change notification settings - Fork 385
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
后端实时推送数据到客户端的问题 #210
Comments
由于目前的rpc都是一来一回模式,因此想实现server主动推送到client,有一个最简单的方法是使用watch_timeout,这是对方第一次回复的超时,用法直接client.set_watch_timeout(60 * 1000 /* 60秒*/),网络模型大概就是: client发起task -------watch------> server干别的 client收到消息 <--------推送------ server发起推送 client收到消息 <--------推送------ server发起推送 |
你可以在client端也开个srpc server的。连上server之后,把自己的ip port发过去。然后server端就可以rpc client啦。 |
那这样就是要前端定时去请求,是吗 |
@guochaopeng 不是定期,是保持自己watch了就可以了。比如下次收到了推送,那你再watch一次。 |
可以弄个案例吗?没有太理解 |
可以弄个案例吗?没有太理解 |
你好。前面关于watch的解释有一点小问题。 {
struct RPCClientParams params = RPC_CLIENT_PARAMS_DEFAULT;
params.task_params.watch_timeout = 30 * 1000; // 30 seconds
params.host = "127.0.0.1";
params.port = 1412;
Example::SRPCClient client(¶ms);
...
} 通过这个方法,所有rpc调用,都可以有一个watch时间了。而receive_timeout会在watch到第一个数据包之后,才开始计算。 |
其实,如果是server的主动推送,我们更推荐client端再开一个rpc server的方案。这个方案在我们公司内部大量应用,我认为是收缩rpc调用模型的一个好方法。 |
如果我的客户端不是使用的C端,而是使用的B端请求呢? |
浏览器的话,只能在一个连接上让server不停的push了。这个workflow里是支持的,但push接口我们没有在srpc项目里实现。 |
可以考虑支持notify的功能,就是一方只发数据通知对方、不需要响应:
|
@lesismal 感谢QWQ 这个表格很清晰~ |
这个确实有很多方法。也有用户帮我们魔改了完整的websocket client/server ,这个就是全双工。 |
tcp和websocket在作为rpc的传输载体协议时,没有本质区别。网络框架能支持并发call的,就能支持notify,跟传输载体协议的双工没什么直接关系,因为能支持并发call就意味着载体协议是双工,而且tcp和websocket也都是双工的。 |
我们内部用得更多的,是自己也拍一个server下去。然后把自己的ip:port通过rpc告诉notify server。notify server通过正常的rpc访问client。其实我非常喜欢这种方式,很好的收缩了访问模型。 |
其实这个确实不是协议上的问题,是与核心通信器的默认模式相关。 |
哈哈哈。是的。内部应用,我们尽量用简单模式。持续推送的话,目前workflow的server task有push接口,可以持续推送(同步写,超过tcp send buffer的数据需要用户自己配合timer重试),但这个在rpc里没有实现。全双工,内部都支持,但一直没有我自己特别满意用户接口。所以暂时留给用户自己改😂
…---原始邮件---
发件人: ***@***.***>
发送时间: 2022年5月13日(周五) 晚上11:48
收件人: ***@***.***>;
抄送: ***@***.******@***.***>;
主题: Re: [sogou/srpc] 后端实时推送数据到客户端的问题 (Issue #210)
也有用户帮我们魔改了完整的websocket client/server ,这个就是全双工。
tcp和websocket在作为rpc的传输载体协议时,没有本质区别。网络框架能支持并发call的,就能支持notify,跟传输载体协议的双工没什么直接关系,因为能支持并发call就意味着载体协议是双工,而且tcp和websocket也都是双工的。
我们内部用得更多的,是自己也拍一个server下去。然后把自己的ip:port通过rpc告诉notify server。notify server通过正常的rpc访问client。其实我非常喜欢这种方式,很好的收缩了访问模型。
我们考虑两种业务:
第一种:仅限于集群内部不同服务之间的通信交互,虽然略麻烦、但这样用法是完全能满足需要的。
第二种:直接面向集群之外的用户,比如游戏服务之于玩家、电商服务之于买家、IM用户之于用户,我们不可能要求每个用户的client都启动一个非公网IP的server再用我们自己的server去connect每个用户的server。
作为通信通道,tcp也好websocket也好,单个连接信道本身就能满足上述集群内部和外部的全部需求。只是绝大多数rpc框架选择了被阉割的通信姿势,所以无法处理第二种业务。仅限于rpc,够用,无可厚非,但是还可以做到更好。
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you commented.Message ID: ***@***.***>
|
首先,我们一个fd上最多一个超时(也可无超时)。一个fd同时需要关注读写的话,必须通过dup操作多产生一个fd放进去。 |
我想请教下,这个srpc跟grpc的区别? |
嗯嗯,我们没有主动推送的功能啊。workflow里也只支持到SSE模式。 想做推送可以两边都开server,互相调用,actor模式。我们本质上就是actor。 |
好的,谢谢~ |
如果我要从后端实时推送数据到客户端,应用workflow的rpc框架,要怎么应用来做到实时推送呢
The text was updated successfully, but these errors were encountered: