学习rabbitMQ心得

来源:互联网 发布:绘制平面图的软件 编辑:程序博客网 时间:2024/05/17 00:57

这几天公司要用rabbitmq实现公司消息发送队列,我就在闲暇之余研究了一下这个

由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成,因此也是继承了这些优点...

开发的工具

关于MQ,百度百科上的解释是:MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。

rabbitmq是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议
 
一、安装rabbitmq首先必须安装erlang环境
wget http://www.erlang.org/download/.......opt_src_R16B.tar.gz  (由于官网地址有时候会变,建议查好地址再下载)
解压压缩包
tar -xzvf otp_src_R16B.tar.gz
cd otp_src_R16B
./configure --help
./configure --prefix=/usr/local/erlang
make
make install
 
 /usr/local/erlong为指定的目录
 
二、安装rabbitmq   (代码参考别人)
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.0.4/rabbitmq-server-generic-unix-3.0.4.tar.gz
tar -xzvf rabbitmq-server-generic-unix-3.0.4.tar.gz 
mv rabbitmq_server-3.0.4/ /usr/local/
cd /usr/local/rabbitmq_server-3.0.4/sbin
./rabbitmq-server
 

到这里会出现一个报错信息: ./rabbitmq-server: line 86: erl: command not found  这是因为erlong指定了安装路径,在系统的PATH中找不到。只要export PATH=$PATH:/usr/local/erlong/bin 就可以了。

如果为了rc.local启动方便,可以将 export PATH=$PATH:/usr/local/erlong/bin 这一行写入到 rabbitmq-server 文件中:

执行后,ps -aux 一下,看到进程中有/usr/local/erlong/lib/erlang/erts-5.10.1/bin/epmd -daemon 和 /usr/local/erlong/lib/erlang/erts-5.10.1/bin/beam.smp 就OK了

 
当然,我是在linux ubuntu 13.04 server版上安装与部署
安装其实非常简单 只需要 ubuntu连接上互联网
在命令里输入:  sudo install rabbitmq
电脑会自动联网安装
成功后会自动启动服务
也可以在  /etc cofig里面配置
设置好电脑开机启动时候启动rabbitMQ
然后,在其他远程调用该服务器地址,就OK了
官网已经提供了 实现java  python 以及 ruby的代码
直接复制过来,然后在你 的项目中导入 相应的jar包就行了,非常简单
 
 
rabbitmq 的doc 文档,官网上也有  java doc文档下载地址是:http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.rabbitmq.com%2Freleases%2Frabbitmq-java-client%2Fv3.1.3%2Frabbitmq-java-client-javadoc-3.1.3%2F
在这里面有好多封装好的类和接口,调用方便
 
 
AMPQ

AMPQ协议为了能够满足各种消息队列需求,在概念上比较复杂。首先,rabbitMQ启动默认是没有任何配置的,需要客户端连接上去,设置交换机等才能工作。不把这些基础概念弄清楚,后面程序设计就容易产生问题。

vhosts : 虚拟主机。

一个RabbitMQ的实体上可以有多个vhosts,用户与权限设置就是依附于vhosts
connection 与 channel :  连接与信道
connection是指物理的连接,一个client与一个server之间有一个连接;一个连接上可以建立多个channel,可以理解为逻辑上的连接。一般应用的情况下,有一个channel就够用了,不需要创建更多的channel
exchange 与  routingkey : 交换机 与 路由键

为了将不同类型的消息进行区分,设置了交换机与路由两个概念。比如,将A类型的消息发送到名为‘C1’的交换机,将类型为B的发送到'C2'的交换机。当客户端连接C1处理队列消息时,取到的就只是A类型消息。进一步的,如果A类型消息也非常多,需要进一步细化区分,比如某个客户端只处理A类型消息中针对K用户的消息,routingkey就是来做这个用途的。

发送消息时,只要有“交换机”就够了。至于交换机后面有没有对应的处理队列,发送方是不用管的。routingkey可以是空的字符串。

对于交换机,有两个重要的概念:

A,类型。有三种类型: Fanout类型最简单,这种模型忽略routingkey;Direct类型是使用最多的,使用确定的routingkey。这种模型下,接收消息时绑定'key_1'则只接收key_1的消息;最后一种是Topic,这种模式与Direct类似,但是支持通配符进行匹配,比如: 'key_*',就会接受key_1和key_2。Topic貌似美好,但是有可能导致不严谨,所以还是推荐使用Direct。

B,持久化。指定了持久化的交换机,在重新启动时才能重建,否则需要客户端重新声明生成才行。

需要特别明确的概念:交换机的持久化,并不等于消息的持久化。只有在持久化队列中的消息,才能持久化;如果没有队列,消息是没有地方存储的;消息本身在投递时也有一个持久化标志的,PHP中默认投递到持久化交换机就是持久的消息,不用特别指定。

queue: 队列

讲了这么多,才讲到队列呀。事实上,队列仅是针对接收方(consumer)的,由接收方根据需求创建的。只有队列创建了,交换机才会将新接受到的消息送到队列中,交换机是不会在队列创建之前的消息放进来的。换句话说,在建立队列之前,发出的所有消息都被丢弃了。下面这个图比RabbitMQ官方的图更清楚——Queue是属于ReceiveMessage的一部分。

交换机既可以由消息发送端创建,也可以由消息消费者创建。
在程序设计上,需要规划好exchange的名称,以及如何使用key区分开不同类型的标记,在消息产生的地方插入发送消息代码。后端处理,可以针对每一个key启动一个或多个client,以提高消息处理的实时性。

 

AMQP中的基本概念:

Queue:队列,可以看做消息发送的目的地,接受消息的必备参数。若无consumer接受,将会一直存在服务器内存中。

Exchange:交换机,发送消息必须指定的参数,一般需要和routingkey组合路由到指定的队列中去。

ExchangeType:交换机类型,有四种:direct(严格按照key寻找queue),fanout(不需要key只要是绑定到该交换机的queue都能收到消息),topic(正则匹配key寻找queue),system(不常用),自定义(不常用)

RoutingKey:路由键,配合Exchange确定发送消息的目标队列,在Fanout类型的Exchange中忽略此参数。

Binding:绑定关系,将交换机与队列绑定,依据交换机类型确定不同参数。

Virtual hosts:虚拟机,感觉像是命名空间的概念,为了区分不同类别的资源

 

Spring-amqp是Spring为了方便开发RabbitMQ程序而做的一个第三方类库。

原创粉丝点击