程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> 構建基於redis+gearman+nodejs 的消息推送系統

構建基於redis+gearman+nodejs 的消息推送系統

編輯:PHP基礎知識
  系統的核心服務為優惠券獲取、預訂業務(酒店、機票等)。服務供應商有大型運營商、實體企業。隨著PC、各種終端的湧現,人們對消息的即時性要求越來越高,同時也要求我們的運維第一時間能更好服務運營商、實體企業。這就要求我們的信息推送是多方的、快速的、有效的。 系統定位在: 
構建基於事件的消息推送系統  系統定位在:

構建基於事件的消息推送系統

事件分為: 優惠券、預訂業務 系統業務場景 1 客服通過基於開源sphinx搭建的搜索系統
2 查找優惠券或進行預訂業務
3 通過某銀行系統獲取唯一訂單號
4 各種通道通知消費者
5 HDFS存儲電話、咨詢等日志
6 spark 運營商數據分析,報表統計(基於HDFS) sj1001 (1) 簡要代碼實現

1 搭建GearmanWork 異步通知銀行系統生成唯一訂單號

  
#PHP#!/usr/local/php/bin/php -q
addServer("127.0.0.1",4730);
$worker->addFunction("xdAction", "xdAction_fn");while (1){
    $ret = $worker->work();
    if ($worker->returnCode() != GEARMAN_SUCCESS)
    {
        break;
    }}function xdAction_fn($a){
    $devAuth = array(
                   'appID:100132695302118',
                   'APPKEY:22713038b5ddb849a6f9853e18b3dfd3'
               );

    $rw=unserialize($a->workload());
    echo $json = kerHttpRest::connect( 'http://xxxxx')
                 ->header($devAuth)
                 ->post($rw);
    $row = json_decode($json);

    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $lname = 'xdQueue'; //下單隊列
    $arra = array(
                'accessid' => 'xxxxxxxxxxxxx'
            );
    $redis->lpush($lname, json_encode($arra));}#PHP

2 程序端調用GearmanWork

#PHP
addServer("127.0.0.1");
$newarray=serialize(array('platformid'=>'KLB00001','order_mobile'=>'130XXXXXXXX'));
$client->doBackground("xdAction",$newarray,md5(time()));#/PHP

3 nodejs非阻塞調用redis的信息 推送到client

...var redis = require("redis"),
            client = redis.createClient(6379,'127.0.0.1');
client.on("error", function (err){
    console.log("Error " + err);});
setInterval(function(){

    client.rpop("xdQueue",function (err,value)
    {

        if(value!=null)
        {
            console.log(" " + ": " + value);
            io.sockets.emit("neworder",value);
        }
    });};},1000);...

4 客戶端連接node服務 等待推送數據

var socket = io.connect('http://127.0.0.1:1337');
socket.emit('login', {'socketId':"xxxxx", mobile:"xxxxxx",accessid: "96e79218965eb72c92a549dd5a330112"});
socket.on('neworder', function (data){
var rw = eval('('+data+')');
$('.booking_order_count').show();
var v=$('.booking_order_count').html();
$('.booking_order_count').html(parseInt(v)+1);
console.log(rw.accessid);});
 

附件:
[安裝 gearmand]

rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/epel-release-6-5.noarch.rpm
yum install -y gearmand
yum install -y libgearman-devel.x86_64
yum install -y re2c

[安裝 gearman PHP擴展]

wget wget http://pecl.php.net/get/gearman-1.1.2.tgz/software/php/bin/phpize
./configure --with-php-config=/alidata1/software/php/bin/php-config 
make 
make install

[安裝node redis]

npm install redis

[安裝 node forever] 用於node 進程的托管

npm install -g forever

0718_1

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved