RabbitMQ学习笔记一 基础

什么是rabbitmq

它用来接收消息,并将其进行转发。 你可以把它想象成一个邮局 你可以把它想象成一个邮局:当你把想要邮寄的邮件放到邮箱里后,邮递员就会把邮件最终送达到目的地。 在这个比喻中,RabbitMQ既代表了邮箱,也同时扮演着邮局和邮递员的角色.

AMQP

简介

AMQP 0-9-1 是一种高级消息队列协议,他使符合标准的客户端应用程序能够与符合标准的消息中间件进行通信。

三大组件

交换器:消息代理服务器中用于吧消息路由到队列的组件

队列:用来存储消息的数据结构

绑定:一套规则告诉交换机存储到那个队列

 模型简介

 模式

简单模式

简介:自己做自己的事情

工作模式

简介:一个消息发给多个消费者(竞争消费模式)

场景:短信通知服务,相当于之前是有人下单了交给一个短信服务处理,工作模式将短信服务消息先给消息队列,消息队列分发给多个短信服务处理(消费者)

发布订阅模式

简介:一次向多个消费者发送消息

场景:发布订阅模式因为所有消费者获得相同消息所以特别适合数据提供商和应用商

例如:中国气象局提供天气预报,送入交换机,网易,新浪,百度,搜狐等门户接入通过队列绑定到该交换机,自动获取气象局推送的气象数据

路由模式(direct)

 简介:根据key来传递,更好的区分消息,有选择的接收消息判断进入哪个队列

主题模式 (topic)

 简介:相较于路由模式,key的变化变多,更加灵活

#匹配一个或多个词,*匹配不多不少恰好一个词

例如:

item.# item.insert.abc 或者item.insert

item.*只能匹配item.insert

RPC

核心

交换机

类型

直连交换机(Direct)

根据消息携带的路由建将消息投递给对应的队列,直连交换机用来处理消息的单播路由

扇形交换机(Fanout)

将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键。如果N个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的拷贝分别发送给这所有的N个队列

主题交换机(Topic)

通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。主题交换机经常用来实现各种分发/订阅模式及其变种。主题交换机通常用来实现消息的多播路由

头交换机(Headers)

头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则

声明交换机

channel.ExchangeDeclare(exchange: "topic_logs",
                                    type: "topic");

exchange:交换机名称

type:交换机类型(Direct,Fanout,Topic,Headers)

队列

它们存储着即将被应用消费掉的消息。

channel.QueueDeclare(queue: "hello",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

queue:队列名称

durable:是否持久化,默认为否

autoDelete:当最后一个消费者断开连接之后队列是否删除,默认为false

exclusive:是否排外

arguments

x-message-ttl发送到队列的消息可以存活多长时间(毫秒)。
x-expires队列在被自动删除(毫秒)之前可以存活多长时间。
x-max-length队列中可以存储处于ready状态的消息数量
x-max-length-bytes队列中可以存储处于ready状态的消息占用的内存空间,单位:字节
x-overflow队列溢出行为,这将决定当队列达到设置的最大长度或者最大的存储空间时发送到消息队列的消息的处理方式;有效的值是:drop-head(删除queue头部的消息)、reject-publish(最近发来的消息将被丢弃)、reject-publish-dlx(拒绝发送消息到死信交换器)类型为quorum 的queue只支持drop-head;
x-dead-letter-exchange设置死信交换机的名称
x-dead-letter-routing-key设置死信交换机的路由键名称。如果未设置,将使用消息的原始路由密钥。
x-max-priority设置该队列中的消息的优先级最大值.发布消息的时候,可以指定消息的优先级,优先级高的先被消费.如果没有设置该参数,那么该队列不支持消息优先级功能.也就是说,就算发布消息的时候传入了优先级的值,也不会起什么作用.可设置0-255 ,一般设置为10即可
x-queue-mode{"x-queue-mode","lazy" }设置队列为懒人模式.该模式下的队列会先将交换机推送过来的消息(尽可能多的)保存在磁盘上,以减少内存的占用.当消费者开始消费的时候才加载到内存中;如果没有设置懒人模式,队列则会直接利用内存缓存,以最快的速度传递消息
x-queue-master-locator将队列设置为主位置模式,确定在节点集群上声明时队列主机所在的规则。

绑定

队列与交换机的绑定

channel.QueueBind(queue: queueName,
                  exchange: "logs",
                  routingKey: "");

queue:队列名称

exchange:交换机名称

routingKey:路由Key

发布消息

byte [] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes( "你好,世界!" );
channel.BasicPublish(exchange: "direct_logs",
                     routingKey: severity,
                     basicProperties: null,
                     body: messageBodyBytes );

exchange:交换机

routingKey:路由key

basicProperties:

app-id用于定义发送消息的应用程序
content-encoding指定你的消息体是否以某种特殊方式编码,如:zlib、deflate或Base64
content-type使用mime-types指定消息体的类型
correlation-id如果消息引用了某个其他消息或具有唯一标识的项目,那么correlation-id是指定这种引用关系的有效途径
deliverty-mode1存入内存中,2存入磁盘
expiration消息的过期时间
headers你可以使用他来添加消息的相关附加信息,也可以基于他使用路由
message-id唯一的标识符
priority队列中标识优先顺序的属性
timestamp表示消息的创建时间
type一个文本字符串用来在你的应用程序中描述消息或有效的负载类型
user-id一个自由格式的字符串,如果启用该属性,Rabbit将验证当前连接的用户,如果不排配时则丢弃消息

body:消息内容

消费方式

   消费有两种方式:

   Basic.Consume  推送,订阅以将消息传递给API  (推荐)

   Basic.Get 消费者轮训获取:这种方式效率非常低,在大多数情况应该避免

   注意:Basic.Consume 是Basic.Get 效率2倍,Basic.Get会导致每条消息都会产生与RabbitMQ同步通信开销。

实现:

 绑定消费方式是autoAck 为false为消息确认模式,true为自动确认模式

                _consumerChannel.BasicConsume(
                    queue: _queueName,
                    autoAck: false,
                    consumer: consumer);

消息确认

    消息确认有两种方式:

    使用basic.deliver或basic.get-ok方式,自动确认模式

    使用basic.ack方式,消费者确认模式,如果消费者没有发送确认就挂了,代理会将它发送下一个消费者

     通过服务质量控制消费者预取方式

      basic.ack响应发送消息确认是客户端浪RabbitMQ知道自己成功接收消息的一种方式,但是如果关闭消息确认那么有新的可用消息,Rabbit将会发送消息而不是等待,提升了吞吐量。如果对于可丢失消息而言的这种场景,这是提升吞吐量消费的理想方式,但是这也有可能出现问题就是当如果rabbit缓存了很多消息时,如果消费者应用程序接收消息有可能会导致消费者崩溃,所以为了更快的吞吐量我们可以使用服务质量(Qos)控制消费者预取方式

   可以在信道上发送Basic.Qos (设置预取总量和预取大小,但如果设置了no-ack选项,预取大小将被忽略),所以你可以将你的预期值调整到最佳状态(使用单个消费者,2500是最佳设置)使用Basic.Qos好处之一就是可以一次确认多个消息

   

实现:

  _consumerChannel.BasicAck(eventArgs.DeliveryTag, multiple: false);

拒绝消息

   拒绝消息时,应用程序可以要求代理丢弃或重新排队

参考

官网:https://www.rabbitmq.com/documentation.html

《深入RabbitMQ》

rabbitmq_特别注意篇 queueDeclare - 代达罗斯之殇 - 博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值