Skip to content
docker search rabbitmq

docker pull rabbitmq

docker run -restart always -itd --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq

// 15672进入rabbitmq数据管理后台的
上面创建并运行容器后其实已经设置用户名和密码来登录15672: admin  admin

sun s.....t
// 5672是通过代码接口访问队列的

rabbitmq port 15672端口无法访问

docker exec -it rabbitmq bash

// 进入容器启用插件
rabbitmq-plugins enable rabbitmq_management

登录后台后,创建一个用户

 Users中 Add user,选择Tags,我暂时选项二的admin,相当于管理员

 Virtual Hosts中 Add virtual host

 点击Virtual Hosts中的Name , 在详情中然后将用户分配到Virtual Host中 选择用户 点击Set permission

Virtual Host 虚拟主机

 它是一个逻辑上的分组概念,用于对消息队列、交换器、绑定等资源进行隔离。每个 Virtual Host 本质上都是一个小型的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。这样设计的目的是为了在同一个 RabbitMQ 实例中支持多用户环境,使得不同的用户或应用能够在不互相干扰的情况下共享同一个 RabbitMQ 实例。

  使用 Virtual Host 的好处包括:

  隔离性:不同的 Virtual Host 之间是相互隔离的,一个 Virtual Host 中的配置、消息队列等不会影响到另一个 Virtual Host。

  安全性:可以对每个 Virtual Host 设置不同的访问控制,从而确保只有授权的用户可以访问特定的 Virtual Host。

  组织结构:通过 Virtual Host,可以按照项目、团队或应用的不同需求来组织消息队列,使结构更加清晰。

  在实际使用中,Virtual Host 是连接 RabbitMQ 时的一个参数,用户需要指定连接到哪个 Virtual Host。这样,用户或应用就能够仅访问该 Virtual Host 中的资源。

最简单的发布消息

持久化

// 声明交换器的持久化durable: true
channel.ExchangeDeclare("sun", ExchangeType.Fanout,durable:true, autoDelete: false);

//

fanout模式

- 发布订阅模式
- https://www.cnblogs.com/ysocean/p/9251884.html#_label2
- 广播模式:Fanout 交换机不考虑路由键(routing key)。当消息发送到 Fanout 交换机时,它会将消息广播到所有绑定到该交换机的队列。
- 
一个消费者将消息首先发送到交换器,交换器绑定到多个队列,然后被监听该队列的消费者所接收并消费。
在RabbitMQ中,交换器主要有四种类型:direct、fanout、topic、headers,这里的交换器是 fanout。
如果消息发送到没有队列绑定的交换器时,消息将丢失,因为交换器没有存储消息的能力,消息只能存储在队列中。

Direct模式

 - 路由模式
 - https://www.cnblogs.com/ysocean/p/9251884.html#_label3

 - 基于路由键匹配: Direct 交换机会根据消息的路由键和交换机上绑定的路由键进行匹配,只有当这两个键完全匹配时,消息才会被路由到对应的队列。
 - 适用场景: 这种类型的交换机适用于路由特定规则的消息传递。例如,可以根据不同的路由键将不同类型的消息发送到不同的队列。
 - 精确匹配: 消息必须有一个路由键,并且这个键需要与队列绑定时指定的路由键精确匹配,消息才能被正确地路由。

查看所有端口占用情况


// 查看所有端口占用情况
netstat -ntulp

netstat -ntulp |grep 15672

// 查看某个应用使用情况
ps -ef | grep nginx

// 找到某个端口后

linux 防火墙最强使用指南

.net core 下使用消息队列

pkill docker 
iptables -t nat -F 
ifconfig docker0 down 
brctl delbr docker0 
docker -d 
service docker restart

rabbitmq 种类

消息丢失

// 生成者生产消息的 确认机制
// 开启消息队列的持久化数据: rabbitmq重启后所有队列和消息都会消失
// 消费者ack确认消息消费成功: ack可自动确认消息,也可以进行手动确认消息的消费

消息的顺序性

// 对于需要消费保证顺序的,只需要部署一个消费者实例,即可保证消费消息的顺序性,再开启手动的ack确认机制

// 多个消费者实例是无法保证消费消息的有序性的

消息的重复消费

// 确保消息只执行一次,   幂等等操作(mysql的唯一键约束、通过redis对消费的消息进行记录、消费执行前进行redis查询确认、)

rabbit 集群搭建

参考文章

.net core 中链接rabbitmq

// 安装rabbitmq的客户端
dotnet add package RabbitMQ.Client

// 初始化RabbitMQ 连接
var factory = new ConnectionFactory() { HostName = "localhost" };

 this.connectionFactory = new ConnectionFactory
 {
     HostName = this.option.Host,
     Port = this.option.Port,
     DispatchConsumersAsync = true
 };

rabbitmq五种消息模型

rabbitmq 从零到高可用的集群