| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> RabbitMQ学习初整理 -> 正文阅读 |
|
[大数据]RabbitMQ学习初整理 |
rabbitMQ是AMQP的实现,相关语义如下 Broker:提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输 Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列 Queue:消息的载体,每个消息都会被投到一个或多个队列 Bingding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来 Routing Key:路由关键字,exchange根据这个关键字进行消息投递 vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离 Producer:消息生产者,就是投递消息的程序 Consumer:消息消费者,就是接受消息的程序 Channel:消息通道,在客户端的每个连接里,可建立多个channel 核心概念 1:在mq领域中,producer将msg发送到queue,然后consumer通过消费quue完成P.C解耦 2:kafka是由producer决定msg发送到哪个queue 3:rabbitmq是由Exchange决定msg应该怎么样发送到目标queue,这就是binding及对应的策略 Exchange Direct Exchange:直接匹配,通过Exchange名称+RoutingKey来发送与接收消息 Fanout Exchange:广播订阅,向所有消费者发布消息,但只有消费者将队列绑定到该路由才能接收到消息,忽略RoutingKey Topic Exchange:主题匹配订阅,这里的主题指的是RoutingKey,RoutingKey可以采用通配符,如:*或#,RoutingKye命名采用" . " 来分割多个词,只有消息这将队列绑定到该路由且指定RoutingKey符合匹配规则时才能收到消息 Headers Exchange:消息头订阅,消息发布前为消息定义一个或多个键值对的消息头,然后消费者接收消息同时需要定义类似的键值对请求头(如:x-match=all 或 x-match=any),只有请求头与消息头匹配,才能接收消息,忽略RoutingKey 默认的Exchange:如果用空字符串去声明一个exchange,那么系统就会使用"amq.direct"这个exchange,我们创建一个queue时,默认的都会有一个和新建queue同名的routingKey绑定到这个默认的exchange上 RabbitMQ如何确保消息发送和消息接收 消息发送确认 1:ConfirmCallback ? ? ? ConfirmCallback是一个回调接口,消息发送到Broker后触发回调,确认消息是否到达Broker服务器,也就是只确认是否正确到达Exchange中 2:ReturnCallback ? ? ? 通过实现ReturnCallback接口,启动消息失败返回,此接口是在交换器路由不到队列时触发回调,该方法可以不使用,因为交换器和队列是在代码里绑定的,如果消息成功投递到Broker后几乎不存在绑定队列失败,除非代码写错 消息接收确认 RabbitMQ消息确认机制(ACK)默认是自动确认的,自动确认会在消息发送给消费者后立即确认,但存在丢失消息的可能,如果消费端消费逻辑抛出异常,假如你用回滚了也只是保证了数据的一致性,但是消息还是丢了,也就是消费端没有处理成功这条消息,那么就相当于丢失了消息 消缺确认模式 AcknowledgeMode.NODE:自动确认 AcknowledgeMode.AUTO:根据情况确认 AcknowledgeMode.MANUAL:手动确认 消费者收到消息后,手动调动Basic.Ack或Basic.Nack或Basic.Reject后,RabbitMQ收到这些消息后,才认为本次投递完成 Basic.Ack:用于确认当前消息 Basic.Nack:用于否定当前消息 Basic.Reject:用于拒绝当前消息 Nack,Reject后有能力要求是否requeue消息或者进入死信队列 RabbitMQ死信队列,延时队列 死信队列:DLX(Dead Letter Exchange)死信交换器 ? ? ? ? ? ? ? ? ? 当队列中的消息被拒绝,或者过期会变成死信,死信可以被重新发布到另一个交换器,这个交换器就是DLX,与DLX绑定的队列称为死信队列。 ? ? ? ? ? ? ? ? ? 造成死信的原因: ? ? ? ? ? ? ? ? ? ?1:信息被拒绝 ? ? ? ? ? ? ? ? ? ?2:信息超时 ? ? ? ? ? ? ? ? ? ? 3:超过了队列的最大长度 ? ? ? ? ? ? ? ? ? ?过期消息:在rabbitmq中存在2种可设置的过期时间,第一种通过对队列进行设置,该队列中的所有消息都存在相同的过期时间,第二中通过对消息本身进行设置,那么每条消息的过期时间都不一样。如果同时使用这2种方法,那么以过期时间小的那个数值为准。当消息达到过期时间还没有被消费,那么那个消息就成为了一个死信消息。 ? ? ? ? ? ? ? ? ? ?队列设置:在队列声明的时候使用x-message-ttl参数,单位为毫秒 ? ? ? ? ? ? ? ? ? ?单个消息设置:设置消息属性的expiration参数,单位为毫秒 延迟队列:延迟队列存储的是延迟消息 ? ? ? ? ? ? ? ? ? 1:延迟消息指的是,当消息被发布出去之后,并不立即投递给消费者,而是在指定时间之后投递。如:订单系统中,订单有30秒的付款时间,在订单超时之后再投递给消费者处理超时订单。 ? ? ? ? ? ? ? ? ?:2:rabbitMq没有直接支持延迟队列,可以通过死信队列实现。 ? ? ? ? ? ? ? ? ? ? ? ? 在死信队列中,可以为普通交换器绑定多个消息队列,假设绑定过期时间为5分钟,10分钟和30分钟,3个消息队列,然后为每个消息队列设置DLX,为每个DLX关联一个死信队列。当消息过期之后,被转存到对应的死信队列中,然后投递给指定的消费者消费 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/25 2:49:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |