├── README.md ├── 消息队列文章 ├── topic.jpg ├── 消费者执行.png ├── xianbai.png ├── 消息队列可视化.png ├── direct类型交换机.png ├── fanout类型交换机.png ├── topic类型交换机.png ├── 不同类型交换机要做的事.png ├── 消息队列应用秒杀订单图.png ├── 运行生产者队列显示.png ├── 多次运行生产者有消息堆积.png ├── 消费者直接运行一个交换机不对应的队列.png └── 消息队列HelloWorld流程图 (1).drawio ├── .gitignore ├── consumer.js ├── producter.js └── exchange ├── fanout ├── fanoutProducter.js └── fanoutConsumer.js ├── direct ├── directProducter.js └── directConsumer.js └── topic ├── topicConsumer.js └── topicProducter.js /README.md: -------------------------------------------------------------------------------- 1 | # simple_rabbitmq 2 | 消息队列 3 | -------------------------------------------------------------------------------- /消息队列文章/topic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/topic.jpg -------------------------------------------------------------------------------- /消息队列文章/消费者执行.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/消费者执行.png -------------------------------------------------------------------------------- /消息队列文章/xianbai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/xianbai.png -------------------------------------------------------------------------------- /消息队列文章/消息队列可视化.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/消息队列可视化.png -------------------------------------------------------------------------------- /消息队列文章/direct类型交换机.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/direct类型交换机.png -------------------------------------------------------------------------------- /消息队列文章/fanout类型交换机.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/fanout类型交换机.png -------------------------------------------------------------------------------- /消息队列文章/topic类型交换机.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/topic类型交换机.png -------------------------------------------------------------------------------- /消息队列文章/不同类型交换机要做的事.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/不同类型交换机要做的事.png -------------------------------------------------------------------------------- /消息队列文章/消息队列应用秒杀订单图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/消息队列应用秒杀订单图.png -------------------------------------------------------------------------------- /消息队列文章/运行生产者队列显示.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/运行生产者队列显示.png -------------------------------------------------------------------------------- /消息队列文章/多次运行生产者有消息堆积.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/多次运行生产者有消息堆积.png -------------------------------------------------------------------------------- /消息队列文章/消费者直接运行一个交换机不对应的队列.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koala-coding/simple_rabbitmq/HEAD/消息队列文章/消费者直接运行一个交换机不对应的队列.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /consumer.js: -------------------------------------------------------------------------------- 1 | // 构建消费者 2 | const amqp = require('amqplib'); 3 | 4 | async function consumer() { 5 | // 1. 创建链接对象 6 | const connection = await amqp.connect('amqp://localhost:5672'); 7 | 8 | // 2. 获取通道 9 | const channel = await connection.createChannel(); 10 | 11 | // 3. 声明参数 12 | const queueName = 'helloKoalaQueueHaHa'; 13 | 14 | // 4. 声明队列,交换机默认为 AMQP default 15 | await channel.assertQueue(queueName); 16 | 17 | // 5. 消费 18 | await channel.consume(queueName, msg => { 19 | console.log('Consumer:', msg.content.toString()); 20 | channel.ack(msg); 21 | }); 22 | } 23 | 24 | consumer(); -------------------------------------------------------------------------------- /producter.js: -------------------------------------------------------------------------------- 1 | const amqp =require('amqplib'); 2 | 3 | async function product(params) { 4 | // 1. 创建链接对象 5 | const connection = await amqp.connect('amqp://localhost:5672'); 6 | 7 | // 2. 获取通道 8 | const channel = await connection.createChannel(); 9 | 10 | // 3. 声明参数 11 | const routingKey = 'helloKoalaQueue'; 12 | const msg = 'hello koala'; 13 | 14 | for (let i=0; i<100000; i++) { 15 | // 4. 发送消息 16 | await channel.publish('', routingKey, Buffer.from(`${msg} 第${i}条消息`)); 17 | } 18 | 19 | // 5. 关闭通道 20 | await channel.close(); 21 | // 6. 关闭连接 22 | await connect.close() 23 | } 24 | product(); -------------------------------------------------------------------------------- /exchange/fanout/fanoutProducter.js: -------------------------------------------------------------------------------- 1 | const amqp = require('amqplib'); 2 | 3 | async function producer() { 4 | // 创建链接对象 5 | const connection = await amqp.connect('amqp://localhost:5672'); 6 | 7 | // 获取通道 8 | const channel = await connection.createChannel(); 9 | 10 | // 声明参数 11 | const exchangeName = 'fanout_koala_exchange'; 12 | const routingKey = ''; 13 | const msg = 'hello koala'; 14 | 15 | // 交换机 16 | await channel.assertExchange(exchangeName, 'fanout', { 17 | durable: true, 18 | }); 19 | 20 | // 发送消息 21 | await channel.publish(exchangeName, routingKey, Buffer.from(msg)); 22 | 23 | // 关闭链接 24 | await channel.close(); 25 | await connection.close(); 26 | } 27 | 28 | producer(); -------------------------------------------------------------------------------- /exchange/direct/directProducter.js: -------------------------------------------------------------------------------- 1 | const amqp =require('amqplib'); 2 | 3 | async function product(params) { 4 | // 1. 创建链接对象 5 | const connection = await amqp.connect('amqp://localhost:5672'); 6 | 7 | // 2. 获取通道 8 | const channel = await connection.createChannel(); 9 | 10 | // 3. 声明参数 11 | const routingKey = 'helloKoalaQueue'; 12 | const msg = 'hello koala'; 13 | const exchangeName = 'direct_kaola_exchange' 14 | 15 | // 4. 声明交换机 16 | await channel.assertExchange(exchangeName, 'direct', { 17 | durable: true, 18 | }); 19 | 20 | // 5. 发送消息 21 | await channel.publish(exchangeName, routingKey, Buffer.from(msg)); 22 | 23 | // 6. 关闭通道 24 | await channel.close(); 25 | // 7. 关闭连接 26 | await connect.close() 27 | } 28 | product(); -------------------------------------------------------------------------------- /exchange/direct/directConsumer.js: -------------------------------------------------------------------------------- 1 | // 构建消费者 2 | const amqp = require('amqplib'); 3 | 4 | async function consumer() { 5 | // 1. 创建链接对象 6 | const connection = await amqp.connect('amqp://localhost:5672'); 7 | 8 | // 2. 获取通道 9 | const channel = await connection.createChannel(); 10 | 11 | // 3. 声明参数 12 | const queueName = 'direct_kaola_queue'; 13 | const routingKey = 'direct_routingKey'; 14 | const exchangeName = 'direct_kaola_exchange' 15 | 16 | // 声明一个交换机 17 | await channel.assertExchange(exchangeName, 'direct', { durable: true }); 18 | 19 | // 声明一个队列 20 | await channel.assertQueue(queueName); 21 | 22 | // 绑定关系(队列、交换机、路由键) 23 | await channel.bindQueue(queueName, exchangeName, routingKey); 24 | 25 | // 消费 26 | await channel.consume(queueName, msg => { 27 | console.log('Consumer:', msg.content.toString()); 28 | channel.ack(msg); 29 | }); 30 | } 31 | 32 | consumer(); -------------------------------------------------------------------------------- /exchange/fanout/fanoutConsumer.js: -------------------------------------------------------------------------------- 1 | const amqp = require('amqplib'); 2 | 3 | async function consumer() { 4 | // 创建链接对象 5 | const connection = await amqp.connect('amqp://localhost:5672'); 6 | 7 | // 获取通道 8 | const channel = await connection.createChannel(); 9 | 10 | // 声明参数 11 | const exchangeName = 'fanout_koala_exchange'; 12 | const queueName = 'fanout_kaola_queue'; 13 | const routingKey = ''; 14 | 15 | // 声明一个交换机 16 | await channel.assertExchange(exchangeName, 'fanout', { durable: true }); 17 | 18 | // 声明一个队列 19 | await channel.assertQueue(queueName); 20 | 21 | // 绑定关系(队列、交换机、路由键) 22 | await channel.bindQueue(queueName, exchangeName, routingKey); 23 | 24 | // 消费 25 | await channel.consume(queueName, msg => { 26 | console.log('Consumer:', msg.content.toString()); 27 | channel.ack(msg); 28 | }); 29 | 30 | console.log('消费端启动成功!'); 31 | } 32 | 33 | consumer(); -------------------------------------------------------------------------------- /exchange/topic/topicConsumer.js: -------------------------------------------------------------------------------- 1 | const amqp = require('amqplib'); 2 | 3 | async function consumer() { 4 | // 创建链接对象 5 | const connection = await amqp.connect('amqp://localhost:5672'); 6 | 7 | // 获取通道 8 | const channel = await connection.createChannel(); 9 | 10 | // 声明参数 11 | const exchangeName = 'topic_koala_exchange'; 12 | const queueName = 'topic_koala_queue'; 13 | const routingKey = 'topic_routingKey.*'; 14 | 15 | // 声明一个交换机 16 | await channel.assertExchange(exchangeName, 'topic', { durable: true }); 17 | 18 | // 声明一个队列 19 | await channel.assertQueue(queueName); 20 | 21 | // 绑定关系(队列、交换机、路由键) 22 | await channel.bindQueue(queueName, exchangeName, routingKey); 23 | 24 | // 消费 25 | await channel.consume(queueName, msg => { 26 | console.log('Consumer:', msg.content.toString()); 27 | channel.ack(msg); 28 | }); 29 | 30 | console.log('消费端启动成功!'); 31 | } 32 | 33 | consumer(); -------------------------------------------------------------------------------- /exchange/topic/topicProducter.js: -------------------------------------------------------------------------------- 1 | const amqp = require('amqplib'); 2 | 3 | async function producer() { 4 | // 创建链接对象 5 | const connection = await amqp.connect('amqp://localhost:5672'); 6 | 7 | // 获取通道 8 | const channel = await connection.createChannel(); 9 | 10 | // 声明参数 11 | const exchangeName = 'topic_koala_exchange'; 12 | const routingKey1 = 'topic_routingKey.test1'; 13 | const routingKey2 = 'topic_routingKey.test2'; 14 | const routingKey3 = 'topic_routingKey.test3.1'; 15 | const routingKey4 = 'topic_routingKey2.test4'; 16 | const routingKey5 = 'topic_routingKey2.test5.1'; 17 | const msg = 'hello koala'; 18 | 19 | // 交换机 20 | await channel.assertExchange(exchangeName, 'topic', { 21 | durable: true, 22 | }); 23 | 24 | // 发送消息 25 | await channel.publish(exchangeName, routingKey1, Buffer.from(msg + routingKey1)); 26 | await channel.publish(exchangeName, routingKey2, Buffer.from(msg + routingKey2)); 27 | await channel.publish(exchangeName, routingKey3, Buffer.from(msg + routingKey3)); 28 | await channel.publish(exchangeName, routingKey4, Buffer.from(msg + routingKey4)); 29 | await channel.publish(exchangeName, routingKey5, Buffer.from(msg + routingKey5)); 30 | 31 | // 关闭链接 32 | await channel.close(); 33 | await connection.close(); 34 | } 35 | 36 | producer(); -------------------------------------------------------------------------------- /消息队列文章/消息队列HelloWorld流程图 (1).drawio: -------------------------------------------------------------------------------- 1 | 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 --------------------------------------------------------------------------------