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.消息的顺序性

  消息的顺序性是指:消费者消费到的消息和发送者发布的消息的顺序是一致的。

posted on 2022-12-27 10:53  花阴偷移  阅读(23)  评论(0编辑  收藏  举报

导航