【转载】消息队列RabbitMQ入门介绍
(一)基本概念
RabbitMQ 是流行的开源消息队列系统,用 erlang 语言开发。我曾经对这门语言挺有兴趣,学过一段时间,后来没坚持。RabbitMQ 是 AMQP(高级消息队列协议)的标准实现。如果不熟悉 AMQP,直接看 RabbitMQ 的文档会比较困难。不过它也只有几个关键概念,这里简单介绍。
RabbitMQ 的结构图如下:
exchange 接收到消息后,就根据消息的 routing key 和已经设置的 binding 关系,进行消息路由,将消息投递到一个或多个队列里。
- 完全根据 routing key 进行投递的叫做 direct 交换机。例如,绑定时设置了 binding key 为 "abc",那么客户端提交的消息,只有设置了routing key 为 "abc" 的才会被投递到该队列。
- 对 routing key 进行模式匹配后进行投递的叫做 topic 交换机。符号 "#" 匹配一个或多个词,符号 "*" 匹配正好一个词。例如 "abc.#" 可以匹配 "abc.def.ghi" ,"abc.*" 只能匹配 "abc.def" 。
- 还有一种不需要 routing key 的,叫做 fanout 交换机。它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。
如果 exchange 和 queue 都是持久化的,那么它们之间的 binding 也是持久化的。
使用 Linux 服务器(ubuntu 9.10 64位),安装 RabbitMQ 非常方便。
1
|
# apt-get install erlang-nox
|
再到rabbitmq.com上下载RabbitMQ的安装包,如下安装:
1
|
# dpkg -i rabbitmq-server_2.6.1-1_all.deb
|
安装完后,使用
1
|
# /etc/init.d/rabbitmq-server start|stop|restart
|
来启动、停止、重启 rabbitmq。
在正式应用之前,我们先在 RabbitMQ 里创建一个 vhost ,加一个用户,并设置该用户的权限。
使用 rabbitmqctl 客户端工具,在根目录下创建 "/pyhtest" 这个 vhost :
1
|
# rabbitmqctl add_vhost /pyhtest
|
创建一个用户名 "pyh" ,设置密码 "pyh1234" :
1
|
# rabbitmqctl add_user pyh pyh1234
|
设置pyh用户对/pyhtest这个vhost拥有全部权限:
1
|
# rabbitmqctl set_permissions -p /pyhtest pyh “.*” “.*” “.*”
|
后面三个”*”代表pyh用户拥有对/pyhtest的配置、写、读全部权限
设置好后,开始编程,我用 Perl 写一个消息投递程序(producer):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#!/usr/bin/perl
use strict;
use Net::RabbitMQ;
use UUID::Tiny;
my $channel = 1000; # channel ID,可以随意指定,只要不冲突
my $queuename = “pyh_queue”; # 队列名
my $exchange = “pyh_exchange”; # 交换机名
my $routing_key = “test”; # routing key
my $mq = Net::RabbitMQ->new(); # 创建一个RabbitMQ对象
$mq -> connect (“localhost”, { vhost => “/pyhtest”, user => “pyh”, password => “pyh1234″ }); # 建立连接
$mq ->channel_open( $channel ); # 打开一个channel
$mq ->exchange_declare( $channel , $exchange , { durable => 1}); # 声明一个持久化的交换机
$mq ->queue_declare( $channel , $queuename , { durable => 1}); # 声明一个持久化的队列
$mq ->queue_bind( $channel , $queuename , $exchange , $routing_key ); # 使用routing key在交换机和队列间建立绑定
for ( my $i =0; $i <10000000; $i ++) { # 循环1000万次
my $string = create_UUID_as_string(UUID_V1); # 产生一条UUID作为消息主体
$mq ->publish( $channel , $routing_key , $string , { exchange => $exchange }, { delivery_mode => 2 }); # 将消息结合key以持久化模式投递到交换机
}
$mq ->disconnect(); # 断开连接
|
消息接受程序(consumer)大概如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/usr/bin/perl
use strict;
use Net::RabbitMQ;
my $channel = 1001;
my $queuename = “pyh_queue”;
my $mq = Net::RabbitMQ->new();
$mq -> connect (“localhost”, { vhost =>”/pyhtest”, user => “pyh”, password => “pyh1234″ });
$mq ->channel_open( $channel );
while (1) {
my $hashref = $mq ->get( $channel , $queuename );
last unless defined $hashref ;
print $hashref ->{message_count}, “: “, $hashref ->{body},”\n”;
}
$mq ->disconnect();
|
consumer 连接后只要指定队列就可获取到消息。
上述程序共投递 1000 万条消息,每条消息 36 字节(UUID),打开持久化,共耗时 17 分多钟(包括产生 UUID 的时间),每秒投递消息约 9500 条。测试机器是 8G 内存、8 核志强 CPU 。
投递完后,在 /var/lib/rabbitmq/mnesia/rabbit@${hostname}/msg_store_persistent 目录,产生 2G 多的持久化消息数据。在运行 consumer 程序后,这些数据都会消失,因为消息已经被消费了。
【转载】消息队列RabbitMQ入门介绍相关推荐
- 消息队列RabbitMQ入门与PHP实战
消息队列介绍以及消息队列应用场景 RabbitMQ 说明 MQ(Message Queue) 即消息队列,是应用间的通信方式,消息发送后可立即返回,由消息系统来确保消息的可靠传递."消息队列 ...
- 干货!消息队列RabbitMQ入门教程
写在前面:全文12000多字,从为什么需要用消息队列,到rabbitMQ安装使用,如何使用JavaAPI生产消费消息,以及使用消息队列带来的一些常见问题.绝对很适合新手入门学习. 为什么需要消息队列 ...
- 消息队列RabbitMQ入门与5种模式详解
1.RabbitMQ概述 简介: MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法: RabbitMQ是开源的,实现了AMQP协议的,采用Erlang(面向并发编程语言 ...
- linux发布微软消息队列,消息队列RabbitMQ入门与5种模式详解
1.RabbitMQ概述 简介: MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法: RabbitMQ是开源的,实现了AMQP协议的,采用Erlang(面向并发编程语言 ...
- Spring Boot 消息队列 RocketMQ 入门
转载自 芋道 Spring Boot 消息队列 RocketMQ 入门 摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/RocketMQ/ 「芋道源码」欢迎转载 ...
- 初识消息队列/RabbitMQ详解
欢迎大家阅读<朝夕Net社区技术专刊> 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦! 今天来给大家分享 ...
- 消息队列RabbitMQ的使用
最近在学习spring cloud微服务,当学习到spring cloud bus的时候,涉及到了消息队列,需要学习RabbitMQ. 一.消息队列 1.1介绍消息队列 消息队列,即MQ,Messag ...
- 消息队列Rabbitmq,在Node.js中的应用
为什么写这篇文章 现在的面试要求越来越高了,打开看了看几个 BOSS 招聘 Node.js 全栈开发的,其中都有一条"了解 消息队列,并在项目中应用过",呜呜呜 后端开发者应该都知 ...
- 谷粒商城12——购物车模块、消息队列RabbitMQ
文章目录 十.购物车模块 1.需求分析 2.封装vo 3.添加商品 4.查询购物车 5.选中商品 6.在购物车修改商品数量 7.在购物车删除商品 十一.消息队列RabbitMQ 1.场景分析 2.概述 ...
最新文章
- 第三次作业——结对编程
- CheckBox的使用(四):ListView中的项设置为可以多选
- Java Spring Boot 2.0 实战之制作Docker镜像并推送到Docker Hub和阿里云仓库
- 自己动手 从android硬件驱动到APP---(1)硬件驱动层
- Ajax跨域post请求后端无法获取登录态原因及解决办法
- 雷军:启动手机+AIoT双引擎战略 5G春天到来前打持久战
- 石子合并(洛谷-P1880)
- 来看看Python炫酷的颜色输出与进度条打印
- 简单而常用的shell 命令
- 使用脚本快速查看Linux系统信息
- Camel In Action 读书笔记 (8)
- C盘的“压缩驱动器以节约磁盘空间”有用吗
- mvn dependency命令
- 深度装机大师一键重装_就算是电脑小白也能使用自如的重装软件,了解一下?...
- ANSYS mesh网格划分
- 怎样安装计算机病毒,台式机电脑中病毒如何重装系统图文教程
- dos攻击的服务器修复,被dos攻击怎么解决
- SylixOS的来龙去脉
- HBuilder X 未检测到手机或模拟器(安卓端)
- python早读读后感_《学习Python》读后感摘抄