后端服务器开发 消息队列中间件 RabbitMQ 简介

Posted 老猫码坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后端服务器开发 消息队列中间件 RabbitMQ 简介相关的知识,希望对你有一定的参考价值。

之前在工作中团队要求大家选择一个自己了解的知识点,在会议室中给大家分享一下。本文就是我当时的分享主题,现在分享给大家一起交流,如果有什么错误的地方欢迎指出,请大家多多指教。

Rabbit MQ 简介

Rabbit MQ是流行的开源消息队列系统,是用(爱立信公司)erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、php、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

Rabbit MQ中有几个重要概念

虚拟主机(virtual host),交换机(exchange ),路由键( Routing Key ),队列(queue),绑定(binding),通道(channel),消费者(consumer),生产者(producer)。

  1. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

  2. Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

  3. Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

  4. Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

  5. vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

  6. producer:消息生产者,就是投递消息的程序。

  7. consumer:消息消费者,就是接受消息的程序。

  8. channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

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

  • 客户端连接到消息队列服务器,打开一个channel。

  • 客户端声明一个exchange,并设置相关属性。

  • 客户端声明一个queue,并设置相关属性。

  • 客户端使用routing key,在exchange和queue之间建立好绑定关系。

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

Rabbit MQ 结构图如下:

Rabbit MQ 结构图

消息持久化:

RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分:  

  • exchange持久化,在声明时指定durable => 1  

  • queue持久化,在声明时指定durable => 1  

  • 消息持久化,在投递时指定delivery_mode => 2(1是非持久化)

如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。

Exchange类型

Fanout:不处理路由键(没有routingKey ),只需把队列绑定到交换机上。发送到交换机的消息都会转发到与该交换机绑定的所有队列上,类似于广播,转发消息是最快的

后端服务器开发 消息队列中间件 RabbitMQ 简介

Fanout

Direct:处理路由键(有routingKey )。将一队列绑定到交换机上,该消息需与一个特定的路由键( routingKey )完全匹配

后端服务器开发 消息队列中间件 RabbitMQ 简介

Direct

Topic:与direct类似,功能更强,支持模糊绑定

*表示通配一个词

#表示通配0个或多个词

后端服务器开发 消息队列中间件 RabbitMQ 简介Topic

Rabbit MQ部署与基本操作

Rabbitmq 是用 erlang 语言写的,所以我们需要安装 Erlang,安装 erlang 又需要安装 python 与 simplejson,所以我们从python开始:(我是在centos6.5上安装的操作步骤)

1、安装 python:

#wget http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar.bz2

#tar -jxvf Python-2.5.2.tar.bz2

#cd Python-2.5.2

#./configure

#make && make install

测试:在命令行下输入python,出现python解释器即表示已经正确安装。

2、安装 simplejson:

#wget http://pypi.python.org/packages/source/s/simplejson/simplejson-2.0.9.tar.gz

#tar zxvf simplejson-2.0.9.tar.gz

#cd simplejson-2.0.9

#python setup.py build

#python setup.py install

3、安装 erlang

#yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

#yum install tk unixODBC unixODBC-devel

#yum -y install ncurses-devel

#yum install ncurses-devel

#yum -y install xmlto

#wget http://www.erlang.org/download/otp_src_R13B04.tar.gz

#mv otp_src_R16B02 erlang_R16B #重命名解压厚的文件

#cd erlang_R16B/

#./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac

#make && make install

#vi /etc/profile

ERL_HOME=/usr/local/erlang

PATH=$ERL_HOME/bin:$PATH

export ERL_HOME PATH

#source /etc/profile

更新环境变量

执行erl,进入erlang的shell成功安装 测试一下是否安装成功,在控制台输入命令erl

4、安装 RabbitMQ

cd /usr/local

#wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.1/rabbitmq-server-3.1.1.tar.gz

#cd rabbitmq-server-3.1.1

#make

#make install TARGET_DIR=/opt/mq/rabbitmq SBIN_DIR=/opt/mq/rabbitmq/sbin MAN_DIR=/opt/mq/rabbitmq/man

5、安装web插件管理界面

#cd /opt/mq/rabbitmq/sbin

#mkdir /etc/rabbitmq/

#rabbitmq-plugins enable rabbitmq_management

[php] view plaincopy

#./rabbitmq-server start &

启动rabbitmq服务:

前台运行:rabbitmq-server start (用户关闭连接后,自动结束进程)

管理界面与http api

http://localhost:15672

后端服务器开发 消息队列中间件 RabbitMQ 简介

命令行

rabbitmqctl status

rabbitmqctl list_users

rabbitmq-plugins list

rabbitmqctl list_vhosts

rabbitmq-plugins enable rabbitmq_management ##启用web管理

rabbitmqctl add_user mqadmin 123456 ##添加管理员用户

rabbitmqctl set_user_tags mqadmin administrator ##设置mqadmin这个用户为管理员角色

rabbitmqctl delete_user guest ##删除默认用户

rabbitmqctl list_queues

Rabbit MQ 应用场景

应用场景-1“Hello Word”

一个P向queue发送一个message,一个C从该queue接收message并打印。

后端服务器开发 消息队列中间件 RabbitMQ 简介


应用场景-2work queues

将耗时的消息处理通过队列分配给多个consumer来处理,我们称此处的consumer为worker,我们将此处的queue称为Task Queue,其目的是为了避免资源密集型的task的同步处理,也即立即处理task并等待完成。相反,调度task使其稍后被处理。也即把task封装进message并发送到task queue,worker进程在后台运行,从task queue取出task并执行job,若运行了多个worker,则task可在多个worker间分配。

后端服务器开发 消息队列中间件 RabbitMQ 简介


应用场景-3Publish/Subscribe

在应用场景2中一个message(task)仅被传递给了一个comsumer(worker)。现在我们设法将一个message传递给多个consumer。这种模式被称为publish/subscribe。此处以一个简单的日志系统为例进行说明。该系统包含一个log发送程序和一个log接收并打印的程序。由log发送者发送到queue的消息可以被所有运行的log接收者接收。因此,我们可以运行一个log接收者直接在屏幕上显示log,同时运行另一个log接收者将log写入磁盘文件。

后端服务器开发 消息队列中间件 RabbitMQ 简介

应用场景4-Routing

应用场景3中构建了简单的log系统,可以将log message广播至多个receiver。现在我们将考虑只把指定的message类型发送给其subscriber,比如,只把error message写到log file而将所有log message显示在控制台。

后端服务器开发 消息队列中间件 RabbitMQ 简介


应用场景5-topic

topic类型的exchange中routing_key中可以包含两个特殊字符:“*”用于替代一个词,“#”用于0个或多个词。

我自己在工作中用的应该场景只有点对点的通讯模式了,主要是大型平台子系统与子系统之间的通讯,从而实现系统之前的解耦。

谢谢您的阅读。您的满意与肯定是我前进的动力! 欢迎关注老猫码坊,与老猫一起了解更多互联网科技和编程知识。

以上是关于后端服务器开发 消息队列中间件 RabbitMQ 简介的主要内容,如果未能解决你的问题,请参考以下文章

.Net微服务架构:RabbitMQ中间件应用

消息中间件RabbitMQ

RabbitMQ与AMQP协议

Rabbitmq入门

C# 使用 RabbitMq 队列

RabbitMQ