新聞中心
前言

贛州網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
實際上,個人感覺,pomelo 目前提供的兩個默認sioconnector和hybridconnector 使用的協(xié)議并不適合用于做手機推送平臺,在pomelo的一份公開ppt里面,有提到過,網(wǎng)易的消息推送平臺是基于pomelo開發(fā)的 (一個frontend 支持30w 長連接,消耗了3g 內(nèi)存,如果我沒記錯數(shù)據(jù)應(yīng)該是這樣),不過,這里用的前端(frontend)實現(xiàn)的是基于MQTT協(xié)議,我估計這個基于MQTT協(xié)議實現(xiàn)的 frontend,基本不可能開源出來。這里只是說,默認提供的frontend不適合用于構(gòu)建大型的推送平臺(c10m規(guī)模的),一般而言(c10k級別的),個人感覺還是夠用的。
為了展示,更多pomelo 的相關(guān)特性,可能這里的邏輯業(yè)務(wù),與實際有所不同.敬請注意。
推送平臺的架構(gòu)圖
整個應(yīng)用的架構(gòu)圖:
后端
前端
- android
- web browser
開發(fā)約定
客戶端請求對象
- {
- "role": "client/server",
- "apikey": "String",
- "clientId": "String"
- }
服務(wù)端返回對象
發(fā)給web management
- {
- "code": "Int httpCode ex: 200",
- "msg": "String",
- "users": "Array 客戶端的clientId 值 ex:["android1"] "
- }
發(fā)給android客戶端
- {
- "code": "Int httpCode ex: 200",
- "msg": "String"
- }
客戶端訪問用的route
android:
connector route = sio-connector.entryHandler.enter, 用于把當前客戶端加入到推送頻道當中
WebManagement:
connector route = hybrid-connector.entryHandler.enter,用于連接服務(wù)器.
backend route = pushserver.pushHandler.pushAll, 把消息推送到所有已連接的客戶端.
后臺編碼
Pomelo 有個特點,就是約定開發(fā),很多地方是約定好的配置,優(yōu)點是,架構(gòu)清晰,可讀性好,缺點是,需要大量的文檔支持,目前而言,pomelo的官方文檔做的不好的地方就是,雖然文檔都有了,但是太零散了,分類不清楚,還有就是文檔沒跟上開發(fā),有時候,你不閱讀里面源碼根本不知道這個api要傳那些參數(shù).
sioconnector / hybridconnector
由于pomelo 0.3 以后新增了一個新的connector:hybridconnector,支持socket和websocket,使用二進制通訊協(xié)議,但是除了,網(wǎng)頁 js版本和c 客戶端實現(xiàn)了這個connector,其他客戶端均還沒實現(xiàn),所以,我們還需要一個兼容android 客戶端的connector: siocnnector,關(guān)于兩個connector 具體比較,以后有空重寫這篇的時候,暫時,你只要知道,這個兩個connector,一個基于socket.io,一個基于socket和websocket 即可.
app.js由于我們用到了兩個不同的connector,所以要在app.js寫上:
- // 支持 socket.io
- app.configure('production|development', 'sio-connector', function(){
- app.set('connectorConfig',
- {
- connector : pomelo.connectors.sioconnector
- });
- });
- //支持 websocket 和 socket
- app.configure('production|development', 'hybrid-connector', function(){
- app.set('connectorConfig',
- {
- connector : pomelo.connectors.hybridconnector,
- heartbeat : 300,
- useDict: true,
- useProtobuf: true
- });
- });
經(jīng)過這樣的配置,我們就能夠使用兩個不同的connector了.
推送實現(xiàn)
用pomelo 進行消息的推送,非常便捷,由于,我們現(xiàn)在只關(guān)注推消息給全部客戶端,那樣就非常簡單了.
推送流程:
- 根據(jù)uuid 把 android 客戶端添加到各自的推送頻道當中.
- web 端根據(jù)uuid 把消息推送的全部在線的客戶端.
為了教學的方便,這里的uuid 硬編碼為: xxx-xx--xx-xx
把客戶端添加到相應(yīng)的channel
- //把客戶端添加到推送列表中
- PushRemote.prototype.add = function(uid, role, sid, channelName, cb){
- var channel = this.channelService.getChannel(channelName, true);
- if(role === 'server'){
- //web 服務(wù)端直接返回用戶列表
- cb(null ,this.getUsers(channelName));
- }else {
- if(!!channel){
- channel.add(uid ,sid);
- }
- //uuid 告訴給服務(wù)端onAdd 事件
- // [{uid: userId, sid: frontendServerId}]
- var server = [{uid: channelName, sid: sid}];
- this.channelService.pushMessageByUids('onAdd', {msg: "add ok", users:this.getUsers(channelName)},server, function(err){
- if(err){
- console.log(err);
- return;
- }
- });
- }
- };
Frontend 利用rpc 調(diào)用pushserver 添加客戶端到相應(yīng)頻道的方法.
- //sid 統(tǒng)一為web managment 所在的 frontend server.
- this.app.rpc.pushserver.pushRemote.add(session, uid,role, 'connector-server-client', uuid, function(err, users){
- if(err){
- console.log(err);
- return;
- }
- if(users){
- next(null, {code: 200, msg: 'push server is ok.', users: users});
- }else{
- next(null,{code: 200, msg: "add ok", users: users});
- }
- });
web 管理端調(diào)用消息推送
- Handler.prototype.pushAll = function(msg, session, next){
- var pushMsg = this.channelService.getChannel(msg.apikey, false);
- pushMsg.pushMessage('onMsg',{msg: msg.msg}, function(err){
- if(err){
- console.log(err);
- } else{
- console.log('push ok');
- next(null, {code: 200, msg: 'push is ok.'});
- }
- });
- };
以上就是主要客戶端如何加入到推送隊列的代碼,以及web 管理端進行消息推送的主要代碼,是不是很簡單! 完整代碼可以參閱我的github https://github.com/youxiachai
有一點要注意的,如果pomelo 項目要部署到外網(wǎng)或者局域網(wǎng),frontend 的host 要填寫當前host 主機的ip 地址
例如:
- "connector": [
- {"id": "connector-server-1", "host": "127.0.0.1", "port": 3150, "clientPort": 3010, "frontend": true}
- ]
部署到某臺服務(wù)器,需要修改
- "connector": [
- {"id": "connector-server-1", "host": "192.168.1.107", "port": 3150, "clientPort": 3010, "frontend": true}
- ]
客戶端訪問相應(yīng)的host 的地址.
客戶端和服務(wù)端的github 地址: https://github.com/youxiachai/pomelo-pushServer-Demo
文章名稱:用Pomelo搭建一個簡易的推送平臺
文章源于:http://m.fisionsoft.com.cn/article/cogosee.html


咨詢
建站咨詢
