Pomelo 新手计划(四) Nodejs版

Pomelo 新手计划(四) Nodejs版

##前言## 今天我们介绍一下Channel 广播机制和RPC 的使用。 <!–more–>

##Channel## 对于一个游戏服务器,而言,把消息推送给玩家,这是一个很基础的功能,在pomelo 里面用Channel 进行消息的推送服务,要进行消息的推送,Channel提供了两种方式:

  • 匿名Channel
  • 具名Channel

###匿名Channel### 什么是匿名Channel?匿名Channel就是直接使用channelService进行消息推送,在api 中提供了两种方式

这种是指定用户Session 里面的绑定的UID(session.bind(uid);)推送到那个session uid 的方式有四个参数

  • route String type
  • msg Object type
  • uids Array Type

[{uid: userId, sid: frontendServerId}] 主要数组里面每个对象的属性

  • cb - cb(err) 错误的回调 例子:
var uidArray = new Array();
uidObject.uid = "session uid";
uidObject.sid = "connector-server-1";
uidArray.push(uidObject);

channelService.pushMessageByUids(‘onMsg’,{msg:msg},uidArray,function(err){ if(err){ console.log(err); return; } });

第二种就是把消息广播到所有连接在frontend 服务器的客户端.

  • stype String type

指定我们需要广播的frontend 类型,注意这里不是frontend id 而是类型,例如connector 如果你配了多台服务器,消息会广播到所有连接在这种类型frontend的客户端上。

  • route String type

如 ‘onMsg’

  • msg Object type
  • opts Object type

自0.4.x 的配置只有一个参数 opts.binded Boolean type true 根据session 的uid 进行广播,false 根据session的id 进行广播

  • cb
channelService.broadcast('connector' ,'onMsg', msg, {binded: true}, function(err){
       if(err){
           console.log(err);
       }
    });

###具名Channel### 具名Channel 就是我们在pomelo 创建一个推送房间。用于维护需要长期订阅关系的业务,例如,聊天的频道,注意使用具名Channel 如果那个Channel不在使用,需要显式调用销毁接口。

例子:

 //创建Channel
var channelName = 'allPushChannel';
var channel = this.channelService.getChannel
//把用户添加到channel 里面
if(!!channel){
        channel.add(uid, sid);
}
 //根据Channel 名字推送消息
    var channelName = 'allPushChannel';
    var pushChannel = this.channelService.getChannel(channelName, false);
pushChannel.pushMessage('onMsg',{msg: msg}, function(err){
    if(err){
        console.log(err);
    }else{
        console.log('push ok');
    }
});

以上就是pomelo 有关推送的全部内容,用pomelo进行消息的推送就是这么简单!

##RPC使用## 从pomelo 框架图里面我们可以知道,pomelo 是一个多进程相互协作的环境。关于这方面的pomelo是如何实现的可以阅读官方的Pomelo Framework

这里不再对pomelo如何实现rpc 进行描述,针对原文档的一些不清晰的地方进行补充。

如何使用rpc 服务,让frontend 能够调用backend 的方法?

要实现这个目的很简单。 根据Pomelo 的相关阅读。首先在handler 同级目录下创建一个remote目录,创建一个backendRemote文件(具体可以参考分布式聊天的例子)

值得注意的是,我们调用远程方法的时候,第一个参数需要是Session值。

//远程服务端
backend.kick = function(uid, sid){

}

//调用远程服务的时候,我们要需要从app 获得rpc服务 var rpc = app.rpc;

//代理端的完整写法 rpc.frontend.kick = function(session, uid, sid){

}

以上就是pomelo 多进程相互协作的使用方式

也欢迎到我的博客上面阅读。。。 http://blog.gfdsa.net/2013/06/06/pomelo_study_four/


2 回复

Pomelo 新手计划(四) Nodejs版

前言

今天我们介绍一下Channel 广播机制和RPC 的使用。


Channel

对于一个游戏服务器而言,把消息推送给玩家是一个很基础的功能。在pomelo 里面,用Channel 进行消息的推送服务。Channel 提供了两种方式:

匿名Channel

匿名Channel 就是直接使用channelService 进行消息推送。在API 中提供了两种方式:

指定用户Session 的绑定的UID

这种方式可以指定推送到某个用户的Session UID。具体参数如下:

  • route (String): 路由名称
  • msg (Object): 需要发送的消息
  • uids (Array): 用户ID数组
  • cb (Function): 回调函数

示例代码:

var uidArray = new Array();
var uidObject = {};
uidObject.uid = "session uid";
uidObject.sid = "connector-server-1";
uidArray.push(uidObject);

channelService.pushMessageByUids('onMsg', {msg: msg}, uidArray, function(err) {
    if (err) {
        console.log(err);
        return;
    }
});
广播到所有连接在frontend 服务器的客户端

这种方式可以将消息广播到所有连接在指定类型的frontend 服务器上的客户端。具体参数如下:

  • stype (String): frontend 类型
  • route (String): 路由名称
  • msg (Object): 需要发送的消息
  • opts (Object): 选项对象
  • cb (Function): 回调函数

示例代码:

channelService.broadcast('connector', 'onMsg', msg, {binded: true}, function(err) {
    if (err) {
        console.log(err);
    }
});

具名Channel

具名Channel 用于维护需要长期订阅关系的业务,例如聊天频道。使用具名Channel 需要在不使用时显式调用销毁接口。

示例代码:

// 创建Channel
var channelName = 'allPushChannel';
var channel = this.channelService.getChannel(channelName, false);

// 把用户添加到Channel 里面
if (!!channel) {
    channel.add(uid, sid);
}

// 根据Channel 名字推送消息
var channelName = 'allPushChannel';
var pushChannel = this.channelService.getChannel(channelName, false);

pushChannel.pushMessage('onMsg', {msg: msg}, function(err) {
    if (err) {
        console.log(err);
    } else {
        console.log('push ok');
    }
});

RPC 使用

在pomelo 框架中,通过RPC 实现多个进程之间的协作。要实现前端调用后端的方法,可以按以下步骤操作:

  1. 在handler 同级目录下创建一个remote 目录,并创建一个backendRemote.js 文件。

  2. 定义远程方法,例如:

    // 远程服务端
    backend.kick = function(uid, sid) {
        // 处理逻辑
    }
    
  3. 在调用远程方法时,需要从app 获取rpc 服务:

    var rpc = app.get('rpc');
    
    // 代理端的完整写法
    rpc.frontend.kick = function(session, uid, sid) {
        // 调用远程方法
    }
    

以上就是pomelo 中Channel 广播机制和RPC 使用的介绍。希望这些示例代码能够帮助你更好地理解和使用pomelo 框架。


Pomelo 新手计划(四) Nodejs版

Channel

在Pomelo中,Channel 提供了一种便捷的方式来将消息推送给客户端。它支持两种类型的Channel:匿名Channel具名Channel

匿名Channel

匿名Channel允许你通过指定用户ID或前端服务器类型来发送消息。

通过用户ID发送消息
var uidArray = [];
var uidObject = {
    uid: "session uid",
    sid: "connector-server-1"
};
uidArray.push(uidObject);

channelService.pushMessageByUids('onMsg', {msg: 'Hello, user!'}, uidArray, function(err) {
    if (err) {
        console.error(err);
    } else {
        console.log('Message sent successfully.');
    }
});
广播到特定前端类型
channelService.broadcast('connector', 'onMsg', {msg: 'Broadcast message to all connectors.'}, {binded: true}, function(err) {
    if (err) {
        console.error(err);
    } else {
        console.log('Broadcast message sent successfully.');
    }
});

具名Channel

具名Channel允许你创建一个持久化的Channel,可以用来维护长期的订阅关系。

创建并使用具名Channel
var channelName = 'chatRoom';
var channel = channelService.getChannel(channelName, true);

if (channel) {
    channel.add('user1', 'connector-server-1');
    channel.pushMessage('onMsg', {msg: 'Welcome to chat room!'}, function(err) {
        if (err) {
            console.error(err);
        } else {
            console.log('Message pushed successfully.');
        }
    });
}

RPC 使用

Pomelo框架还支持RPC(远程过程调用),使不同服务器之间的通信变得更加方便。

定义RPC服务

remote 目录下的文件中定义你的RPC方法。

// remote/backendRemote.js
exports.kickUser = function(session, uid, sid, callback) {
    // 业务逻辑处理
    callback(null, {result: 'User kicked'});
};
调用RPC服务

在需要调用远程方法的地方获取RPC服务,并调用相应的函数。

var rpc = app.get('rpc');

// 调用后端的kickUser方法
rpc.backend.kickUser(session, 'user1', 'connector-server-1', function(err, result) {
    if (err) {
        console.error(err);
    } else {
        console.log(result.result);
    }
});

以上就是Pomelo中Channel和RPC的基本使用方法。通过这些工具,你可以更灵活地管理消息的推送和服务间的调用。

回到顶部