| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> RabbitMQ php -> 正文阅读 |
|
[大数据]RabbitMQ php |
概念消息队列,一般我们会简称它为MQ(Message Queue),先不管消息(Message)这个词,来看看队列(Queue)。队列是一种先进先出的数据结构.消息队列可以简单理解为:把要传输的数据放在队列中。 应用场景为什么用消息队列?
解耦: 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。 解耦就是用数学方法将两种运动分离开来处理问题,常用解耦方法就是忽略或简化对所研究问题影响较小的一种运动,只分析主要的运动 削峰/限流: 应用在一些高并发的场景下,比如秒杀,抢票等场景 RabbitMq简介RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。 注意: RabbitMQ通过插件实现AMQP 1.0。但是,AMQP 1.0是与AMQP 0-9-1完全不同的协议,因此不适用于后者。因此RabbitMQ将继续无限期地支持AMQP 0-9-1 RabbitMq和Redis队列比较找到了一个说得得非常详细的文章 就不在这里写了 直接看看吧. https://www.cnblogs.com/chinaboard/p/3819533.html Rabbitmq使用介绍通常我们谈队列服务,会有三个概念:发消息者、队列、收消息者,Rabbitmq在这个基本概念上多做了一层抽象,在发消息者和队列之间,加入了消息交换机。这样发消息和队列就没有直接联系,转而变成发消息者把消息给消息交换机,交换器根据调度策略再把消息给消息交换机,消息交换机根据调度策略再把消息再给队列 RabbitMq队列服务的五个概念: 1)虚拟主机:一个虚拟主机持有一组消息交换机、队列和绑定。在Rabbitmq中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的消息交换机/队列/绑定,必须为A和B分别创建一个虚拟主机。每个Rabbitmq服务器都有一个默认的虚拟主机”/”。 2)消息:消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储), 最后,Rabbitmq的延迟队列也是通过消息头参数实现(x-delay) 3)绑定:也就是交换机需要和队列向绑定,用于消息队列和交换器之间的互联,可能一对一,一对多,多对一。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表 4)信道:多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的tcp连接内地虚拟连接。AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过通道完成。因为对于操作系统来说建立和销毁tcp都死非常昂贵的开销,所以引入了信道的概念,以复用一条tcp连接。 5)交换机:交换机用于转发消息,但它不会做存储,如果没有Quene bind到Exchange的话,它会直接丢弃掉Producer发送过来的消息。消息到交换机的时候,交换机会根据路由键转发到对应的队列中。 换机有四种类型:Direct, topic, Headers and Fanout Direct:direct 类型的行为是”先匹配, 再投送”. 即在绑定时设定一个 routing_key, 消息的routing_key 匹配时, 才会被交换器投送到绑定的队列中去. Topic:按规则转发消息(支持匹配最灵活)(* 可以代替一个单词。#可以替代零个或多个单词) Headers:设置header attribute参数类型的交换机 Fanout:转发消息到所有绑定队列 三类队列
死信队列:没有被及时消费的消息存放的队列 消息没有被及时消费的原因: a.消息被拒绝(basic.reject/ basic.nack)并且不再重新投递 requeue=false b.TTL(time-to-live) 消息超时未消费 c.达到最大队列长度 代码展示消息发布者
消息接收者
注事事项
问题
加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。因此,需要考虑的东西更多,复杂性增大 补充php版本在链接队列服务器的时候,需要显式设置心跳间隔,如果不设置则默认显式设置,则默认设置心跳间隔为0,如果服务端也是设置的0,则表示禁用心跳,参见文档 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/23 16:50:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |