大佬教程收集整理的这篇文章主要介绍了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,请注明来意。