消息中间件就是在消息的传输过程中保存消息的容器。消息中间件再将消息从它的源中继到它的目标时充当中间人的作用。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功的传递它为止,当然,消息队列保存消息也是有期限点的。

一、消息中间件特点:

1.1、采用异步处理模式

消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或队列)上,消息接受者则订阅或是监听该通道。一条消息可能最终转发给一个或多个消息接受者,这些接受者都无须对消息发送者做出同步回应。整个过程是异步的。比如用户消息注册,注册完毕后过段时间发送邮件或者短息

1.2、应用程序和应用程序调用关系为松耦合关系

发送者和接受者不必了解对方、只需要确认消息

发送者和接受者不必同时在线

比如在线交易系统为了保证数据的最终一致,在支付系统处理完成后会把支付结果放到消息中间件里通过订单系统修改订单支付状态。两个系统通过 消息中间件解耦

二、消息传递服务模型:

2.1、消息中间件的传递模型:

2.1.1、点对点模型(PTP)

点对点模型用于消息生产者和消息消费者之间点对点的通信。消息生产者将消息发动到由某个名字标识的特定消费者。这个名字实际上对应于消息服务中的一个队列(Queue),在消息传送给消费者之前它被存储在这个队列中。队列消息可以放在内存中也可以是持久的,以保证在消息服务出现故障时扔然能够传递消息

点对点模型特点:

(1)、每个消息只用一个消费者

(2)、发送者和接受者没有时间依赖

(3)、接受者确认消息接受和处理成功

2.1.2、发布-订阅模型(Pub/Sub)

发布者/订阅者模型支持向一个特定的消息主题生产消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。

这种模式被概括为:多个消费者可以获得消息。在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便能够消费者订阅。订阅者必须保持持续的活动状态以接受消息,除非订阅者建立了持久的订阅。在这种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。

发布/订阅模型特性:

(1)、每个消息可以有多个订阅者

(2)、客户端只有订阅后才能接收到消息

(3)、持久订阅和非持久订阅

发布/订阅模型特点:

(1)、发布者和订阅者有时间依赖

接收者和发布者只有建立订阅关系才能收到消息

(2)、持久订阅

订阅关系建立后,消息就不会消失,不管订阅者是否都在线

(3)、非持久订阅

订阅者为了接收消息、必须一直在线,当只有一个订阅者时约等于点对点模式

2.2、消息中间件分类:

2.2.1(push)推消息模型:消息生产者将消息发送给消息传递服务,消息传递服务又将消息推送给消息消费者。

2.2.2(pull)拉消息模型:消费者请求消息服务接收消息,消息生产者从消息中间件拉该消息。

 

Metaq

Rabbitmq是一个在AMQP协议标准基础上完整的,可复用的企业消息系统。采用Erlang实现的工业级的消息队列(MQ)服务器。

AMQP(高级消息队列协议)是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS)AMQP客户端能够无视消息的来源任意发送和接收信息。AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件(MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一部分,形成了在线路层协议顶端的一个层级:AMQP模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特性,例如更易于扩展,基于内容的路由。

安装Rabbitmq:

[root@linux-node3 ~]# wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

[root@linux-node3 ~]# rpm -ivh epel-release-6-8.noarch.rpm

[root@linux-node3 ~]# yum install -y rabbitmq-server

[root@linux-node3 ~]# /etc/init.d/rabbitmq-server start

[root@linux-node3 ~]# chkconfig rabbitmq-server on

[root@linux-node3 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins list  ##列出所有的插件

[root@linux-node3 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management ##启用web监控插件

The following plugins have been enabled:

  mochiweb

  webmachine

  rabbitmq_web_dispatch

  amqp_client

  rabbitmq_management_agent

  rabbitmq_management

Plugin configuration has changed. Restart RabbitMQ for changes to take effect.

[root@linux-node3 ~]# /etc/init.d/rabbitmq-server restart

Restarting rabbitmq-server: SUCCESS

rabbitmq-server.

[root@linux-node3 ~]# netstat -lntup|grep 5672

tcp        0      0 0.0.0.0:15672   0.0.0.0:*      LISTEN      2939/beam.smp       

tcp        0      0 0.0.0.0:55672   0.0.0.0:*      LISTEN      2939/beam.smp       

tcp        0      0 :::5672       :::*         LISTEN      2939/beam.smp       

[root@linux-node3 ~]# rabbitmqctl add_vhost test ##创建vhosttest 

Creating vhost "test" ...

...done.

[root@linux-node3 ~]# rabbitmqctl list_vhosts   ##遍历所有虚拟主机信息

Listing vhosts ...

/

test

...done.

[root@linux-node3 ~]# rabbitmqctl add_user test 123456   ##添加用户及密码

Creating user "test" ...

...done.

[root@linux-node3 ~]# rabbitmqctl set_user_tags test administrator  ##设置用户test的角色

Setting tags for user "test" to [administrator] ...

...done.

[root@linux-node3 ~]#rabbitmqctl set_permissions -p test test ".*" ".*" ".*" ##绑定权限,并且具备读写的权限

Setting permissions for user "test" in vhost "test" ...

...done.

[root@linux-node3 ~]# rabbitmqctl list_queues  ##显示所有队列

Listing queues ...

...done.

[root@linux-node3 ~]# /etc/init.d/rabbitmq-server restart   ##一定要restart

Restarting rabbitmq-server: SUCCESS

rabbitmq-server.

 

常用命令:

/etc/init.d/rabbitmq-server start|restart|stop|reload

rabbitmqctl add_vhost vhostname  创建vhost

rabbitmqctl delete_vhost vhostname 删除vhost

rabbitmqctl list_vhosts   遍历所有虚拟主机信息

rabbitmqctl add_user username password  添加用户及密码

rabbitmqctl change_password username newpassword 修改用户密码

rabbitmqctl set_user_tags username administrator 设置username的角色(administrator)

rabbitmqctl set_permissions -p vhost user ".*" ".*" ".*"  绑定权限,并且具备读写的权限

rabbitmqctl list_queues  显示所有队列

注:不管能否解决你遇到的问题,欢迎相互交流,共同提高!