后端服务器开发 消息队列中间件 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)。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
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 ),只需把队列绑定到交换机上。发送到交换机的消息都会转发到与该交换机绑定的所有队列上,类似于广播,转发消息是最快的
Fanout
Direct:处理路由键(有routingKey )。将一队列绑定到交换机上,该消息需与一个特定的路由键( routingKey )完全匹配
Direct
Topic:与direct类似,功能更强,支持模糊绑定
*表示通配一个词
#表示通配0个或多个词
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
命令行
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并打印。
应用场景-2work queues
将耗时的消息处理通过队列分配给多个consumer来处理,我们称此处的consumer为worker,我们将此处的queue称为Task Queue,其目的是为了避免资源密集型的task的同步处理,也即立即处理task并等待完成。相反,调度task使其稍后被处理。也即把task封装进message并发送到task queue,worker进程在后台运行,从task queue取出task并执行job,若运行了多个worker,则task可在多个worker间分配。
应用场景-3Publish/Subscribe
在应用场景2中一个message(task)仅被传递给了一个comsumer(worker)。现在我们设法将一个message传递给多个consumer。这种模式被称为publish/subscribe。此处以一个简单的日志系统为例进行说明。该系统包含一个log发送程序和一个log接收并打印的程序。由log发送者发送到queue的消息可以被所有运行的log接收者接收。因此,我们可以运行一个log接收者直接在屏幕上显示log,同时运行另一个log接收者将log写入磁盘文件。
应用场景4-Routing
应用场景3中构建了简单的log系统,可以将log message广播至多个receiver。现在我们将考虑只把指定的message类型发送给其subscriber,比如,只把error message写到log file而将所有log message显示在控制台。
应用场景5-topic
topic类型的exchange中routing_key中可以包含两个特殊字符:“*”用于替代一个词,“#”用于0个或多个词。
我自己在工作中用的应该场景只有点对点的通讯模式了,主要是大型平台子系统与子系统之间的通讯,从而实现系统之前的解耦。
谢谢您的阅读。您的满意与肯定是我前进的动力! 欢迎关注老猫码坊,与老猫一起了解更多互联网科技和编程知识。
以上是关于后端服务器开发 消息队列中间件 RabbitMQ 简介的主要内容,如果未能解决你的问题,请参考以下文章