美文网首页
rabbitMQ+protocol buffers传送消息

rabbitMQ+protocol buffers传送消息

作者: kangkangz4 | 来源:发表于2017-05-18 15:24 被阅读145次

    前面一篇文章写的是rabbitMQ+thrift传送消息,这里我也写一下用pb来传送消息的方法吧
    首先我们定义一个demo.user.proto文件

    package com.kang;
    
        message user{
            required string userId = 1;
            optional string nick = 2;
            optional string avator = 3;
        }
    

    很多人想着接下来就是用pb命令来生成desc了,但我们用的protocol-buffers是不需要生成desc文件的,直接就可以拿proto来用
    这里发一下send.js

    var fs = require('fs');
    var protocolBuffers = require('protocol-buffers');
    var amqp = require('amqplib/callback_api');
    
    var AMPQ_URI = 'amqp://localhost:5672';
    
    var Schema = protocolBuffers(fs.readFileSync('./demo.user.proto'));
    
    amqp.connect(AMPQ_URI, function(err, conn){
        conn.createChannel(function(err, ch){
            var q = 'hello';
    
            var obj = {
                userId: '0001',
                nick: 'helloworld',
                avator: 'pic1'
            }
            var buf = Schema.user.encode(obj);
    
            ch.assertQueue(q, {durable: false});
            ch.sendToQueue(q, buf);
            console.log(" [x] Send Data Finish");
        });
        setTimeout(function(){
            conn.close();
            process.exit(0);
        }, 500);
    })
    

    这里重要点介绍这个Schema,Schema里是会直接处理proto文件的,所以我们只要直接用Schema就可以了,太方便了。
    再发一个receive.js

    var fs = require('fs');
    var protocolBuffers = require('protocol-buffers');
    var amqp = require('amqplib/callback_api');
    
    var Schema = protocolBuffers(fs.readFileSync('./demo.user.proto'));
    
    var AMQP_URI = 'amqp://localhost:5672';
    
    amqp.connect(AMQP_URI, function(err, conn){
        conn.createChannel(function(err, ch){
            var q = 'hello';
    
            ch.assertQueue(q, {durable: false});
            console.log('[*] Waiting for message in %s. To exit press CTRL+C', q);
            ch.consume(q, function(msg){
                // console.log(msg);
                var obj = Schema.user.decode(msg.content);
                console.log(obj);
                console.log('[x] Received Data Finish');
            }, {noAck: true});
        })
    })
    

    也是运行

    node send.js
    

    再开个窗口运行

    node receive.js
    

    效果跟前面的rabbitmq+thrift的是一样的,这里我们介绍了两种将对象生成buf的方法,个人建议还是用pb来传送消息,毕竟这种方法太方便了,当然你也可以用json生成buffer来扔给rabbitMQ,但数据量大的话,每个消息压缩一点,累积起来还是很可观的。好了,就写到这里。

    相关文章

      网友评论

          本文标题:rabbitMQ+protocol buffers传送消息

          本文链接:https://www.haomeiwen.com/subject/kxmsxxtx.html