-
Notifications
You must be signed in to change notification settings - Fork 1
Home
包子 edited this page Sep 10, 2019
·
16 revisions
推送中心的目标是为了满足全公司的后端推送业务的,从功能上需要满足多个项目同时接入,同时项目与项目之间数据要完全隔离,不能电商项目的广播消息被理财项目给接收到了。为了说明推送中心的功能需要,请看下图。
- 推送中心要支持支持广播,组播,单播接口。例如电商项目可以支持给所有客户端发送消息(
广播),也可以指定给所有地点为上海的客户端发送消息(多播),也可以指定给用户1发送消息(单播)。 - 推送中心要有鉴权功能,客户端连接推送中心时推送中心要能校验客户端是否合法。
- 推送中心要灵活管理连接,实时查看客户端连接情况,主动断开与某个客户端的连接等功能。
- 推送中心要有黑白名单功能,能防御恶意连接,能防御DDOS攻击。
- 推送中心要高可用,支持高并发连接。
SocketIO模型规定,一个服务端维护多个namespace,每个namespace有多个多个room,客户端连接是在room下的,一个客户端连接可以所属多个room,但只能所属一个namespace。客户端在创建链接时namespace确定,以后不能修改,但可以很灵活的加入或者离开room。
根据上述SocketIO的抽象模型,一个连接只能属于一个namespace,可以利用namespace很容易的做到项目隔离。客户端创建链接时传入projectId,netty-socketio会自动维护好该连接所属项目。
var url = 'http://localhost:9095/' + projectId;
socket = io.connect(url, { forceNew: true })根据上述SocketIO的抽象模型,客户端可以所属一个或多个room,而且可以很灵活的加入或离开room。所谓实现多播,就是给一个room下的所有客户端发送消息。而实现单播需要业务方定义一个和客户端唯一的room,比如客户端id。socket.io.java.server.biz把加入room定义为订阅。
socket.io.java.server.biz约定在建立后连接,鉴权成功后才接受订阅消息。你可以用如下代码给客户端订阅不同的主题(实际则是加入到不同的room中)。
var _subscribes = [$("#topic_1").val(), $("#topic_2").val()];
var _authData = {projectId: projectId, token: token};
socket.on('connect', function () {
// 2. 认证
socket.emit('auth', _authData, function (authCode) {
console.log("auth ack code:" + authCode);
// 1.1 认证成功发起订阅
if (authCode === 'auth_success') {
socket.emit('subscribe', _subscribes, function (subscribeCode) {
console.info('sub ack code:' + subscribeCode);
if (subscribeCode === "sub_success") {
setConnected(true);
} else {
disconnect();
}
});
} else {
// 1.2 认证失败关闭连接
disconnect();
}
});
});
