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.消息的顺序性
消息的顺序性是指:消费者消费到的消息和发送者发布的消息的顺序是一致的。