rabbitmq实际解决文案(实例)——测试代码基于node.js

本文档分享了一种使用rabbitmq在实际项目中解决状态同步问题的方案。通过用户权限分配实现读写分离,并使用node.js进行测试。在系统D中,根据不同的状态,向不同系统发送数据更新。重点介绍了exchange、routing key和queue的关系,以及权限配置和测试代码。
摘要由CSDN通过智能技术生成

写这篇文章是因为发现关于rabbitmq的文章都比较一致, 讲的问题好像都差不多, 原理也讲了很多, 关键字我也会背了, 但在我真正的项目中, 我还是不知道怎么用是最正确的, 经过一段时间的理解测试,对自己当前现有的系统的需求给出了相应的解决文案,拿来分享一些,希望得到高人的指点。

关于mq的原理网上很多文章, 这里不缀述, 我也不会有别述得好

关于读写分离,我使用用户权限分配,具体请参照 rabbitmq关于权限配置的实例及node.js测试代码——非指令介绍

项目场景:

      1、当前系统D(服务)对数据有一个状态流程控制, 总共差不多有20个状态流转

      2、当到某个状态时,需要向指定的某几个系统(服务)更新数据。比如状态N时需要向AB三个系统发当前的数据信息, 到达状态M时需要向AC两个系统发当前的数据信息,状态K时,没有任何系统需要这个状态下的数据信息。

在我的项目里关于rabbitmq需要理解的几个关键点
      1、exchange、routing key、queue的相关概念(相关解释网上大把)

      2、routing key与queque的关系为多对多

      3、没有绑定queue的routingkey的消息会自动丢掉

最后的设计说明图:D系统数据变化通知 rabitmq相关说明

用户权限分配:

    结生产者分配写权限, 给消费者分配读权限。

    具体分配方式参照: rabbitmq关于权限配置的实例及node.js测试代码——非指令介绍

 

测试语言和库选择:

     使用node.js的amqp

     npm install rabbitmq --save

     npm install amqp --save

 

生产者代码:

let amqp = require("amqp");
let connection = amqp.createConnection({url:"amqp://producer:producer123@10.0.1.27:5672/test"});
connection.on('error', function(err){
    console.log("error:", err);
})

connection.on('ready', function(){
    console.log("ready");
    connection.exchange("damqexchange", {type:"topic",  autoDelete:false, durable:true, confirm:true}, function(exchange){
        console.log(" create exchange success")
        
        connection.queue("damqqueueA", {durable:true, autoDelete:false},function(queue){            
            queue.bind("damqexchange", "dstatus.ms1.ss104.ptidA.*");
            connection.queue("damqqueueB", {durable:true, autoDelete:false},function(queue){
                queue.bind("damqexchange", "dstatus.ms1.*.*.*");
                exchange.publish("dstatus.ms1.ss104.ptidA.pc2", "test message5",{mandatory:true}, function(err){//damqqueueB和damqqueueA都能收到
                    console.log(err);
                })
                exchange.publish("dstatus.ms1.ss104.ptidC.pc2", "test message5",{mandatory:true}, function(err){//只有damqqueueB能收到
                    console.log(err);
                })
            })            
        })       
       
    })
})

执行预测:damqqueueA应该有一条消息,damqqueueB应该有两条消息

执行结果:

 

消费者代码:

let amqp = require("amqp");
let connection = amqp.createConnection({url:"amqp://consumer:consumer123@10.0.1.27:5672/test"});
connection.on('ready', function(){
    let que = connection.queue("damqqueueA", {durable:true, autoDelete:false},function(queue){
        
        queue.subscribe(function(message, header, deliveryInfo){
            console.log(message.data.toString());
        })
    }) 
})    

结果:

会发现damqqueueA列队的消息已经被拿 走了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值