写这篇文章是因为发现关于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的消息会自动丢掉
最后的设计说明图:
用户权限分配:
结生产者分配写权限, 给消费者分配读权限。
具体分配方式参照: 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列队的消息已经被拿 走了