成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

node.js中TCPSocket多進(jìn)程間的消息推送示例詳解-創(chuàng)新互聯(lián)

前言

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)普蘭免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了數(shù)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

前段時(shí)間接到了一個(gè)支付中轉(zhuǎn)服務(wù)的需求,即支付數(shù)據(jù)通過(guò)http接口傳到中轉(zhuǎn)服務(wù)器,中轉(zhuǎn)服務(wù)器將支付數(shù)據(jù)發(fā)送到異構(gòu)后臺(tái)(Lua)的指定tcp socket。

一開(kāi)始評(píng)估的時(shí)候感覺(jué)蠻簡(jiǎn)單的,就是http server和tcp server間的通信,不是一個(gè)Event實(shí)例就能解決的狀態(tài)管理問(wèn)題嗎?注冊(cè)一個(gè)事件A用于消息傳遞,在socket連接時(shí)注冊(cè)唯一的ID,然后在http接收到數(shù)據(jù)時(shí),emit事件A;在監(jiān)聽(tīng)到事件A時(shí),在tcp server中尋找指定ID對(duì)應(yīng)的socket處理該數(shù)據(jù)即可。

盡管node.js在高并發(fā)方面有不錯(cuò)的性能,但是單個(gè)tcp server實(shí)例的承載能力有限,為避免服務(wù)器過(guò)載,node.js 單進(jìn)程的內(nèi)存有上限(默認(rèn)2G),能容納的長(zhǎng)連接客戶端數(shù)不多。但隨著業(yè)務(wù)的擴(kuò)大,我們需要考慮多機(jī)集群部署,客戶端可以連接到任一節(jié)點(diǎn),并發(fā)送消息。如何做到多節(jié)點(diǎn)的同時(shí)推送,我們需要建立一套多節(jié)點(diǎn)之間的消息分發(fā)/訂閱架構(gòu)。常用的第三方消息管理庫(kù)有 RabbitMQ和Redis等。在這里,我用的是Redis的訂閱發(fā)布服務(wù)。

redis.io有一個(gè)比較成熟的redis消息中轉(zhuǎn)庫(kù)socket.io-redis (本地下載)。但我們項(xiàng)目中異構(gòu)后臺(tái)用到的并非websocket,而是原生的TCP原生的Socket。用原生redis的sub/pubs實(shí)現(xiàn)并不難,就手寫了。

redis在該項(xiàng)目中主要起到一個(gè)消息分發(fā)中心(publish/subscribe)的作用。當(dāng)http請(qǐng)求的支付數(shù)據(jù)發(fā)送過(guò)來(lái)時(shí),則通過(guò)redis的publish功能往所有的channel推送消息,這樣所有訂閱該channel的socket server就能收到回調(diào),然后推送到指定客戶端。在應(yīng)用層看跟Event事件消息的處理差不多。

const redis = require("redis"),
 redisClient = redis.createClient,
 REDIS_CFG = {
  host: '127.0.0.1',
  port: 6379
 },
 sub = redisClient(REDIS_CFG),
 pub = redisClient(REDIS_CFG),
 PAY_MQ_CHANNEL = 'pay_mq_channel';

// 監(jiān)聽(tīng)頻道的消息回調(diào)
sub.on('message', function(channel, message) {
 switch (channle){
  case PAY_MQ_CHANNEL:
   console.log('notification received:', message);

   // 廣播消息到指定socket

   break;
 }
});
// 訂閱頻道
sub.subscribe(PAY_MQ_CHANNEL);

// 當(dāng)接收到支付數(shù)據(jù)時(shí),推送頻道消息
pub.publish(PAY_MQ_CHANNEL, {id: '01', msg: `hello ${PAY_MQ_CHANNEL}!`});

當(dāng)前名稱:node.js中TCPSocket多進(jìn)程間的消息推送示例詳解-創(chuàng)新互聯(lián)
路徑分享:http://jinyejixie.com/article36/dijisg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、ChatGPT網(wǎng)站營(yíng)銷、網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司
宣恩县| 霍山县| 新巴尔虎左旗| 沈丘县| 济源市| 罗江县| 清远市| 屯昌县| 清远市| 鄂尔多斯市| 兴仁县| 孟州市| 黑山县| 大关县| 通化市| 莱芜市| 徐汇区| 安远县| 阿拉尔市| 龙泉市| 锦屏县| 鞍山市| 民权县| 邢台市| 江西省| 惠来县| 三原县| 建昌县| 获嘉县| 嵩明县| 镇远县| 通道| 牙克石市| 信丰县| 渝北区| 光泽县| 绥宁县| 当涂县| 盱眙县| 廊坊市| 华坪县|