消息队列介绍与RabbitMQ基本示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列介绍与RabbitMQ基本示例相关的知识,希望对你有一定的参考价值。

Python里面的消息机制是QUEUE,它与RabbitMQ干的事情是一样的,都是消息队列。QUEUE是传递消息的,典型的应用场景就是生产者、消费者模型。那么RabbitMQ到底与Python里的QUEUE有什么区别呢?
Python里的QUEUE分为"线程QUEUE"和进程"QUEUE",线程QUEUE只能够在不同线程之间进行交互,它不能跨进程;那进程QUEUE使用于父进程与子进程之间进行交互或者同属于同一父进程下的多个子进程之间进行交互。现在问题来了,如果两个独立的程序(进程),比如说python和java(生产者/消费者模式),这时候用QUEUE是不能满足这种场景需求的,现在就要使用RabbitMQ了。

技术分享图片
RabbitMQ的工作模式如上图所示,比如我两个独立的进程(QQ和word),两个进程间要想实现通信的话,可以借助磁盘,两个进程把消息写到磁盘再互相去读取,但是这样效率太低;还有一种办法就是自己写socket,这样做的话就是维护起来比较困难,还得处理一些粘包的问题;第三种办法就是采用一个中间的代理,两个进程都去连接这个代理,由代理去处理这些东西,有的伙伴会说,那还不如自己写socket呢。。。现在我要说,这个代理它是把socket封装好的,你使用起来就像直接send(XXX)就好了,不需要你再去考虑一些粘包问题和各种程序逻辑问题,而且如果有第三个进程(微信),只需要连接就好了,现在这个中间件的产品有RabbitMQ、ZeroMQ、ActiveMQ等等

    
    实现一个最简单的队列通信

技术分享图片



我是在win7上面安装的RabbitMQ,查看百度东拼西凑把服务安装好,有些乱,晚一些再把安装步骤整理出来。。。。

    
    接下来实现一下生产者端,代码的含义看注释:
import os

BASE_DIR = os.path.dirname(os.path.abspath(file))
import pika

#top1:此步骤只是建立了一个scoket,只是代表原生socket写好了
connection = pika.BlockingConnection(pika.ConnectionParameters(
‘localhost‘))

#top2:声明一个管道,在管道里发消息
channel = connection.channel()

# top3:在管道里声明queue,管道相当于路,路上得跑queue(队列)车
channel.queue_declare(queue=‘exclusive‘)

# top4:开始发消息,注意看是在管道里发消息
channel.basic_publish(exchange=‘‘,
routing_key=‘exclusive‘, #queue名称
body=‘Let s go!‘) #消息内容

connection.close() #关闭队列,不需要关闭管道

消费者端
import os
BASE_DIR = os.path.dirname(os.path.abspath(file))
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
‘localhost‘))
channel = connection.channel()

# 生产者和消费者都声明了队列,因为我们不知道谁先执行程序,如过客户端先执行但是没有声明队列的情况下会报错,声明一下会避免这种错误
channel.queue_declare(queue=‘exclusive‘)

#ch是管道的内存地址;method包含要把消息发给谁,发到哪个queue等信息;body是消息内容
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)



channel.basic_consume(#消费消息
callback, #如果收到消息,就调用callback函数来处理消息
queue=‘exclusive‘,
no_ack=True)
#此处的start只要一起动就一直运行了,因为它不止收一条
channel.start_consuming()

最后启动发送端和接收端程序看效果。

以上是关于消息队列介绍与RabbitMQ基本示例的主要内容,如果未能解决你的问题,请参考以下文章

消息队列介绍RabbitMQ&Redis的重点介绍与简单应用

rabbitmq - (消息队列) 的基本原理介绍

RabbitMQ:工作队列模式

RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ

rabbitmq学习:rabbitmq(消息队列)的作用以及rabbitmq之直连交换机

RabbitMQ基本示例