RabbitMQ 笔记3 RabbitMQ .net客户端开发
1.连接Connection
实例化一个ConnectionFactory对象来创建连接,可以指定参数(IP,port, username, password)。也可以选择使用url的方式来实现。
2.创建信道Channel
Connection接口被用来创建一个Channel,创建后,Channel可以用来发送或者接收消息了。Connection可以用来创建多个Channel实例,但是Channel实例不能在线程间共享,应用程序应该为每一个线程开避一个Channel。
3. 使用交换器和队列
如果交换器的名称为空,则消息会被发送到Rabbitmq默认的交换器中。
声明队列可以服务器中预先创建好,能过管理界面,有利于开发和运维的分工,便 于相应资源管理。如果集群资源充足,而使用的队列占用的资源又在可控范围之内,为了增加业务程序的灵活性,也可以在业务程序中声明队列。可以通过队列来衡量当前Rabbitmq的QPS.
注意:生产者和消费者都可以声明一个交换器或者队列,如果尝试声明一个已经存在的交换器或者队列,只要声明的参数完全匹配现存的交换器或者队列,RabitMQ就可以什么都不做,并成功返回,如果声明的参数不匹配则会抛出异常。
4.消费模式
Rabbitmq的消费模式分两种: 推(push)模式和拉(pull)模式,推模式采用Basic.Consume进行消费,则拉模式则是调用Basic.Get进行消费。接收消息一般通过实现Consumer接口或者继续DefaultConsuer类来实现。
//推模式,推荐的,最方便的接收消息 var channel = conn.CreateModel(); var consumer = new EventingBasicConsumer(channel); consumer.Received += (ch, ea) => { var body = ea.Body; // ... process the message channel.BasicAck(ea.DeliveryTag, false); }; String consumerTag = channel.BasicConsume("", false, consumer);
//拉模式,使用此API提取消息效率相对较低 bool noAck = false; BasicGetResult result = channel.BasicGet("", noAck); if (result == null) { // No message available at this time. } else { IBasicProperties props = result.BasicProperties; byte[] body = result.Body; // ... process the message channel.BasicAck(result.DeliveryTag, false); }
注意:如果只想从队列获得单条消息而不是持续订阅,建议还是使用拉模式,但不能将BasicGet放在一个循环里来代替BasicConsume,这样做会严重影响Rabbitmq性能。如果要实现吞吐量,消费者理应使用Basic.Consume方法。
5.消息的确认和拒绝
channel.BasicConsume和channel.BasicGet都有个参数autoAck,都应该设置为false。在处理消息后才能使用channel.BasicAck来确认消息autoAck为true,当autoAck为true时,Rabbitmq会自动把发送出去的消息置为确认,然后从内存或磁盘中删除。
消息拒绝使用
//requeue:true时会重新将这条消息存入队列,以便发送给下一个订阅的消费者,如果设为false,消息会从队列中移除 channel.BasicReject(deliveryTag:0, requeue:true);
6. exchange Type
常见的exchange type 有以下几种:
- direct(明确的路由规则:消费端绑定的队列名称必须和消息发布时指定的路由名称一致)
- topic (模式匹配的路由规则:支持通配符)
- fanout (消息广播,将消息分发到exchange上绑定的所有队列上)
一般来说direct和topic用来具体的路由消息,如果要用广播的消息一般用fanout的exchange。header类型用的比较少。
7. channel.basicQos 服务质量保证
用于消费者设置信道上所能保持的最大未确认消息的数量。对拉模式消费无效。 参方法有三个参数
//每次消费的消息数,输入1,同时最多能处理1条消息,BasicAck后才能继续消费
channel.BasicQos(0, 1, false);
8.消息的顺序性
消息的顺序性是指:消费者消费到的消息和发送者发布的消息的顺序是一致的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2018-12-27 redis 系列27 Cluster高可用 (2)