一、Rabbitmq的介绍
Rabbitmq是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如,Python、Ruby、php等语言。支持ajax,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
这里需要说明的是: AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布订阅)、可靠性、安全。
通常我们谈队列服务,会有三个概念:发消息者、队列、收消息者,Rabbitmq在这个基本概念上多做了一层抽象,在发消息者和队列之间,加入了消息交换机(Exchange)。这样发消息和队列就没有直接联系,转而变成发消息者把消息给消息交换机,交换器根据调度策略再把消息给消息交换机,消息交换机根据调度策略再把消息再给队列。
上图中,左侧P代表生产者,也就是往Rabbitmq发消息的程序;中间是Rabbitmq,其中包括交换机和队列;右侧C代表消费者,也就是从Rabbitmq拿消息的程序。
五个概念:
1)虚拟主机:一个虚拟主机持有一组消息交换机、队列和绑定。在Rabbitmq中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的消息交换机/队列/绑定,必须为A和B分别创建一个虚拟主机。每个Rabbitmq服务器都有一个默认的虚拟主机”/”。
2)消息:消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)
3)绑定:也就是交换机需要和队列向绑定,如上图所示,是多对多的关系。用于消息队列和交换器之间的互联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表
4)信道:多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的tcp连接内地虚拟连接。AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过通道完成。因为对于操作系统来说建立和销毁tcp都死非常昂贵的开销,所以引入了信道的概念,以复用一条tcp连接。
5)交换器(Exchange):Exchange用于转发消息,但它不会做存储,如果没有Quene bind到Exchange的话,它会直接丢弃掉Producer发送过来的消息。消息到交换机的时候,交换机会根据路由键转发到对应的队列中。
交换器的功能主要是接收消息并且转发到绑定的队列,交换机不存储消息,在启用ack模式后,交换机找不到队列会返回错误。交换机有四种类型:Direct, topic, Headers and Fanout
Direct:direct 类型的行为是”先匹配, 再投送”. 即在绑定时设定一个routing_key, 消息的routing_key匹配时, 才会被交换器投送到绑定的队列中去.
Topic:按规则转发消息(最灵活)
Headers:设置header attribute参数类型的交换机
Fanout:转发消息到所有绑定队列
二、Rabbitmq服务器的搭建
1、安装Erlang
# yum installerlang
2、安装Rabbitmq-server
#yum installrabbitmq-server
3、配置Rabbitmq-server
1)将rabbitmq的rabbitmq.config.example文件内容替换/etc/rabbitmq/rabbitmq.config
2)编辑rabbitmq配置文件,开启远程访问
将配置文件中"%% {loopback_users, []},",这一行的逗号去掉
3)开启 Web 界面管理
#rabbitmq-plugins enable rabbitmq_management
4)重启 RabbitMQ 服务
#systemctl restart rabbitmq-server
5)开放防火墙端口
#iptables -I INPUT -p tcp -m tcp --dport 15672 -j ACCEPT
#iptables -I INPUT -p tcp -m tcp --dport 5672 -j ACCEPT
#service iptables save
#service iptables restart
4、浏览器访问rabbitmq web界面
浏览器上输入地址:rabbitmq服务器地址:15672。默认管理员账号:guest,密码:guest。登录后的界面如下所示: