(一)基本概念

RabbitMQ 是流行的开源消息队列系统,用 erlang 语言开发。我曾经对这门语言挺有兴趣,学过一段时间,后来没坚持。RabbitMQ 是 AMQP(高级消息队列协议)的标准实现。如果不熟悉 AMQP,直接看 RabbitMQ 的文档会比较困难。不过它也只有几个关键概念,这里简单介绍。

RabbitMQ 的结构图如下:

几个概念说明:

Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把 exchange 和 queue 按照路由规则绑定起来。
Routing Key:路由关键字,exchange 根据这个关键字进行消息投递。
vhost:虚拟主机,一个 broker 里可以开设多个 vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个 channel,每个 channel 代表一个会话任务。

消息队列的使用过程大概如下:

(1)客户端连接到消息队列服务器,打开一个 channel 。
(2)客户端声明一个 exchange,并设置相关属性。
(3)客户端声明一个 queue,并设置相关属性。
(4)客户端使用 routing key(本质上是 binding key,后文已做相应纠正),在 exchange 和 queue 之间建立好绑定关系。
(5)客户端投递消息到 exchange 。

exchange 接收到消息后,就根据消息的 routing key 和已经设置的 binding 关系,进行消息路由,将消息投递到一个或多个队列里。

exchange 也有几个类型:

RabbitMQ 支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括 3 个部分:
(1)exchange 持久化,在声明时指定 durable => 1
(2)queue 持久化,在声明时指定 durable => 1
(3)消息持久化,在投递时指定 delivery_mode => 2(1 是非持久化)

如果 exchange 和 queue 都是持久化的,那么它们之间的 binding 也是持久化的。

(二)应用实际

使用 Linux 服务器(ubuntu 9.10 64位),安装 RabbitMQ 非常方便。

先运行如下命令安装 erlang:

?
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 程序后,这些数据都会消失,因为消息已经被消费了。

原文地址:http://www.nsbeta.info/archives/200

【转载】消息队列RabbitMQ入门介绍相关推荐

  1. 消息队列RabbitMQ入门与PHP实战

    消息队列介绍以及消息队列应用场景 RabbitMQ 说明 MQ(Message Queue) 即消息队列,是应用间的通信方式,消息发送后可立即返回,由消息系统来确保消息的可靠传递."消息队列 ...

  2. 干货!消息队列RabbitMQ入门教程

    ​写在前面:全文12000多字,从为什么需要用消息队列,到rabbitMQ安装使用,如何使用JavaAPI生产消费消息,以及使用消息队列带来的一些常见问题.绝对很适合新手入门学习. 为什么需要消息队列 ...

  3. 消息队列RabbitMQ入门与5种模式详解

    1.RabbitMQ概述 简介: MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法: RabbitMQ是开源的,实现了AMQP协议的,采用Erlang(面向并发编程语言 ...

  4. linux发布微软消息队列,消息队列RabbitMQ入门与5种模式详解

    1.RabbitMQ概述 简介: MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法: RabbitMQ是开源的,实现了AMQP协议的,采用Erlang(面向并发编程语言 ...

  5. Spring Boot 消息队列 RocketMQ 入门

    转载自  芋道 Spring Boot 消息队列 RocketMQ 入门 摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/RocketMQ/ 「芋道源码」欢迎转载 ...

  6. 初识消息队列/RabbitMQ详解

    欢迎大家阅读<朝夕Net社区技术专刊> 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦! 今天来给大家分享 ...

  7. 消息队列RabbitMQ的使用

    最近在学习spring cloud微服务,当学习到spring cloud bus的时候,涉及到了消息队列,需要学习RabbitMQ. 一.消息队列 1.1介绍消息队列 消息队列,即MQ,Messag ...

  8. 消息队列Rabbitmq,在Node.js中的应用

    为什么写这篇文章 现在的面试要求越来越高了,打开看了看几个 BOSS 招聘 Node.js 全栈开发的,其中都有一条"了解 消息队列,并在项目中应用过",呜呜呜 后端开发者应该都知 ...

  9. 谷粒商城12——购物车模块、消息队列RabbitMQ

    文章目录 十.购物车模块 1.需求分析 2.封装vo 3.添加商品 4.查询购物车 5.选中商品 6.在购物车修改商品数量 7.在购物车删除商品 十一.消息队列RabbitMQ 1.场景分析 2.概述 ...

最新文章

  1. 第三次作业——结对编程
  2. CheckBox的使用(四):ListView中的项设置为可以多选
  3. Java Spring Boot 2.0 实战之制作Docker镜像并推送到Docker Hub和阿里云仓库
  4. 自己动手 从android硬件驱动到APP---(1)硬件驱动层
  5. Ajax跨域post请求后端无法获取登录态原因及解决办法
  6. 雷军:启动手机+AIoT双引擎战略 5G春天到来前打持久战
  7. 石子合并(洛谷-P1880)
  8. 来看看Python炫酷的颜色输出与进度条打印
  9. 简单而常用的shell 命令
  10. 使用脚本快速查看Linux系统信息
  11. Camel In Action 读书笔记 (8)
  12. C盘的“压缩驱动器以节约磁盘空间”有用吗
  13. mvn dependency命令
  14. 深度装机大师一键重装_就算是电脑小白也能使用自如的重装软件,了解一下?...
  15. ANSYS mesh网格划分
  16. 怎样安装计算机病毒,台式机电脑中病毒如何重装系统图文教程
  17. dos攻击的服务器修复,被dos攻击怎么解决
  18. SylixOS的来龙去脉
  19. HBuilder X 未检测到手机或模拟器(安卓端)
  20. python早读读后感_《学习Python》读后感摘抄

热门文章

  1. 饿了么口碑实现超30亿美元融资,引领本地生活数字化升级...
  2. 【转】Python中的运算符
  3. 修改PPC下的移动运营商名称为中文
  4. ALC--软件定义架构的PLC
  5. oc73--NSArray使用
  6. Ruby中的Profiling工具
  7. 与MQ通讯的完整JAVA程序
  8. Oracle 9i 返回一个记录集的方法
  9. 【架构师培训课程-技术基础课】
  10. 打造扛得住的MySQL数据库架构-第2章 什么影响了MySQL性能