消息队列
- 一、使用消息队列的场景
- 1.1、消息队列的异步处理
- 1.2、消息队列的流量控制(削峰)
- 1.3、消息队列的服务解耦
- 1.4、消息队列的发布订阅
- 1.5、消息队列的高并发缓冲
- 二、消息队列的基本概念和原理
- 2.1、消息的生产者和消费者
- 2.2、Broker
- 2.3、点对点消息队列模型 ----- 线程池
- 2.4、发布订阅消息模型
- 2.5、消息的顺序性保证
- 2.6、消息的ACK确认机制
- 2.7、消息的持久化
- 2.8、消息的同步和异步收发
- 2.9、消费组的概念
- 三、消息队列产品
一、使用消息队列的场景
- 异步处理。
- 流量控制。
- 服务解耦。
- 发布订阅。
- 高并发缓冲。
1.1、消息队列的异步处理
主要应用于短信通知、终端状态推送、App推送、用户注册等。
同步处理:
#mermaid-svg-Xn2iViK2tjB4mOsG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Xn2iViK2tjB4mOsG .error-icon{fill:#552222;}#mermaid-svg-Xn2iViK2tjB4mOsG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Xn2iViK2tjB4mOsG .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Xn2iViK2tjB4mOsG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Xn2iViK2tjB4mOsG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Xn2iViK2tjB4mOsG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Xn2iViK2tjB4mOsG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Xn2iViK2tjB4mOsG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Xn2iViK2tjB4mOsG .marker.cross{stroke:#333333;}#mermaid-svg-Xn2iViK2tjB4mOsG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Xn2iViK2tjB4mOsG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Xn2iViK2tjB4mOsG .cluster-label text{fill:#333;}#mermaid-svg-Xn2iViK2tjB4mOsG .cluster-label span{color:#333;}#mermaid-svg-Xn2iViK2tjB4mOsG .label text,#mermaid-svg-Xn2iViK2tjB4mOsG span{fill:#333;color:#333;}#mermaid-svg-Xn2iViK2tjB4mOsG .node rect,#mermaid-svg-Xn2iViK2tjB4mOsG .node circle,#mermaid-svg-Xn2iViK2tjB4mOsG .node ellipse,#mermaid-svg-Xn2iViK2tjB4mOsG .node polygon,#mermaid-svg-Xn2iViK2tjB4mOsG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Xn2iViK2tjB4mOsG .node .label{text-align:center;}#mermaid-svg-Xn2iViK2tjB4mOsG .node.clickable{cursor:pointer;}#mermaid-svg-Xn2iViK2tjB4mOsG .arrowheadPath{fill:#333333;}#mermaid-svg-Xn2iViK2tjB4mOsG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Xn2iViK2tjB4mOsG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Xn2iViK2tjB4mOsG .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Xn2iViK2tjB4mOsG .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Xn2iViK2tjB4mOsG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Xn2iViK2tjB4mOsG .cluster text{fill:#333;}#mermaid-svg-Xn2iViK2tjB4mOsG .cluster span{color:#333;}#mermaid-svg-Xn2iViK2tjB4mOsG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Xn2iViK2tjB4mOsG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
APP
网关
风控
库存
订单
短信
统计
异步处理:
#mermaid-svg-oGzzdWk8IWptdRyB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oGzzdWk8IWptdRyB .error-icon{fill:#552222;}#mermaid-svg-oGzzdWk8IWptdRyB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oGzzdWk8IWptdRyB .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-oGzzdWk8IWptdRyB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oGzzdWk8IWptdRyB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oGzzdWk8IWptdRyB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oGzzdWk8IWptdRyB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oGzzdWk8IWptdRyB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oGzzdWk8IWptdRyB .marker.cross{stroke:#333333;}#mermaid-svg-oGzzdWk8IWptdRyB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oGzzdWk8IWptdRyB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oGzzdWk8IWptdRyB .cluster-label text{fill:#333;}#mermaid-svg-oGzzdWk8IWptdRyB .cluster-label span{color:#333;}#mermaid-svg-oGzzdWk8IWptdRyB .label text,#mermaid-svg-oGzzdWk8IWptdRyB span{fill:#333;color:#333;}#mermaid-svg-oGzzdWk8IWptdRyB .node rect,#mermaid-svg-oGzzdWk8IWptdRyB .node circle,#mermaid-svg-oGzzdWk8IWptdRyB .node ellipse,#mermaid-svg-oGzzdWk8IWptdRyB .node polygon,#mermaid-svg-oGzzdWk8IWptdRyB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oGzzdWk8IWptdRyB .node .label{text-align:center;}#mermaid-svg-oGzzdWk8IWptdRyB .node.clickable{cursor:pointer;}#mermaid-svg-oGzzdWk8IWptdRyB .arrowheadPath{fill:#333333;}#mermaid-svg-oGzzdWk8IWptdRyB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oGzzdWk8IWptdRyB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oGzzdWk8IWptdRyB .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-oGzzdWk8IWptdRyB .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-oGzzdWk8IWptdRyB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oGzzdWk8IWptdRyB .cluster text{fill:#333;}#mermaid-svg-oGzzdWk8IWptdRyB .cluster span{color:#333;}#mermaid-svg-oGzzdWk8IWptdRyB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oGzzdWk8IWptdRyB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
生产
消费
消费
消费
APP
网关
风控
库存
消息队列
订单
短信
统计
异步处理的优势:更快速返回结果;减少等待,实现并发处理,提升系统总体性能。
消息队列的模式可以有:
(1)1对1:读取之后立刻从队列中移除消息。
(2)1对多:这种模型是发布订阅模型,消息队列的元素可以被重复消费。至于何时删除消息,可以设置消息的存活周期;比如kafka可以设置24H后删除消息。
1.2、消息队列的流量控制(削峰)
在秒杀场景下的下单状态,使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的。
#mermaid-svg-zNhSxXhmdTZ0jKQz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zNhSxXhmdTZ0jKQz .error-icon{fill:#552222;}#mermaid-svg-zNhSxXhmdTZ0jKQz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zNhSxXhmdTZ0jKQz .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-zNhSxXhmdTZ0jKQz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zNhSxXhmdTZ0jKQz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zNhSxXhmdTZ0jKQz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zNhSxXhmdTZ0jKQz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zNhSxXhmdTZ0jKQz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zNhSxXhmdTZ0jKQz .marker.cross{stroke:#333333;}#mermaid-svg-zNhSxXhmdTZ0jKQz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zNhSxXhmdTZ0jKQz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zNhSxXhmdTZ0jKQz .cluster-label text{fill:#333;}#mermaid-svg-zNhSxXhmdTZ0jKQz .cluster-label span{color:#333;}#mermaid-svg-zNhSxXhmdTZ0jKQz .label text,#mermaid-svg-zNhSxXhmdTZ0jKQz span{fill:#333;color:#333;}#mermaid-svg-zNhSxXhmdTZ0jKQz .node rect,#mermaid-svg-zNhSxXhmdTZ0jKQz .node circle,#mermaid-svg-zNhSxXhmdTZ0jKQz .node ellipse,#mermaid-svg-zNhSxXhmdTZ0jKQz .node polygon,#mermaid-svg-zNhSxXhmdTZ0jKQz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zNhSxXhmdTZ0jKQz .node .label{text-align:center;}#mermaid-svg-zNhSxXhmdTZ0jKQz .node.clickable{cursor:pointer;}#mermaid-svg-zNhSxXhmdTZ0jKQz .arrowheadPath{fill:#333333;}#mermaid-svg-zNhSxXhmdTZ0jKQz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zNhSxXhmdTZ0jKQz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zNhSxXhmdTZ0jKQz .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-zNhSxXhmdTZ0jKQz .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-zNhSxXhmdTZ0jKQz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zNhSxXhmdTZ0jKQz .cluster text{fill:#333;}#mermaid-svg-zNhSxXhmdTZ0jKQz .cluster span{color:#333;}#mermaid-svg-zNhSxXhmdTZ0jKQz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zNhSxXhmdTZ0jKQz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
生产
消费
APP
网关
消息队列
秒杀服务
设置消息队列的最大限制数量,在达到最大数量时网关不再生成消息到消息队列中。
可以这么想:有一个商品秒杀活动,商品数量为100,当消息队列的数量达到100时不再生产秒杀成功消息,直接返回秒杀失败给用户,只有1到100的用户秒杀成功 获得商品。
1.3、消息队列的服务解耦
A系统负责数据分发,其他系统调用A系统提供的接口处理数据;当新增一个系统时,A系统需要改代码调用新的系统,并实现新的接口给新的系统去调用。这种方式是系统间高度耦合。
#mermaid-svg-LuwaaSeri7LwUQIm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LuwaaSeri7LwUQIm .error-icon{fill:#552222;}#mermaid-svg-LuwaaSeri7LwUQIm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LuwaaSeri7LwUQIm .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-LuwaaSeri7LwUQIm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LuwaaSeri7LwUQIm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LuwaaSeri7LwUQIm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LuwaaSeri7LwUQIm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LuwaaSeri7LwUQIm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LuwaaSeri7LwUQIm .marker.cross{stroke:#333333;}#mermaid-svg-LuwaaSeri7LwUQIm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LuwaaSeri7LwUQIm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LuwaaSeri7LwUQIm .cluster-label text{fill:#333;}#mermaid-svg-LuwaaSeri7LwUQIm .cluster-label span{color:#333;}#mermaid-svg-LuwaaSeri7LwUQIm .label text,#mermaid-svg-LuwaaSeri7LwUQIm span{fill:#333;color:#333;}#mermaid-svg-LuwaaSeri7LwUQIm .node rect,#mermaid-svg-LuwaaSeri7LwUQIm .node circle,#mermaid-svg-LuwaaSeri7LwUQIm .node ellipse,#mermaid-svg-LuwaaSeri7LwUQIm .node polygon,#mermaid-svg-LuwaaSeri7LwUQIm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LuwaaSeri7LwUQIm .node .label{text-align:center;}#mermaid-svg-LuwaaSeri7LwUQIm .node.clickable{cursor:pointer;}#mermaid-svg-LuwaaSeri7LwUQIm .arrowheadPath{fill:#333333;}#mermaid-svg-LuwaaSeri7LwUQIm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LuwaaSeri7LwUQIm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LuwaaSeri7LwUQIm .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-LuwaaSeri7LwUQIm .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-LuwaaSeri7LwUQIm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LuwaaSeri7LwUQIm .cluster text{fill:#333;}#mermaid-svg-LuwaaSeri7LwUQIm .cluster span{color:#333;}#mermaid-svg-LuwaaSeri7LwUQIm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LuwaaSeri7LwUQIm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
调用接口
调用接口
调用接口
调用接口
A系统
B系统
C系统
D系统
E系统(新增)
使用消息队列,A系统负责将数据分发到MQ,消费端根据需要从MQ获取消息即可,不需要就取消MQ的消费。
#mermaid-svg-CKvjxCGKCqtUvnWE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CKvjxCGKCqtUvnWE .error-icon{fill:#552222;}#mermaid-svg-CKvjxCGKCqtUvnWE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CKvjxCGKCqtUvnWE .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-CKvjxCGKCqtUvnWE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CKvjxCGKCqtUvnWE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CKvjxCGKCqtUvnWE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CKvjxCGKCqtUvnWE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CKvjxCGKCqtUvnWE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CKvjxCGKCqtUvnWE .marker.cross{stroke:#333333;}#mermaid-svg-CKvjxCGKCqtUvnWE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CKvjxCGKCqtUvnWE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CKvjxCGKCqtUvnWE .cluster-label text{fill:#333;}#mermaid-svg-CKvjxCGKCqtUvnWE .cluster-label span{color:#333;}#mermaid-svg-CKvjxCGKCqtUvnWE .label text,#mermaid-svg-CKvjxCGKCqtUvnWE span{fill:#333;color:#333;}#mermaid-svg-CKvjxCGKCqtUvnWE .node rect,#mermaid-svg-CKvjxCGKCqtUvnWE .node circle,#mermaid-svg-CKvjxCGKCqtUvnWE .node ellipse,#mermaid-svg-CKvjxCGKCqtUvnWE .node polygon,#mermaid-svg-CKvjxCGKCqtUvnWE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CKvjxCGKCqtUvnWE .node .label{text-align:center;}#mermaid-svg-CKvjxCGKCqtUvnWE .node.clickable{cursor:pointer;}#mermaid-svg-CKvjxCGKCqtUvnWE .arrowheadPath{fill:#333333;}#mermaid-svg-CKvjxCGKCqtUvnWE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CKvjxCGKCqtUvnWE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CKvjxCGKCqtUvnWE .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-CKvjxCGKCqtUvnWE .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-CKvjxCGKCqtUvnWE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CKvjxCGKCqtUvnWE .cluster text{fill:#333;}#mermaid-svg-CKvjxCGKCqtUvnWE .cluster span{color:#333;}#mermaid-svg-CKvjxCGKCqtUvnWE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CKvjxCGKCqtUvnWE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
消费
消费
消费
消费
A系统
消息队列
B系统
C系统
D系统
E系统(新增)
1.4、消息队列的发布订阅
用户需要先去注册,才能收到相关消息。
#mermaid-svg-iUokhCS8Tl1ugu2o {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iUokhCS8Tl1ugu2o .error-icon{fill:#552222;}#mermaid-svg-iUokhCS8Tl1ugu2o .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iUokhCS8Tl1ugu2o .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-iUokhCS8Tl1ugu2o .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iUokhCS8Tl1ugu2o .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iUokhCS8Tl1ugu2o .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iUokhCS8Tl1ugu2o .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iUokhCS8Tl1ugu2o .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iUokhCS8Tl1ugu2o .marker.cross{stroke:#333333;}#mermaid-svg-iUokhCS8Tl1ugu2o svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iUokhCS8Tl1ugu2o .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iUokhCS8Tl1ugu2o .cluster-label text{fill:#333;}#mermaid-svg-iUokhCS8Tl1ugu2o .cluster-label span{color:#333;}#mermaid-svg-iUokhCS8Tl1ugu2o .label text,#mermaid-svg-iUokhCS8Tl1ugu2o span{fill:#333;color:#333;}#mermaid-svg-iUokhCS8Tl1ugu2o .node rect,#mermaid-svg-iUokhCS8Tl1ugu2o .node circle,#mermaid-svg-iUokhCS8Tl1ugu2o .node ellipse,#mermaid-svg-iUokhCS8Tl1ugu2o .node polygon,#mermaid-svg-iUokhCS8Tl1ugu2o .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iUokhCS8Tl1ugu2o .node .label{text-align:center;}#mermaid-svg-iUokhCS8Tl1ugu2o .node.clickable{cursor:pointer;}#mermaid-svg-iUokhCS8Tl1ugu2o .arrowheadPath{fill:#333333;}#mermaid-svg-iUokhCS8Tl1ugu2o .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iUokhCS8Tl1ugu2o .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iUokhCS8Tl1ugu2o .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-iUokhCS8Tl1ugu2o .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-iUokhCS8Tl1ugu2o .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iUokhCS8Tl1ugu2o .cluster text{fill:#333;}#mermaid-svg-iUokhCS8Tl1ugu2o .cluster span{color:#333;}#mermaid-svg-iUokhCS8Tl1ugu2o div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iUokhCS8Tl1ugu2o :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
消费
消费
消费
订阅
系统
消息队列
B系统
C系统
D系统
E系统(新增)
比如游戏里面跨服:
(1) 广播今天整体还剩多少把屠龙刀可以暴。
(2) 广播用户暴的屠龙刀的消息。
1.5、消息队列的高并发缓冲
这个和消息队列的流量控制(削峰)有些类似。区别在于,这里没有大小限流,可能在某个时间点会出现超过后端处理能力的访问;比如后端处理能力是50000每秒,在某个时间点出现每秒80000的访问,这就可能造成击穿。
针对此情况,消息全部放入消息队列,消息队列提供可以把数据固化到磁盘的能力,降低高峰数据对后端的短暂冲击。
#mermaid-svg-bgxgWklwkVHPrSyP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bgxgWklwkVHPrSyP .error-icon{fill:#552222;}#mermaid-svg-bgxgWklwkVHPrSyP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bgxgWklwkVHPrSyP .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-bgxgWklwkVHPrSyP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bgxgWklwkVHPrSyP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bgxgWklwkVHPrSyP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bgxgWklwkVHPrSyP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bgxgWklwkVHPrSyP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bgxgWklwkVHPrSyP .marker.cross{stroke:#333333;}#mermaid-svg-bgxgWklwkVHPrSyP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bgxgWklwkVHPrSyP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bgxgWklwkVHPrSyP .cluster-label text{fill:#333;}#mermaid-svg-bgxgWklwkVHPrSyP .cluster-label span{color:#333;}#mermaid-svg-bgxgWklwkVHPrSyP .label text,#mermaid-svg-bgxgWklwkVHPrSyP span{fill:#333;color:#333;}#mermaid-svg-bgxgWklwkVHPrSyP .node rect,#mermaid-svg-bgxgWklwkVHPrSyP .node circle,#mermaid-svg-bgxgWklwkVHPrSyP .node ellipse,#mermaid-svg-bgxgWklwkVHPrSyP .node polygon,#mermaid-svg-bgxgWklwkVHPrSyP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bgxgWklwkVHPrSyP .node .label{text-align:center;}#mermaid-svg-bgxgWklwkVHPrSyP .node.clickable{cursor:pointer;}#mermaid-svg-bgxgWklwkVHPrSyP .arrowheadPath{fill:#333333;}#mermaid-svg-bgxgWklwkVHPrSyP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bgxgWklwkVHPrSyP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bgxgWklwkVHPrSyP .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-bgxgWklwkVHPrSyP .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-bgxgWklwkVHPrSyP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bgxgWklwkVHPrSyP .cluster text{fill:#333;}#mermaid-svg-bgxgWklwkVHPrSyP .cluster span{color:#333;}#mermaid-svg-bgxgWklwkVHPrSyP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bgxgWklwkVHPrSyP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
生产
消费
短暂高峰时缓存
短暂高峰退去后恢复
APP
网关
消息队列
后端服务
磁盘
比如,后端处理能力50000,某个短暂时间点(比如一秒的时间)数据访问达到80000,消息队列将多的数据缓存到磁盘,后端仍然处理50000数据;冲击点退去后,访问数据降到了30000,那么消息队列将把缓存的数据放到后端处理。
比如kafka 日志服务、监控上报。
二、消息队列的基本概念和原理
消息队列全称MessageQueue,简称MQ。本质是一个队列,FIFO先进先出,只不过队列中存放的内容是message,从而称为消息队列(消息+队列)。
主要用途:不同服务server、进程process、线程thread之间通信。
2.1、消息的生产者和消费者
消息生产者Producer:发送消息到消息队列。
消息消费者Consumer:从消息队列接收消息。
被动接受消息 s->c。
主动拉取消息 s<- c pull。
通常,是由消费者Consumer去拉取消息,避免采用推送的方式。因为服务端不知道消费者的处理能力,可能会造成数据丢失。
2.2、Broker
Broker的概念来自与Apache ActiveMQ,通俗的讲就是MQ的服务器。一般来说,一个服务器机器只有一个Broker,不要出现多个Broker。
如果有多个Broker,可以采用集群的方式。
#mermaid-svg-FmOydPx6aJSPImZy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FmOydPx6aJSPImZy .error-icon{fill:#552222;}#mermaid-svg-FmOydPx6aJSPImZy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FmOydPx6aJSPImZy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-FmOydPx6aJSPImZy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FmOydPx6aJSPImZy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FmOydPx6aJSPImZy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FmOydPx6aJSPImZy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FmOydPx6aJSPImZy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FmOydPx6aJSPImZy .marker.cross{stroke:#333333;}#mermaid-svg-FmOydPx6aJSPImZy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FmOydPx6aJSPImZy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FmOydPx6aJSPImZy .cluster-label text{fill:#333;}#mermaid-svg-FmOydPx6aJSPImZy .cluster-label span{color:#333;}#mermaid-svg-FmOydPx6aJSPImZy .label text,#mermaid-svg-FmOydPx6aJSPImZy span{fill:#333;color:#333;}#mermaid-svg-FmOydPx6aJSPImZy .node rect,#mermaid-svg-FmOydPx6aJSPImZy .node circle,#mermaid-svg-FmOydPx6aJSPImZy .node ellipse,#mermaid-svg-FmOydPx6aJSPImZy .node polygon,#mermaid-svg-FmOydPx6aJSPImZy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FmOydPx6aJSPImZy .node .label{text-align:center;}#mermaid-svg-FmOydPx6aJSPImZy .node.clickable{cursor:pointer;}#mermaid-svg-FmOydPx6aJSPImZy .arrowheadPath{fill:#333333;}#mermaid-svg-FmOydPx6aJSPImZy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FmOydPx6aJSPImZy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FmOydPx6aJSPImZy .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-FmOydPx6aJSPImZy .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-FmOydPx6aJSPImZy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FmOydPx6aJSPImZy .cluster text{fill:#333;}#mermaid-svg-FmOydPx6aJSPImZy .cluster span{color:#333;}#mermaid-svg-FmOydPx6aJSPImZy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FmOydPx6aJSPImZy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
生产
消费
Producer
Broker
Consumer
2.3、点对点消息队列模型 ----- 线程池
消息生产者向一个特定的队列发送消息,消息消费者从该队列中接收消息。
一条消息只有一个消费者能收到。
![](/assets/blank.gif)
#mermaid-svg-AQLjcFN1PbeRxkso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AQLjcFN1PbeRxkso .error-icon{fill:#552222;}#mermaid-svg-AQLjcFN1PbeRxkso .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AQLjcFN1PbeRxkso .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-AQLjcFN1PbeRxkso .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AQLjcFN1PbeRxkso .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AQLjcFN1PbeRxkso .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AQLjcFN1PbeRxkso .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AQLjcFN1PbeRxkso .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AQLjcFN1PbeRxkso .marker.cross{stroke:#333333;}#mermaid-svg-AQLjcFN1PbeRxkso svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AQLjcFN1PbeRxkso .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AQLjcFN1PbeRxkso .cluster-label text{fill:#333;}#mermaid-svg-AQLjcFN1PbeRxkso .cluster-label span{color:#333;}#mermaid-svg-AQLjcFN1PbeRxkso .label text,#mermaid-svg-AQLjcFN1PbeRxkso span{fill:#333;color:#333;}#mermaid-svg-AQLjcFN1PbeRxkso .node rect,#mermaid-svg-AQLjcFN1PbeRxkso .node circle,#mermaid-svg-AQLjcFN1PbeRxkso .node ellipse,#mermaid-svg-AQLjcFN1PbeRxkso .node polygon,#mermaid-svg-AQLjcFN1PbeRxkso .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AQLjcFN1PbeRxkso .node .label{text-align:center;}#mermaid-svg-AQLjcFN1PbeRxkso .node.clickable{cursor:pointer;}#mermaid-svg-AQLjcFN1PbeRxkso .arrowheadPath{fill:#333333;}#mermaid-svg-AQLjcFN1PbeRxkso .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AQLjcFN1PbeRxkso .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AQLjcFN1PbeRxkso .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-AQLjcFN1PbeRxkso .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-AQLjcFN1PbeRxkso .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AQLjcFN1PbeRxkso .cluster text{fill:#333;}#mermaid-svg-AQLjcFN1PbeRxkso .cluster span{color:#333;}#mermaid-svg-AQLjcFN1PbeRxkso div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AQLjcFN1PbeRxkso :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
发送消息
消费
确认
client 1
消息队列
client 2
2.4、发布订阅消息模型
实际操作过程中,发布订阅消息模型中,支持向一个特定的主题Topic发布消息,0个或多个订阅者接收来自这个消息主题的消息。在这种模型下,发布者和订阅者彼此不知道对方。
![](/assets/blank.gif)
2.5、消息的顺序性保证
基于Queue消息模型,利用FIFO先进先出的特性,可以保证消息的顺序性。
2.6、消息的ACK确认机制
即消息的Ackownledge确认机制,为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制,当Consumer确认消息已经被消费处理,发送一个ACK给消息队列,此时消息队列便可以删除这个消息了。
如果Consumer宕机/关闭,没有发送ACK,消息队列将认为这个消息没有被处理,会将这个消息重新发送给其他的Consumer重新消费处理。
通过牺牲吞吐量获得实时性。
2.7、消息的持久化
消息的持久化,对于一些关键的核心业务来说是非常重要的,启用消息持久化后,消息队列宕机重启后,消息可以从持久化存储恢复,消息不丢失,可以继续消费处理。
对于生产者,将数据发送到消息队列,消息队列会保存多个副本,即使MQ服务器奔溃,重启仍能找到生产者的消息数据。
对于消费者,拉取到消息后,将返回一个信息给MQ告诉它已经获得了消息,MQ将保存相关数据,即使MQ服务器奔溃,重启仍能知道消费者已经获取了哪些数据,避免重复发送。
2.8、消息的同步和异步收发
同步: 消息的收发支持同步收发的方式 一应一答。
同时还有另一种同步方式:同步收发场景下,消息生产者和消费者双向应答模式。
消息的接收如果以同步的方式(Pull)进行接收,如果队列中为空,此时接收将处于同步阻塞状态,会一直等待,直到消息的到达。
异步: 消息的收发同样支持异步方式:异步发送消息,不需要等待消息队列的接收确认;异步接收消息,以Push的方式触发消息消费者接收消息。
2.9、消费组的概念
类似线程池;如果消费者的处理能力较低时,可以使用消费组来处理,一个消费组里面包含多个消费者。
#mermaid-svg-rkEvrELh1brE7ix1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rkEvrELh1brE7ix1 .error-icon{fill:#552222;}#mermaid-svg-rkEvrELh1brE7ix1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rkEvrELh1brE7ix1 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-rkEvrELh1brE7ix1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rkEvrELh1brE7ix1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rkEvrELh1brE7ix1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rkEvrELh1brE7ix1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rkEvrELh1brE7ix1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rkEvrELh1brE7ix1 .marker.cross{stroke:#333333;}#mermaid-svg-rkEvrELh1brE7ix1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rkEvrELh1brE7ix1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rkEvrELh1brE7ix1 .cluster-label text{fill:#333;}#mermaid-svg-rkEvrELh1brE7ix1 .cluster-label span{color:#333;}#mermaid-svg-rkEvrELh1brE7ix1 .label text,#mermaid-svg-rkEvrELh1brE7ix1 span{fill:#333;color:#333;}#mermaid-svg-rkEvrELh1brE7ix1 .node rect,#mermaid-svg-rkEvrELh1brE7ix1 .node circle,#mermaid-svg-rkEvrELh1brE7ix1 .node ellipse,#mermaid-svg-rkEvrELh1brE7ix1 .node polygon,#mermaid-svg-rkEvrELh1brE7ix1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rkEvrELh1brE7ix1 .node .label{text-align:center;}#mermaid-svg-rkEvrELh1brE7ix1 .node.clickable{cursor:pointer;}#mermaid-svg-rkEvrELh1brE7ix1 .arrowheadPath{fill:#333333;}#mermaid-svg-rkEvrELh1brE7ix1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rkEvrELh1brE7ix1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rkEvrELh1brE7ix1 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-rkEvrELh1brE7ix1 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-rkEvrELh1brE7ix1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rkEvrELh1brE7ix1 .cluster text{fill:#333;}#mermaid-svg-rkEvrELh1brE7ix1 .cluster span{color:#333;}#mermaid-svg-rkEvrELh1brE7ix1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rkEvrELh1brE7ix1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
发送消息
消费
消费组
消费者 1
消费者 2
消费者 ...
消费者 n
生产者
消息队列
比如,MQ推送数据的能力是10w每秒,而消费者的处理能力是1w每秒,那么就可以使用一个消费组包含10个消费者来处理消息。这时消费者使用的是点对点消息队列模型 。
三、消息队列产品
特性
|
RabbitMQ
|
RocketMQ
|
Kafka
|
ZeroMQ
|
单机吞吐量
|
万级,比 RocketMQ、Kafka 低一个数量级
|
10 万级,支撑高吞吐
|
10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
|
100万级别,最早设计用于股票实时交易系统
|
topic 数量对吞吐量的影响
|
|
topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic
|
topic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
|
|
时效性
|
微秒级,这是RabbitMQ 的一大特点,延迟最低
|
ms 级
|
延迟在 ms 级以内
|
延迟在微妙级别/毫秒级
|
可用性
|
高,基于主从架构实现高可用
|
非常高,分布式架构
|
非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
|
不是一个独立的服务,要嵌套到自己的程序里面去
|
消息可靠性
|
基本不丢
|
经过参数优化配置,可以做到 0 丢失
|
同 RocketMQ
|
|
功能支持
|
基于 erlang 开发,并发能力很强,性能极好,延时很低
|
MQ 功能较为完善,支持分布式部署,扩展性好
|
功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用
|
如果需求是将消息队列的功能集成到系统进程中,可以考虑使用
|
![](/assets/blank.gif)
消息队列的概念和原理相关推荐
- 消息队列 Kafka的架构原理 (小白必看)
最终大家会掌握 Kafka 中最重要的概念,分别是 Broker.Producer.Consumer.Consumer Group.Topic.Partition.Replica.Leader.Fol ...
- 消息队列(MQ)原理总结
目录 1 概述 2 消息队列应用场景 2.1 异步处理 2.2 应用解耦 2.3 流量削峰 2.4 消息通讯 3 消息队列示例 3.1 电商系统 3.2 日志收集系统 4 常用消息队列 4.1 Act ...
- Kafka入门教程其一 消息队列基本概念 及常用Producer Consumer配置详解学习笔记
文章目录 1. 综述 2. 消息队列(Message Queue) 2.1 点对点 2.2 发布/订阅(pub-sub) 3. Kafka基础术语解释 3.1 Broker 3.2 Partition ...
- kafka消息队列的概念理解
kafka在大数据.分布式架构中都很流行.kafka可以进行流式计算,也可以做为日志系统,还可以用于消息队列. kafka作为消息队列的优点: 分布式的系统 高吞吐量.即使存储了许多TB的消息,它也保 ...
- Kafka消息队列基本概念
1.认识kafka (1)kafka是一个分布式的基于发布/订阅模式的消息队列. 消息队列的两种模式: 点对点模式(一对一):消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且 ...
- 消息队列-Metaq(RocketMQ)原理
1. 应用场景 适用于大存储量,顺序消息,广播和日志数据传输的场景.设计理念类似kafka,场景类似.和kafak的一些差异如下,可以考虑差异使用: 文本协议设计,透明.纯java实现,ka ...
- PHP消息队列实现及应用
目前对消息队列并不了解其原理,本篇文章主要是通过慕课网学习归纳的一些笔记,为后续学习打下基础. 众所周知在对网站设计的时候,会遇到给用户"群发短信","订单系统有大量的日 ...
- thinkphp5的消息队列详细教程
消息队列的概念.原理和场景 在高并发的时候,程序往往无法做到及时的处理.我们引入一个中间的系统,来进行分流和减压. 所以从本质上讲:消息队列就是一个队列结构的中间件.也就是说,你把消息和内容放入这个容 ...
- PHP秒杀--消息队列实现及应用
主要了解如下知识: 1.队列是个什么东西,他能干什么? 2.对列的应用场景有哪些? 3.如何使用队列对业务进行解偶? 4.如何使用Redis队列来消除高压力? 5.专业的对列系统RabbitMQ如何使 ...
最新文章
- FPGA设计细节和实现(初学者)
- 【独家】IT自由职业者是怎么样的感受和体验
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十一)NIFI1.7.1安装
- go interface转int_图解go反射实现原理
- 重构-改善既有代码的设计(1)
- 阿里开发者招聘节 | 面试题06-07: MySQL的数据如何恢复到任意时间点
- LTE系统信息块SIB:LTE system information blocks-MIB,SIB-1,2,3,4,5,6,7,8,9,10,11
- 压力测试和负载测试区别_性能测试vs压力测试vs负载测试
- 0920 - 积极休息
- 飞行堡垒FN+F5风扇调节失灵怎么办? 一文教你完美解决此问题
- python如何更新pip_[Python] 如何更新 PIP 到最新版本?
- leetcode347——前K个高频元素——java实现
- JVM MAT分析器中的shallow heap 和 retained heap详解
- 在Mac OS系统下安装Java
- PBFT -Golang实现详解
- 通过cmd命令行操作mysql
- 谈谈智能设备的电池技术
- 云和恩墨zData多租户整合,青海移动数据库云化起航
- 推荐多样性重排算法之MMR
- 中国大学公开课是垃圾,向哈弗公开课叫板!
热门文章
- Flink1.13.2运行在大数据星环TDH集群的jdk1.7上解决办法
- S变换的Python代码
- 用布谷鸟算法求解基站选址
- arcgispro 影像分类
- USB不同接口的速率峰值
- JS页面跳转请求方法
- 完成超亿美元A轮融资交易,福瑞泰克高级别自动驾驶战略全面提速
- 基于深度学习的指针式仪表图像智能读数方法
- proteus中的标签的使用方法。
- 干掉visio,这个画图神器真的绝了