消息队列

  • 一、使用消息队列的场景
    • 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. 异步处理。
  2. 流量控制。
  3. 服务解耦。
  4. 发布订阅。
  5. 高并发缓冲。

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、点对点消息队列模型 ----- 线程池

消息生产者向一个特定的队列发送消息,消息消费者从该队列中接收消息。
一条消息只有一个消费者能收到。

#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个或多个订阅者接收来自这个消息主题的消息。在这种模型下,发布者和订阅者彼此不知道对方。

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 功能,在大数据领域的实时计算以及日志采集被大规模使用 如果需求是将消息队列的功能集成到系统进程中,可以考虑使用

消息队列的概念和原理相关推荐

  1. 消息队列 Kafka的架构原理 (小白必看)

    最终大家会掌握 Kafka 中最重要的概念,分别是 Broker.Producer.Consumer.Consumer Group.Topic.Partition.Replica.Leader.Fol ...

  2. 消息队列(MQ)原理总结

    目录 1 概述 2 消息队列应用场景 2.1 异步处理 2.2 应用解耦 2.3 流量削峰 2.4 消息通讯 3 消息队列示例 3.1 电商系统 3.2 日志收集系统 4 常用消息队列 4.1 Act ...

  3. Kafka入门教程其一 消息队列基本概念 及常用Producer Consumer配置详解学习笔记

    文章目录 1. 综述 2. 消息队列(Message Queue) 2.1 点对点 2.2 发布/订阅(pub-sub) 3. Kafka基础术语解释 3.1 Broker 3.2 Partition ...

  4. kafka消息队列的概念理解

    kafka在大数据.分布式架构中都很流行.kafka可以进行流式计算,也可以做为日志系统,还可以用于消息队列. kafka作为消息队列的优点: 分布式的系统 高吞吐量.即使存储了许多TB的消息,它也保 ...

  5. Kafka消息队列基本概念

    1.认识kafka (1)kafka是一个分布式的基于发布/订阅模式的消息队列. 消息队列的两种模式: 点对点模式(一对一):消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且 ...

  6. 消息队列-Metaq(RocketMQ)原理

    1.      应用场景 适用于大存储量,顺序消息,广播和日志数据传输的场景.设计理念类似kafka,场景类似.和kafak的一些差异如下,可以考虑差异使用: 文本协议设计,透明.纯java实现,ka ...

  7. PHP消息队列实现及应用

    目前对消息队列并不了解其原理,本篇文章主要是通过慕课网学习归纳的一些笔记,为后续学习打下基础. 众所周知在对网站设计的时候,会遇到给用户"群发短信","订单系统有大量的日 ...

  8. thinkphp5的消息队列详细教程

    消息队列的概念.原理和场景 在高并发的时候,程序往往无法做到及时的处理.我们引入一个中间的系统,来进行分流和减压. 所以从本质上讲:消息队列就是一个队列结构的中间件.也就是说,你把消息和内容放入这个容 ...

  9. PHP秒杀--消息队列实现及应用

    主要了解如下知识: 1.队列是个什么东西,他能干什么? 2.对列的应用场景有哪些? 3.如何使用队列对业务进行解偶? 4.如何使用Redis队列来消除高压力? 5.专业的对列系统RabbitMQ如何使 ...

最新文章

  1. FPGA设计细节和实现(初学者)
  2. 【独家】IT自由职业者是怎么样的感受和体验
  3. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十一)NIFI1.7.1安装
  4. go interface转int_图解go反射实现原理
  5. 重构-改善既有代码的设计(1)
  6. 阿里开发者招聘节 | 面试题06-07: MySQL的数据如何恢复到任意时间点
  7. LTE系统信息块SIB:LTE system information blocks-MIB,SIB-1,2,3,4,5,6,7,8,9,10,11
  8. 压力测试和负载测试区别_性能测试vs压力测试vs负载测试
  9. 0920 - 积极休息
  10. 飞行堡垒FN+F5风扇调节失灵怎么办? 一文教你完美解决此问题
  11. python如何更新pip_[Python] 如何更新 PIP 到最新版本?
  12. leetcode347——前K个高频元素——java实现
  13. JVM MAT分析器中的shallow heap 和 retained heap详解
  14. 在Mac OS系统下安装Java
  15. PBFT -Golang实现详解
  16. 通过cmd命令行操作mysql
  17. 谈谈智能设备的电池技术
  18. 云和恩墨zData多租户整合,青海移动数据库云化起航
  19. 推荐多样性重排算法之MMR
  20. 中国大学公开课是垃圾,向哈弗公开课叫板!

热门文章

  1. Flink1.13.2运行在大数据星环TDH集群的jdk1.7上解决办法
  2. S变换的Python代码
  3. 用布谷鸟算法求解基站选址
  4. arcgispro 影像分类
  5. USB不同接口的速率峰值
  6. JS页面跳转请求方法
  7. 完成超亿美元A轮融资交易,福瑞泰克高级别自动驾驶战略全面提速
  8. 基于深度学习的指针式仪表图像智能读数方法
  9. proteus中的标签的使用方法。
  10. 干掉visio,这个画图神器真的绝了