首页 > 其他分享 >RabbitMQ 入门教程

RabbitMQ 入门教程

时间:2024-09-02 08:55:17浏览次数:12  
标签:pika exchange 入门教程 RabbitMQ queue connection message channel

介绍

RabbitMQ 是一个开源的消息代理和队列服务器,实现了 AMQP 0-9-1 标准。它能够接收、存储并转发消息数据。

安装与配置

1. 安装 RabbitMQ

For Linux (Ubuntu/Debian)

```bash

sudo apt update

sudo apt install rabbitmq-server

```

For macOS (Homebrew)

```bash

brew install rabbitmq

```

2. 启动服务

```bash

rabbitmq-server

```

3. 配置环境变量

```bash

export RABBITMQ_NODENAME=my_rabbit

```

4. 开启管理插件

```bash

rabbitmq-plugins enable rabbitmq_management

```

5. 访问管理界面

- Open http://localhost:15672/

- Default credentials: guest/guest

发布/订阅模式

发布/订阅模式中,消息生产者不会直接将消息发送给队列。而是通过交换机(Exchange)来完成。

创建生产者

```python

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel()

channel.exchange_declare(exchange='logs', exchange_type='fanout')

message = "Hello World!"

channel.basic_publish(exchange='logs',

routing_key='',

body=message)

print(" [x] Sent %r" % message)

connection.close()

```

创建消费者

```python

import pika

def callback(ch, method, properties, body):

print(" [x] Received %r" % body)

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel()

channel.exchange_declare(exchange='logs', exchange_type='fanout')

result = channel.queue_declare(queue='', exclusive=True)

queue_name = result.method.queue

channel.queue_bind(exchange='logs', queue=queue_name)

channel.basic_consume(queue=queue_name,

on_message_callback=callback,

auto_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')

channel.start_consuming()

```

工作队列

工作队列可以将任务分发到多个工作者之间,以实现负载均衡。

创建生产者

```python

import pika

import time

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel()

channel.queue_declare(queue='task_queue', durable=True)

message = "Hello World!"

channel.basic_publish(exchange='',

routing_key='task_queue',

body=message,

properties=pika.BasicProperties(

delivery_mode=2, # make message persistent

))

print(" [x] Sent %r" % message)

connection.close()

```

创建消费者

```python

import pika

import time

def callback(ch, method, properties, body):

print(" [x] Received %r" % body)

time.sleep(body.count(b'.'))

print(" [x] Done")

ch.basic_ack(delivery_tag=method.delivery_tag)

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel()

channel.queue_declare(queue='task_queue', durable=True)

print(' [*] Waiting for messages. To exit press CTRL+C')

channel.basic_qos(prefetch_count=1)

channel.basic_consume(queue='task_queue',

on_message_callback=callback)

channel.start_consuming()

```

直接路由

直接路由模式允许消息被精确地路由到指定的队列。

创建生产者

```python

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel()

channel.exchange_declare(exchange='direct_logs', exchange_type='direct')

severity = 'info'

message = "Info: Hello World!"

channel.basic_publish(exchange='direct_logs',

routing_key=severity,

body=message)

print(" [x] Sent %r:%r" % (severity, message))

connection.close()

```

创建消费者

```python

import pika

def callback(ch, method, properties, body):

print(" [x] Received %r" % body)

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel()

channel.exchange_declare(exchange='direct_logs', exchange_type='direct')

result = channel.queue_declare(queue='', exclusive=True)

queue_name = result.method.queue

severities = ['error', 'info']

for severity in severities:

channel.queue_bind(exchange='direct_logs', queue=queue_name, routing_key=severity)

channel.basic_consume(queue=queue_name,

on_message_callback=callback,

auto_ack=True)

print(' [*] Waiting for logs. To exit press CTRL+C')

channel.start_consuming()

```

主题订阅

主题模式允许根据绑定键进行模糊匹配,从而将消息发送给多个队列。

创建生产者

```python

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel()

channel.exchange_declare(exchange='topic_logs', exchange_type='topic')

routing_key = 'kern.critical'

message = "A critical kernel error"

channel.basic_publish(exchange='topic_logs',

routing_key=routing_key,

body=message)

print(" [x] Sent %r:%r" % (routing_key, message))

connection.close()

```

创建消费者

```python

import pika

def callback(ch, method, properties, body):

print(" [x] %r:%r" % (method.routing_key, body))

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel()

channel.exchange_declare(exchange='topic_logs', exchange_type='topic')

result = channel.queue_declare(queue='', exclusive=True)

queue_name = result.method.queue

binding_keys = ['kern.*', '*.critical']

for binding_key in binding_keys:

channel.queue_bind(exchange='topic_logs', queue=queue_name, routing_key=binding_key)

channel.basic_consume(queue=queue_name,

on_message_callback=callback,

auto_ack=True)

print(' [*] Waiting for logs. To exit press CTRL+C')

channel.start_consuming()

```

标签:pika,exchange,入门教程,RabbitMQ,queue,connection,message,channel
From: https://blog.csdn.net/qq_40698086/article/details/141804804

相关文章

  • RabbitMQ 队列使用基础教程
    实践环境JDK1.8.0_121amqp-client5.16.0附:查看不同版本的amqp-client客户端支持的JavaJDK版本https://www.rabbitmq.com/client-libraries/java-versionsmavnsettings.xml<?xmlversion="1.0"encoding="UTF-8"?><settingsxsi:schemaLocation="h......
  • Java消息队列:RabbitMQ与Kafka的集成与应用
    Java消息队列:RabbitMQ与Kafka的集成与应用大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代的分布式系统中,消息队列是实现系统间通信、解耦和提高可扩展性的重要组件。RabbitMQ和Kafka是两个广泛使用的消息队列系统,它们各有特点和优势。本文将介......
  • Nautilus-NRP入门教程-ChatGPT翻译版
    原文链接快速开始指南这个快速开始指南将:指导你获取与NRP(NautilusResearchPlatform)进行交互所需的工具。配置你的Kubernetes客户端与NRP集群进行通信。显示查询NRP集群以查看正在运行的进程的命令。提供进一步提交作业和学习Kubernetes的资源。请注意容器......
  • 顶级的python入门教程!小白到大师,从这篇教程开始!
    1.为什么要学习Python?学习Python的原因有很多,以下是几个主要的原因:广泛应用:Python被广泛应用于Web开发、数据科学、人工智能、机器学习、自动化运维、网络爬虫、科学计算、游戏开发等多个领域。掌握Python意味着你可以在这些领域中找到丰富的职业机会。入门简单:Python的......
  • JDBC快速入门教程
    JDBC是什么?JDBCAPI是一个JavaAPI,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java数据库连接。JDBC库中所包含的API通常与数据库使用于:连接到数据库创建SQL或MySQL语句在数据库中执行SQL或MySQL查询查看和修改数据库中的数据记录使用JDBC前提条件......
  • RabbitMQ核心架构
    RabbitMQ架构设计 Producer:负责产生消息。Connection:RabbitMQ客户端和代理服务器之间的TCP连接。Channel:建立在连接之上的虚拟连接,RabbitMQ操作都是在信道中进行。Broker:一个Broker可以看做一个RabbitMQ服务节点或者服务实例。Exchange:生产者发送消息到交换器,交换......
  • RabbitMQ 集群与高可用性
    目录单节点与集群部署1.1.单节点部署1.2.集群部署 镜像队列1.定义与工作原理2.配置镜像队列3.应用场景4.优缺点5.Java示例分布式部署1.分布式部署的主要目标2.典型架构设计3.RabbitMQ分布式部署的关键技术4.部署策略和实践5.分布式部署的挑战和解......
  • ASP.NET Core 入门教程三 结合 EFCore 和 SQLite
    ASP.NETCore是一个开源的Web框架,它允许开发者轻松地构建现代、高性能的Web应用程序。EntityFrameworkCore(EFCore)是一个轻量级、可扩展的ORM(对象关系映射)框架,它支持多种数据库。SQLite是一个轻量级的嵌入式数据库,适用于小型应用程序。在本篇文章中,我们将学习如何......
  • rabbitmq实现用户关系绑定信息推送
    1.MQ三大要点交换机队列Key2.交换机  交换机是消息队列系统中的一个核心组件,主要用于将消息路由到一个或多个队列中。交换机通过不同的路由规则来决定消息的去向。根据不同的类型,交换机可以有不同的路由策略:直连交换机(DirectExchange):根据消息的路由键(RoutingKey......
  • 【Cesium入门教程】第四篇:Cesium 图元(Primitive)与高级特性
     往期回顾:【Cesium入门教程】第一篇:Cesium简介与快速入门【Cesium入门教程】第二篇:基础操作与地图控制【Cesium入门教程】第三篇:Cesium实体(Entity)与数据源(DataSources)图元(Primitive)的概念在Cesium中,图元(Primitive)是一种用于创建和操作三维几何形状的底层API。C......