首页 > 其他分享 > 消息队列Rabbitmq介绍、rabbitmq安装、基于queue实现生产者消费者、基本使用、消息安全(详见笔记)、持久化(详见笔记)、闲置消费(详见笔记)、发布订阅(详见笔记)、发布订阅高级之Ro

消息队列Rabbitmq介绍、rabbitmq安装、基于queue实现生产者消费者、基本使用、消息安全(详见笔记)、持久化(详见笔记)、闲置消费(详见笔记)、发布订阅(详见笔记)、发布订阅高级之Ro

时间:2023-05-06 14:46:38浏览次数:43  
标签:订阅 pika 笔记 队列 rabbitmq 详见 消息

目录

1 消息队列Rabbitmq介绍

# 消息队列
	-中间件---(概念很大)---》准确一些叫消息队列中间件
    -消息队列中间件
    
    -使用redis当做消息队列来用
    	-blpop 阻塞式弹出,实现队列,先进先出
        
        
# MQ ,消息队列,MessageQueue 是什么
	消息队列就是基础数据结构中的“先进先出”的一种数据机构。想一下,生活中买东西,需要排队,先排的人先买消费,就是典型的“先进先出”
    
# MQ解决什么问题
	-应用解耦
    -流量削峰
    -消息分发(发布订阅)
    -异步消息
    -IPC 进程间通信也可以通过消息队列
    
    
 # 

2 rabbitmq安装

# win:https://www.rabbitmq.com/install-windows-manual.html
	-erlang解释器
    -rabbitmq的软件

# centos
yum -y install erlang
yum -y install rabbitmq-server

# docker安装
docker pull rabbitmq:management
docker run -di --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management

# 访问虚拟机的15672端口,就可以看到图形化界面(官方提供的),手动点点点操作
http://10.0.0.101:15672/#/

3 基于queue实现生产者消费者

import Queue
import threading

message = Queue.Queue(10)

def producer(i):
    while True:
        message.put(i)

def consumer(i):
    while True:
        msg = message.get()

for i in range(12):
    t = threading.Thread(target=producer, args=(i,))
    t.start()

for i in range(10):
    t = threading.Thread(target=consumer, args=(i,))
    t.start()

4 基本使用

4.1 发送者

import pika

###第一步,连接
# 无密码
# connection = pika.BlockingConnection(pika.ConnectionParameters(host='10.0.0.101',port=5672))

# 有密码
credentials = pika.PlainCredentials("admin","admin")
connection = pika.BlockingConnection(pika.ConnectionParameters('10.0.0.101',credentials=credentials))

# 第二步:连接channal
channel = connection.channel()
# 第三步:创建一个队列,名字叫hello
channel.queue_declare(queue='hello')
# 第三步:向hello队列中,发送Hello World
# routing_key 队列名字
#body 发送的Neri
channel.basic_publish(exchange='', routing_key='hello', body='Hello World4441!')
print("  Sent 'Hello World!'")
connection.close()

4.2 消费者

import pika


# 连接rabbitmq
credentials = pika.PlainCredentials("admin", "admin")
connection = pika.BlockingConnection(pika.ConnectionParameters('10.0.0.101', credentials=credentials))
#假设队列不存在,创建
channel = connection.channel()
channel.queue_declare(queue='hello')


# 回调函数
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)


channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()  # 程序会夯在这里,等待从消息队列中取消息

5 消息安全(详见笔记)

# 消费完,确认后,再删除消息

6 持久化(详见笔记)

# queue和消息都要持久化

7 闲置消费(详见笔记)

# 正常情况如果有多个消费者,是按照顺序第一个消息给第一个消费者,第二个消息给第二个消费者
# 但是可能第一个消息的消费者处理消息很耗时,一直没结束,就可以让第二个消费者优先获得闲置的消息

8 发布订阅(详见笔记)

9 发布订阅高级之Routing(按关键字匹配)(详见笔记)

标签:订阅,pika,笔记,队列,rabbitmq,详见,消息
From: https://www.cnblogs.com/bnmm/p/17377228.html

相关文章

  • Hudi学习笔记(1)
    使用注意从0.10.0版本开始,primaryKey为必须的,不再支持没有主键的表。primaryKey、primaryKey和type均大小写敏感。对于MOR类型的表,preCombineField为必须的。当设置primaryKey、primaryKey或type等hudi配置时,tblproperties优先于options。使用S......
  • 外设驱动库开发笔记53:MAX31856热偶变送器驱动
      在我们的产品中经常有需要温度检测的地方,而热电偶温度检测电路是我们常用的。热电偶温度检测的方法很多,有时出于简单方便的考虑我们会选择热偶温度变送器来实现,这一篇我们就来讨论使用MAX31856热电偶温度变送器实现温度的检测。1、功能概述  MAX31856可以对任何类型热电偶的......
  • 差分约束学习笔记
    2023.5.6写的太烂了重新写差分约束系统定义差分约束系统是一种特殊的\(n\)元一次不等式组,它包含\(n\)个变量\(x_{1},x_{2},...,x_{n}\)以及\(m\)个约束条件,每一个约束条件都是两个其中的变量做差构成的,形如\(x_{i}-x_{j}\lec_{k}\),其中\(1\lei,j\len,i\nej,1\l......
  • Go笔记(十四):通道 channel
    1、通道通道channel是Go提供的一种用于各个协程(goroutine)之间的数据共享,保证数据同步交换的机制。协程是轻量级线程,类似于Java中的线程。2、通道的类型2.1、无缓冲通道用于同步通信,可保证在发送和接收数据时完成两个goroutine(协程)的数据交换。2.2、缓冲通道......
  • Go笔记(十五):并发编程
    一、协程的创建Go语言支持并发,只需要通过go关键字来开启goroutine(协程)即可。goroutine(协程)是轻量级线程,goroutine(协程)的调度是由Golang运行时进行管理的。goroutine语法格式(创建协程):go函数名(参数列表)示例代码如下:1packagemain2imp......
  • 5.5笔记
    1、格式化输入输出   CPU、内存、I/O设备在快速发展的过程中,有一个核心矛盾一直存在,就是三者之间的速度差异   平衡三者之间鸿沟的有效手段就是引入缓存   键盘---->stdin(内存,行缓冲区,标准输入缓冲区)---->程序---->stdout(内存,行缓冲区,标准输出缓冲区)---->屏幕 ......
  • Velocity----学习笔记
    Velocity判断空值方法:依据:$username与$!username的区别,当找不到username的时候,$username返回字符串"$username",而$!username返回空字符串""所以:#set($!username=='')可以判断字符串是否为空 以下为Velocity脚本摘要1、声明:#set($var=XXX)左边可以是以下的内容Variablereferen......
  • Go笔记(十三):包管理工具
    包管理工具,用来管理模块中包的依赖关系。下面来看看gomod的使用方法。1.1、初始化模块gomodinit项目模块名1.2、依赖关系处理,根据go.mod文件gomodtidy1.3、将依赖复制到项目下的vendor目录gomodvendor如果包被屏蔽(墙),随后使用gobuild-mod=vendo......
  • 【学习笔记】【题解】树形依赖 DP 选做
    地址:https://www.cnblogs.com/FReQuenter5156/p/shuxingyilaidp.html/简介这类背包本质上是分组背包问题。将一个节点的每一棵子树看作一组,进行分组背包。所谓分组背包,即在选择物品的时候,一开始将物品分为好几组,在选择时,可以从每一组中至多选择一件物品,问如何获得最大的价值,所......
  • Go笔记(十二):接口
    1、接口的声明Go语言中的接口是一种新的类型定义,拥有将具有共性的方法定义在一起的特性。任何其他类型只要实现了这些方法就是实现了这个接口。语法详情如下:/*定义接口*/typeinterface_nameinterface{method_name1[return_type]method_name2[return_type]......