Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js中TCP Socket多进程间的消息推送示例详解大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

前段时间接到了一个支付中转服务的需求,即支付数据通过http接口传到中转服务器,中转服务器将支付数据发送到异构后台(Lua)的指定tcp socket。

一开始评估的时候感觉蛮简单的,就是http server和tcp server间的通信,不是一个Event实例就能解决的状态管理问题吗?注册一个事件A用于消息传递,在socket连接时注册唯一的ID,然后在http接收到数据时,emit事件A;在监听到事件A时,在tcp server中寻找指定ID对应的socket处理该数据即可。

尽管node.js在高并发方面有不错的性能,但是单个tcp server实例的承载能力有限,为避免服务器过载,node.js 单进程的内存有上限(认2G),能容纳的长连接客户端数不多。但随着业务的扩大,我们需要虑多机集群部署,客户端可以连接到任一节点,并发送消息。如何做到多节点的同时推送,我们需要建立一套多节点之间的消息分发/订阅架构。常用的第三方消息管理库有 RabbitMQ和redis等。在这里,我用的是redis订阅发布服务。

redis.io有一个比较成熟的redis消息中转库)。但我们项目中异构后台用到的并非websocket,而是原生的TCP原生的Socket。用原生redis的sub/pubs实现并不难,就手写了。

redis在该项目中主要起到一个消息分发中心(publish/subscribE)的作用。当http请求的支付数据发送过来时,则通过redis的publish功能往所有的chAnnel推送消息,这样所有订阅该chAnnel的socket server就能收到回调,然后推送到指定客户端。在应用层看跟Event事件消息的处理差不多。

// 监听频道的消息回调
sub.on('message',function(chAnnel,messagE) {
switch (chAnnlE){
case PAY_MQ_CHAnnEL:
console.log('notification received:',messagE);

// 广播消息到指定socket

break;
}
});
// 订阅频道
sub.subscribe(PAY_MQ_CHAnnEL);

// 当接收到支付数据时,推送频道消息
pub.publish(PAY_MQ_CHAnnEL,{id: '01',msg: Hello ${PAY_MQ_CHAnnEL}!});

大佬总结

以上是大佬教程为你收集整理的node.js中TCP Socket多进程间的消息推送示例详解全部内容,希望文章能够帮你解决node.js中TCP Socket多进程间的消息推送示例详解所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。