rabbitmq 教程

RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka。(saltsatck底层采用的就是ZeroMq)

1)吞吐量(TPS):ZeroMq最好、RabbitMq 次之, ActiveMq 最差

2)持久化:ZeroMq不支持、RabbitMq和ActiveMq都支持

3)可用性、可靠性:RabbitMq最好,ActiveMq次之,ZeroMq最差

4)高并发:从实现语言来看,RabbitMQ最高,原因是它的实现语言是天生具备高并发高可用的erlang语言

# 安装配置epel源
   $ rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
 
# 安装erlang
   $ yum -y install erlang
 
# 安装RabbitMQ
   $ yum -y install rabbitmq-server
 
# 启动
service rabbitmq-server start/stop

# pip install pika
# or
# easy_install pika
# or
# 源码
 
# https://pypi.python.org/pypi/pika

生产者
import pika
# connection 一个TCP的连接、
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
 
#  channel 是建立在TCP连接中的一个虚拟连接
channel = connection.channel()
 
# 声明一个queue
channel.queue_declare(queue='hello')
# n RabbitMQ a message can never be sent directly to the queue, it always needs to go through an exchange.
channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

消费者
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
    'localhost'))
     
# connection 一个TCP的连接、 channel 是建立在TCP连接中的一个虚拟连接
channel = connection.channel()
 
# 再次声明原因是因为再包含众多队列的RabbitMQ里面 我们不确定此次使用的队列是否已经声明过
# 再次声明确保能够正常使用
channel.queue_declare(queue='hello')
 
# ch 管道内存地址
# 回调函数
def callback(ch, method, properties, body):
    print("---->", ch, method, properties)
    print(" [x] Received %r" % body)
     
# 开始消费消息
channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True  # 确认消息
                      )
                       
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()


no-ack = False 消息不丢失
no-ack = False,如果消费者遇到情况(its channel is closed, connection is closed, or TCP connection is lost)挂掉了,那么,RabbitMQ会重新将该任务添加到队列中。


消息持久化
#!/usr/bin/env python
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(host='10.0.0.111'))
channel = connection.channel()
 
# 消息持久化
channel.queue_declare(queue='hello', durable=True)
 
channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!',
                      # 消息持久化
                      properties=pika.BasicProperties(
                          delivery_mode=2,
                      ))
print(" [x] Sent 'Hello World!'")
connection.close()

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(host='10.0.0.111'))
channel = connection.channel()
  
channel.queue_declare(queue='hello', durable=True)
  
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    import time
    time.sleep(10)
    print 'ok'
    ch.basic_ack(delivery_tag = method.delivery_tag)
  
channel.basic_consume(callback,
                      queue='hello',
                      no_ack=False)
  
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

默认消息队列里的数据是按照顺序被消费者拿走,例如:消费者1 去队列中获取 奇数 序列的任务,消费者2去队列中获取 偶数 序列的任务。

Procuder Publish的Message进入了Exchange。接着通过“routing keys”, RabbitMQ会找到应该把这个Message放到哪个queue里。queue也是通过这个routing keys来做的绑定

有三种类型的Exchanges:direct, fanout,topic。 每个实现了不同的路由算法。

exchange type = fanout

关键字发送

wKioL1hieIvQuhQRAAElFTkGuFo345.png

exchange type = direct

模糊匹配

wKioL1hieJnSwIDkAAEBbojbJ00879.png

exchange type = topic

#   表示可以匹配 0 个 或 多个 单词
*  表示只能匹配 一个 单词


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值