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
};