世界上最伟大的投资就是投资自己的教育

首页Ruby
随风 · 练气

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

随风发布于4148 次阅读

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 条回复
暂无回复~~
喜欢
统计信息
    学员: 29921
    视频数量: 1996
    文章数量: 526

© 汕尾市求知科技有限公司 | Rails365 Gitlab | 知乎 | b 站 | csdn

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top