153  
查询码:00001025
nodejs一个函数实现消息队列中间件
来源:https://blog.csdn.net/luoc83/article/details/79278933?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3
作者: 朱凡 于 2020年04月18日 发布在分类 / FM组 / FM_App 下,并于 2020年04月18日 编辑
消息 阅读 阅读数 读数 队列 nodejs 中间 中间件 来自 rocketmq

nodejs一个函数实现消息队列中间件


消息队列中间件(Message Queue)相信大家不会陌生,如Kafka、RabbitMQ、RocketMQ等,已经非常成熟,在大大小小的公司和项目中也已经广泛使用。

有些项目中,如果是只使用初步的消息队列功能(比如少量客户端和简单的消息中转),对于追求“简洁美”的程序猿、攻城狮们,实在不愿意部署、维护一个消息队列中间件,那么就自己动手吧,编写几十行代码,嵌入到现有的模块,消息队列功能就能正常运转起来,是不是很有成就感呢?

下面我抛砖引玉,使用nodejs+UDP实现一个简单的消息队列。你可以用C++、JAVA、C#等其它语言,UDP也可以换成TCP、web api等。当然,如果在正式项目中使用,还得完善逻辑、添加异常处理。

*******************************udpmq.js*****************************

const udpClient = require( 'dgram' ).createSocket( 'udp4' );

var clients= {};

udpClient.on( 'message' , (message, socket) => {

var repMsg= "" ;

var msgObj= JSON.parse(message.toString());

if (msgObj[ "id" ] != null ) {

if (clients[msgObj[ "id" ]] != null &&clients[msgObj[ "id" ]].length> 0) {

repMsg = clients[msgObj[ "id" ]].shift();

}

}

else {

var from =msgObj[ "from" ];

var to =msgObj[ "to" ];

var msg =msgObj[ "msg" ];

if (clients[to] == null ) {

clients[to] = new Array();

}

clients[to].push(message.toString());

repMsg = "1" ;

}

var buf = new Buffer(repMsg);

udpClient.send(buf, 0, buf.length, socket.port, socket.address);

});

udpClient.bind(5555);


************************************************************

测试步骤:

1)       启动服务: node udpmq.js

2)       打开两个UDP测试工具,如下图。左边是发送消息(json格式),客户端 “aa”发送给”bb”,

右图是接收消息,客户端”bb”发送自己的id给消息队列服务,服务查找“bb”的消息数组,并按FIFO的方式返回“bb”一条消息。



 推荐知识

 历史版本

修改日期 修改人 备注
2020-04-18 13:27:46[当前版本] 朱凡 创建版本

 附件

附件类型

GIFGIF

知识分享平台 -V 4.8.7 -wcp