首页ruby
海外散仙厉飞雨 · 真仙

消息队列之 RabbitMQ 结合 bunny (二)

hfpp2012发布于

1. 介绍

RabbitMQ是使用Erlang编写的一个的消息队列,AMQP(Advanced Message Queue )的开源实现。它支持很多通信协议,比如STOMP、MQTT、AMQP 1.0、HTTP。它是比较重量级的,常用于企业的中大型项目。它主要用于同步消息,或者是进程间的消息传递。比如,对于一个大型的系统应用,各个模块或进程是如何通信的。传统的IPC(进程间通信)可以是在单一机器上,耦合性很大,而有很多情况不是这样。往往两个模块或子系统是分属于两台机器,这个时候就需要更加强大,可扩展性的解决方案。RabbitMQ就能解决这种问题,比如在web端可以把耗时的动作传给RabbitMQ来解决。

这种只是一般情况下的需求,其实利用redis的brpop,PostgreSQL的pgq的插件等也能实现,RabbitMQ既然有这么广泛的应用,它的特性还不止此,它在可靠性,数据的一致性,负载方面也是值得肯定的,因为这些都是大型的应用必须重视和解决的问题。

关于RabbitMQ更多的特性可以查看官方的这篇文档features

2. 安装

download这个页面有RabbitMQ的下载链接和安装方法。我是使用ubuntu系统来安装的。

编辑/etc/apt/sources.list这个文件,添加下面一行。

deb http://www.rabbitmq.com/debian/ testing main

然后安装即可。

wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc
sudo apt-get update
sudo apt-get install rabbitmq-server

3. 使用

我们会用RabbitMQ的ruby客户端工具bunny来实现一个基本的消息队列,也会解释下生产者消费者模型的基本原理。我也是多数消息队列中间件共同有的特征。

生产者消费者模式是这样的。首先,队列是有两端的,有头有尾,先进先出,然后有一个生产者,往队列填充数据,最后消费者从队列取出数据进行消费。打个比方,做买卖,你卖东西就是生产者,货品就是队列,消费者就是你的顾客。有人买就有人卖,店家想把货物买到柜台里,这个就相对于把商品入队,顾客去买商品,就是相当出队,把商品取出,由顾客带回家。

总结起来说,就是生产者是生产消息,队列是存储消息,消费者接收消息。

当然,这只是一般的生产者消费者模型,RabbitMQ为了更复杂的应用,还有一个叫交换者(exchange)的概念。

用bunny实现一个简单的消息队列,很简单。

#!/usr/bin/env ruby
# encoding: utf-8

require "rubygems"
require "bunny"

# 连接到RabbitMQ服务器
conn = Bunny.new
conn.start

# 创建通道
ch = conn.create_channel
# 创建队列,当队列被消费完就删除
q  = ch.queue("bunny.examples.hello_world", :auto_delete => true)
# 使用默认的交换器,交换器位于生产者和队列之间,是连接生产者和队列的路由方式。
x  = ch.default_exchange

# 消息者兼听和订阅消息
q.subscribe do |delivery_info, metadata, payload|
  puts "Received #{payload}"
end

# 生产者发送消息
x.publish("Hello!", :routing_key => q.name)

sleep 1.0
conn.close

首先创建了一个消息队列叫"bunny.examples.hello_world",然后往消息队列发送了消息"Hello!",也就是publish,subscribe是订阅,可以监听消息,并取出来。

结果是这样的。

Received Hello!

这种只是很普通的一对一的生产者消费者模式,还有类似于一对多的发布订阅模式,更有多对多的模式。

假如只有生产者和队列是无法实现一对多和多对多的,而只能通过一个叫交换器(exchange)的东西来实现。它就是生产者和队列的中间者,充当一个类似路由和转发的角色。比如,要实现一对多的模式,生产者先把消息传给交换器,交换器再和多个队列绑定在一起,只要消息传给该交换器的,交换器就会把它转发给绑定的队列,从而实现一对多的模式。

另外,RabbitMQ有个图形化的插件叫management。它可以用web界面来管理RabbitMQ。

完结。

本站帖子均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~

© 汕尾市求知科技有限公司 | 粤ICP备19038915号 | 在线学员:33

Top