RabbitMQ的使用总结

作为一个消息代理服务器,最核心重要的就是它的路由机制,RabbitMQ路由可分为交换器,队列和绑定,其中绑定应理解为一个规则,一个通过路由键来投递消息的规则。队列,消息,交换器,通过路由键粘合在了一起,找到了彼此。
队列通过路由键绑定到交换器,消息产生发送到消息代理服务器的时候,也有一个路由键,会根据路由键匹配对应的队列,匹配不到就进入黑洞
RabbitMQ存在四种交换器
  • dierct 直接将消息投递到对应的队列
  • fanout(分裂):可以将发送到多条路由键匹配的队列上
  • topic:它使得不同源头的消息能够到达同一个队列
  • hearders:现已几乎不使用
其中topic的话,可以通过类似于通配符的方式,通过一个队列来获取多种路由键投递的消息
例如queue_bind('msg','exchanges','*.msg-inbox')
可以匹配到任何xxx.msg-inbox路由键消息
如果需要匹配任何路由键的话,可使用#来实现
queue_bind('msg','exchanges','#')
队列的话,可以理解为一个邮箱,一个类似丰巢的东西,消息进去队列之后,就是等到主人来消费,就像等到快递被取走一样
其中消息创建后投递到交换器,队列创建后绑定交换器,中间用到最重要的一个东西叫信道(channel),通道是在tcp连接内部的一个通道,tcp连接与信道的关系类似于光缆和光纤的关系,一个tcp连接内部可以存在多个独立信道供rabbitMQ使用,它的出现主要是用来解决tcp连接,创建和销魂带来的资源消耗,如果全部用tcp来投递消息或者消费消息的话,频繁的创建和销毁tcp连接很快就会出现性能瓶颈。
用python代码来描述一下,连接rabbitMq的过程:
#传入用户以及密码
credentials = pika.PlainCredentials("username","password")

#连接到mq服务器上,其中virtual_host="test", 为一个test虚拟机
#rabbitmq的虚拟机类似一个迷你的mq
conn_params = pika.ConnectionParameters("192.168.1.104", port=5672, virtual_host="test", credentials=credentials)

# 获取信道
conn_broker = pika.BlockingConnection(conn_params)
channel = conn_broker.channel()

以上代码消息生产者和消息消费者一样

接下是生产者的,生产者主要是去创建消息,投递到交换器
#交换器不存在就创建一个
channel.exchange_declare(exchange = "hello-exchange",
exchange_type="direct",
passive=False,
durable=True,
auto_delete=False)
#创建文本消息
msg = sys.argv[1]#执行脚本的外部参数
msg_props = pika.BasicProperties()
msg_props.content_type = "text/plain"
msg_ids = [] #执行脚本的外部参数

#发布消息
ack = channel.basic_publish(body=msg,exchange="hello-exchange",properties=msg_props,routing_key="hola")对应
#为了保证消息被投递到对应的queue不被黑洞吃掉不自知,而跟踪消息的ack状态
if ack == True:
print ("put message to rabbitmq successed!" )
else:
print ("put message to rabbitmq failed")
#需要自己跟踪rabbitMq的id,rabbitMq的ID不是通过投递交换器后获得的,而是需要自己去跟踪获得
msg_ids.append(len(msg_ids)+1)
channel.close()

消费者主要做的是创建queue绑定到想要绑定的交换器,订阅对应路由键的消息,进行消费
声明队列
channel.queue_declare(queue="hello-queue",)
#绑定交换器
channel.queue_bind(queue="hello-queue",
exchange="hello-exchange",
routing_key="hola")
#消息处理函数
def msg_consumer(channel,method,header,body):
channel.basic_ack(delivery_tag=method.delivery_tag)
if body == b'quit':
channel.basic_cancel(consumer_tag="hello-consumer")
channel.stop_consuming()
else:
print(body)
return
#订阅消息
channel.basic_consume(msg_consumer,queue="hello-queue",consumer_tag="hello-consumer")
#开始消费
channel.start_consuming()

本文知识来源于《RabbitMQ实战》第二章的讲解,如果看不到我说的,建议看原书,基本看完该书第二章,基本就能使用RabbitMQ了,里面的代码实例使用python写的,但RabbitMQ支持多数主流语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值