RabbitMQ使用指南1MQ简介消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见角色大致也就有Producer(生产者)、Consumer(消费者)。常见的消息中间件产品:1).ActiveMQActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMSProvider实现。我们在本次课程中介绍ActiveMQ的使用。2).RabbitMQAMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。3).ZeroMQ史上最快的消息队列系统4).KafkaApache下的一个子项目。特点:高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统。适合处理海量数据2MQ作用1).解耦:中间件中的生产者只管发送消息,消费者只要从队列当中获取消息进行消费就可以,从而来实现业务的解耦。2).冗余存储:有些情况下,处理数据的过程会失败。消息中间件可以把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。在把一个消息从消息中间件中删除之前,需要你的处理系统明确地指出该消息己经被处理完成,从而确保你的数据被安全地保存直到你使用完毕。3).可恢复性:当系统一部分组件失效时,不会影响到整个系统。消息中间件降低了进程间的稿合度,所以即使一个处理消息的进程挂掉,加入消息中间件中的消息仍然可以在系统恢复后进行处理。4).顺序保证:在大多数使用场景下,数据处理的顺序很重要,大部分消息中间件支持一定程度上的顺序性。5).缓冲:在任何重要的系统中,都会存在需要不同处理时间的元素。消息中间件通过一个缓冲层来帮助任务最高效率地执行,写入消息中间件的处理会尽可能快速。6).异步通信:在很多时候应用不想也不需要立即处理消息。消息中间件提供了异步处理机制,允许应用把一些消息放入消息中间件中,但并不立即处理它,在之后需要的时候再慢慢处理。3RabbitMQ安装及启动3.1安装依赖环境rpm-ivherlang-20.3.8.6-1.el6.x86_64.rpmyum-yinstallepel-releaseyum-yinstallsocat3.2安装rabbitMQrpm-ivhrabbitmq-server-3.7.7-1.el6.noarch.rpm3.3添加用户默认情况下管理界面只能在Linux系统本机可以访问,如果想其他的主机也能访问需要配置:rabbitmq-pluginsenablerabbitmq_management添加访问用户:rabbitmqctladd_useradminadmin3.4RabbitMQ启动/停止启动:servicerabbitmq-serverstart停止:servicerabbitmq-serverstop查看状态:servicerabbitmq-serverstatus4RabbitMQ管理界面访问4.1Overview概要该栏目主要展示的是MQ的概要信息,如消息的数量,Connection,Channel,Exchange,Queue,Consumer的数量.4.2Exchange交换器该栏目主要展示的是当前虚拟主机下的交换器,也可以在此添加一个新的交换器,并且配置对应的交换器的规则属性。4.3Queues队列该栏目展示的是消息队列的信息,里面有各个队列的概要信息,也可以在此栏目添加队列Queue4.4Admin系统管理该栏目展示的是用户管理的信息,包含用户列表的展示,添加用户,添加虚拟主机等信息5RabbitMQ的相关概念5.1生产者与消费者5.1.1生产者Producer:生产者,就是投递消息的一方。生产者创建消息,然后发布到RabbitMQ中。消息一般可以包含2个部分:消息体和标签(Label)。消息体也可以称之为payload,在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个JSON字符串。当然可以进一步对这个消息体进行序列化操作。消息的标签用来表述这条消息,比如一个交换器的名称和一个路由键。生产者把消息交由RabbitMQ,RabbitMQ之后会根据标签把消息发送给感兴趣的消费者(Consumer)。5.1.2消费者Consumer:消费者,就是接收消息的一方。消费者连接到RabbitMQ服务器,并订阅到队列上。当消费者消费一条消息时,只是消费消息的消息体(payload)。在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者也只会消费到消息体,也就不知道消息的生产者是谁,当然消费者也不需要知道。5.2队列Queue:队列,是RabbitMQ的内部对象,用于存储消息。5.3交换器,路由键,绑定5.3.1交换器Exchange:交换器。在上图中我们暂时可以理解成生产者将消息投递到队列中,实际上这个在RabbitMQ中不会发生。真实情况是,生产者将消息发送到Exchange(交换器),由交换器将消息路由到一个或者多个队列中。如果路由不到,或许会返回给生产者,或许直接丢弃。这里可以将RabbitMQ中的交换器看作一个简单的实体。RabbitMQ中的交换器有四种类型,四种类型分别是fanout、direct、topic、headers,不同的类型有着不同的路由策略。5.3.2路由键RoutingKey:路由键。生产者将消息发给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则,而这个RoutingKey需要与交换器类型和绑定键(BindingKey)联和使用才能最终生效。在交换器类型和绑定键(BindingKey)固定的情况下,生产者可以在发送消息给交换器时,通过指定RoutingKey来决定消息流向哪里。5.3.3绑定Binding:绑定。RabbitMQ中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey),这样RabbitMQ就知道如何正确地将消息路由到队列了。5.4交换器类型1).fanout:它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。2).direct:该类型的交换器路由规则也很简单,它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。3).topic:前面讲到direct类型的交换器路由规则是完全匹配BindingKeytopic类型的交换器在匹配规则上进行了扩展,它与direct类型的交换器相似,也是将消息路由到BindingKey和RoutingKey相匹配的队列中,但这里的匹配规则有些不同,它约定:RoutingKey为一个点号.分割的字符串,如: