Gateway

Gateway

55 人关注该话题

GatewayWorker报错SendBufferToWorker fail. May be the send buffer are overflow Gateway

GatewayWorker mingjian 回复了问题 • 2 人关注 • 2 个回复 • 17 次浏览 • 1 天前

GatewayWorker集群,Woker服务器产生大量TIME_WAIT? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 3 个回复 • 65 次浏览 • 2017-11-28 14:12

stream_socket_sendto(): Զ�����ǿ�ȹر��һ�����е���ӡ� thinkphp Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 209 次浏览 • 2017-10-27 13:37

event-loop的区别? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 149 次浏览 • 2017-08-21 17:53

registerAddress端口号串了? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 123 次浏览 • 2017-08-03 10:59

如何在同个项目往多个不通的$registerAddress发送消息? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 125 次浏览 • 2017-07-21 10:16

Gateway,连接Redis写入,客户端多的情况下,是否会出现redis大量连接不上的可能性? redis Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 437 次浏览 • 2017-06-28 16:03

请问如何在gateway中的onConnect或onWebSocketConnect中获取client_id? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 152 次浏览 • 2017-06-24 21:55

如果有效的实时获得Gateway中的session,特别是当上万台设备连接的时候? session Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 322 次浏览 • 2017-06-20 20:45

Gateway进程中的connections数一直在上涨,但实际上没有新的客户端加进来。 Gateway

GatewayWorker xinxing 回复了问题 • 4 人关注 • 3 个回复 • 517 次浏览 • 2017-06-07 19:56

如何在多个GatewayWorker间互发消息? 消息队列 Gateway

GatewayWorker walkor 回复了问题 • 3 人关注 • 4 个回复 • 651 次浏览 • 2017-05-26 15:35

心跳包设置pingNotResponseLimit后,客户端会断开 心跳 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 319 次浏览 • 2017-05-26 13:52

最新版的为什么没有生成workerman.log和pid文件?? Gateway

GatewayWorker damao 回复了问题 • 2 人关注 • 2 个回复 • 200 次浏览 • 2017-05-23 14:24

Gateway 配置ssl ssl加密 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 3 个回复 • 284 次浏览 • 2017-05-02 11:11

哪位朋友有 GatewayWorker 2.0.7版本的源码 Gateway

GatewayWorker tshanchuan 回复了问题 • 1 人关注 • 1 个回复 • 210 次浏览 • 2017-04-05 12:46

Gateway为什么只有一个客户端连接的情况下connections不止一个 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 567 次浏览 • 2017-02-09 22:48

GatewayClient调用失败 其它项目中推送 Gateway

GatewayWorker sharf 回复了问题 • 5 人关注 • 10 个回复 • 1782 次浏览 • 2017-01-27 00:15

多个Application的情况下,如何关闭或重启其中某一个App Gateway

GatewayWorker huxu1120 回复了问题 • 3 人关注 • 2 个回复 • 336 次浏览 • 2017-01-19 10:19

请问下异步Mysql组件适用于GatewayWorker吗? mysql Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 434 次浏览 • 2017-01-18 15:26

为什么Gateway会主动关闭客户端? 心跳 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 7 个回复 • 733 次浏览 • 2017-01-07 22:31

GatewayWorker如何单开一个进程 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 482 次浏览 • 2017-01-03 18:26

GatewayWorker中在Events文件的onMessage中require_once引入的文件更改后reload没有加载 reload Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 497 次浏览 • 2016-11-28 14:54

请问,前端js用ws.send(data) 发送json数据,不需要进行加密吗? Gateway ssl加密

workerman-chat聊天室 damao 回复了问题 • 2 人关注 • 1 个回复 • 764 次浏览 • 2016-08-17 09:50

前端js怎么接受onConnect传值? Gateway

GatewayWorker latin 回复了问题 • 2 人关注 • 1 个回复 • 321 次浏览 • 2016-08-10 17:24

GatewayWorker 如何获取请求路径 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 7 个回复 • 415 次浏览 • 2016-05-06 21:51

GatewayWorker 在windows下,压力测试并发时的问题... windows Gateway 压力测试

Workerman lobtao 回复了问题 • 3 人关注 • 3 个回复 • 1214 次浏览 • 2016-04-24 19:05

一个Gateway下挂载多个Worker项目,怎么配置? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 525 次浏览 • 2016-04-18 18:16

关于getaway cookie Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 444 次浏览 • 2016-03-25 17:30

workerman-chat 能实现与客户端软件之间的对话么?? Gateway

Workerman walkor 回复了问题 • 3 人关注 • 13 个回复 • 4296 次浏览 • 2016-03-08 11:41

GLOBAL_GATEWAY_ADDRESS 地址会增多吗? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 461 次浏览 • 2016-03-04 20:42

关于joinGroup和sendToGroup的用法 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 505 次浏览 • 2016-03-03 10:58

GatewayWorker中client_id和uid之间的关系 Gateway

GatewayWorker walkor 回复了问题 • 3 人关注 • 1 个回复 • 1244 次浏览 • 2016-04-22 10:02

client_id在刷新页面的时候可能自增,绑定在该client_id上的$_SESSION就无用了 Gateway session

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 777 次浏览 • 2016-02-13 20:04

向客户端app做推送,是用workerman还是gatewayWorker? app Gateway

Workerman walkor 回复了问题 • 2 人关注 • 3 个回复 • 2360 次浏览 • 2016-02-02 13:49

gatewayWorker内部通讯地址疑问 Gateway 内部通讯地址 原理

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 708 次浏览 • 2016-01-30 10:58

在客户端连接后定时发送数据问题 定时器 Gateway

定时器Timer walkor 回复了问题 • 2 人关注 • 1 个回复 • 724 次浏览 • 2016-01-30 10:44

Gatewayworker进程问题 Gateway 端口监听 原理

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 659 次浏览 • 2016-01-29 17:54

gatewayworker自定义协议 Gateway 协议

GatewayWorker walkor 回复了问题 • 3 人关注 • 13 个回复 • 1079 次浏览 • 2016-01-29 17:40

GatewayWorker 为什么需要把用户链接分组? Gateway 用户分组

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 585 次浏览 • 2016-01-29 16:56

更多...
0

赞同来自:

实际上GatewayWorker 2.1.4之前的版本是支持自定义client_id的,但是出现了很多问题,后来改成不可自定义,并且全局自增。

client_id 用来全局标记一个socket连接,是一个全局自增的数值,由此可以精确控制向哪个socket连接... 显示全部 »
实际上GatewayWorker 2.1.4之前的版本是支持自定义client_id的,但是出现了很多问题,后来改成不可自定义,并且全局自增。

client_id 用来全局标记一个socket连接,是一个全局自增的数值,由此可以精确控制向哪个socket连接发送数据,由于client_id自增,即使向过期的client_id发送数据不会造成影响。

client_id交给开发者自定义,难免会导致client_id重复,而client_id重复,会导致部分socket失效或者断开,也无法确定向哪个socket连接发送数据,导致应用异常,而这样的异常很难排查。

**一般开发者会想把client_id定义为uid,这样会导致业务处理困难或者业务异常。**举几个例子
1、聊天客户端与wm(GatewayWorker)建立连接,这时客户端突然断网然后重新发起一个连接,而在wm这边由于客户端异常断网,没立即收到连接断开的fin包,wm这边就有两个uid的连接,当wm终于检测到第一个连接断开时,会触发onClose($uid),这时可能会认为uid下线了,做一些下线处理操作,但是实际上这个uid还有一个连接,并没有下线,导致业务异常。

2、如果把client_id定义为uid,假设用户打开了两个socket连接,那么会导致其中的一个连接失效,无法收到数据,典型的例子是两个聊天室的连接id都是uid,则只有一个聊天室能收到消息,另外一个收不到消息,或者可能在这个聊天室给uid发送消息,但是另外一个聊天室也收到了。同样如果这个用户退出了其中的一个聊天室,onClose($uid)只能知道这个uid退出了,但是不知道退出的是哪个聊天室,导致业务编程困难。

3、如果把client_id定义为uid,无法实现多客户端通讯,像PC QQ 和手机QQ同时在线是需要两条socket连接的,必须需要分开标记的,如果都统一用uid,则无法针对某个客户端推送消息,也无法方便的判断消息是从哪个平台的客户端发来的。

**即使不用uid标记client_id**
如果client_id自定义不当,会引发逻辑错误,比如用户A上线后client_id为1,这时要向client_id为1的的连接发送数据,恰巧A用户还没收到数据就下线了,B用户上线,也被分配client_id=1,则会导致发给A用户的数据却发给了B,导致业务异常

**结论**
client_id为自增并且短时间内不重复是非常必要的,而达到这点的client_id的值对于开发者来说也没有什么意义,反而交给开发者定义会出现很多不可预知的问题,并且很难排查。

关于和现有账号绑定问题,GatewayWorker后面会考虑增加一组接口,用来绑定uid与client_id的关系,在client_id下线时自动解绑,绑定关系存储在Gateway的内存中,不用读存储,效率很高。接口类似如下:
{{{
Gateway::bindUid($client_id, $uid); // 将$client_id绑定到uid下,uid与client_id是一对多关系
Gateway:;sendToUid($msg, $uid); // 给这个uid下的所有链接发送数据
}}}
0

赞同来自:

说明:
array Gateway::getClientIdByUid(mixed $uid);
返回一个数组,数组元素为与uid绑定的所有在线的client_id。如果没有在线的client_id则返回一个空数组。

此方法可以判断一个uid是否在线。

注... 显示全部 »
说明:
array Gateway::getClientIdByUid(mixed $uid);
返回一个数组,数组元素为与uid绑定的所有在线的client_id。如果没有在线的client_id则返回一个空数组。

此方法可以判断一个uid是否在线。

注意:返回值为与uid绑定的所有在线的client_id数组。因为已经下线的client_id会自动与uid解绑,所以已经下线的client_id不会出现在返回值中。

见手册
http://workerman.net/gatewaydoc/gateway-worker-development/get-client-id-by-uid.html
1

赞同来自: kaifengjk

**两个方法的作用**
Gateway::sendToGroup是给某个用户组(这里是房间)的用户连接发送数据
Gateway::sendToCurrentClient是给当前用户连接发送数据。

**用户登录数据交互流程**
1、先给当前房间所有在线用户广播... 显示全部 »
**两个方法的作用**
Gateway::sendToGroup是给某个用户组(这里是房间)的用户连接发送数据
Gateway::sendToCurrentClient是给当前用户连接发送数据。

**用户登录数据交互流程**
1、先给当前房间所有在线用户广播(Gateway::sendToGroup)有人登录,浏览器收到login数据后将**新用户**展示到在线列表里面
2、给当前登录的用户单独放送(Gateway::sendToCurrentClient)在房间的**线用户列表**

**为什么当前用户要单独发送?**
因为当前用户有个在线用户列表数据。而这个在线列表数据根本不需要发送给其它已经在线的用户,因为他们已经有了这份在线列表数据,只需要增量添加新用户即可。

**在线用户列表占用的带宽**
在线用户列表数据可能会很大。例如2000人在线,每个用户记录大概50字节,那么这个列表体积可能在100KB左右。

如果这100KB数据广播给所有2000在线用户,那么将占用带宽2000*100KB=200MB=1.6Gbit,没错,需要1.6G的带宽。。。

如果是无差别的实时广播所有在线用户,2000人的聊天室每秒一次的用户登录/退出就轻松把带宽耗光了。

**结论**
所以只给当前用户发送所有的在线用户列表,其他已经在线的用户只需要更新那一个上线的用户数据。
这就是为什么要分别发送。
更多...