zoukankan      html  css  js  c++  java
  • 消息队列0:消息队列概述

    最近在看消息队列,找了好多资料。终于能够简单的理解了消息队列。

    消息队列概述

    消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。

    消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。
    目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。

    故事解读

    下面内容参考自知乎上祁达方的文章。


    小红是小明的姐姐。

    小红希望小明多读书,常寻找好书给小明看,之前的方式是这样:小红问小明什么时候有空,把书给小明送去,并亲眼监督小明读完书才走。久而久之,两人都觉得麻烦。

    后来的方式改成了:小红对小明说「我放到书架上的书你都要看」,然后小红每次发现不错的书都放到书架上,小明则看到书架上有书就拿下来看。


    书架就是一个消息队列,小红是生产者,小明是消费者。

    • Producer:消息生产者,负责产生和发送消息到 Broker;
    • Broker:消息处理中心。负责消息存储、确认、重试等,一般其中会包含多个 queue;
    • Consumer:消息消费者,负责从 Broker 中获取消息,并进行相应处理;

    消息队列的好处

    1.小红想给小明书的时候,不必问小明什么时候有空,亲手把书交给他了,小红只把书放到书架上就行了。这样小红小明的时间都更自由。

    2.小红相信小明的读书自觉和读书能力,不必亲眼观察小明的读书过程,小红只要做一个放书的动作,很节省时间。

    3.当明天有另一个爱读书的小伙伴小强加入,小红仍旧只需要把书放到书架上,小明和小强从书架上取书即可(唔,姑且设定成多个人取一本书可以每人取走一本吧,可能是拷贝电子书或复印,暂不考虑版权问题)。

    4.书架上的书放在那里,小明阅读速度快就早点看完,阅读速度慢就晚点看完,没关系,比起小红把书递给小明并监督小明读完的方式,小明的压力会小一些。

    这就是消息队列的四大好处:

    解耦

    每个成员不必受其他成员影响,可以更独立自主,只通过一个简单的容器来联系。

    小红甚至可以不知道从书架上取书的是谁,小明也可以不知道往书架上放书的人是谁,在他们眼里,都只有书架,没有对方。

    毫无疑问,与一个简单的容器打交道,比与复杂的人打交道容易一万倍,小红小明可以自由自在地追求各自的人生。

    提速

    小红选择相信「把书放到书架上,别的我不问」,为自己节省了大量时间。

    小红很忙,只能抽出五分钟时间,但这时间足够把书放到书架上了。

    广播

    小红只需要劳动一次,就可以让多个小伙伴有书可读,这大大地节省了她的时间,也让新的小伙伴的加入成本很低。

    削峰

    假设小明读书很慢,如果采用小红每给一本书都监督小明读完的方式,小明有压力,小红也不耐烦。

    反正小红给书的频率也不稳定,如果今明两天连给了五本,之后隔三个月才又给一本,那小明只要在三个月内从书架上陆续取走五本书读完就行了,压力就不那么大了。

    消息队列的缺点

    引入复杂度

    毫无疑问,「书架」这东西是多出来的,需要地方放它,还需要防盗。

    暂时的不一致性

    假如妈妈问小红「小明最近读了什么书」,在以前的方式里,小红因为亲眼监督小明读完书了,可以底气十足地告诉妈妈,但新的方式里,小红回答妈妈之后会心想「小明应该会很快看完吧……」

    这中间存在着一段「妈妈认为小明看了某书,而小明其实还没看」的时期,当然,小明最终的阅读状态与妈妈的认知会是一致的,这就是所谓的「最终一致性」。

    消息队列的使用场景

    生产者不需要从消费者处获得反馈

    引入消息队列之前的直接调用,其接口的返回值应该为空,这才让明明下层的动作还没做,上层却当成动作做完了继续往后走——即所谓异步——成为了可能。

    小红放完书之后小明到底看了没有,小红根本不问,她默认他是看了,否则就只能用原来的方法监督到看完了。

    容许短暂的不一致性

    妈妈可能会发现「有时候据说小明看了某书,但事实上他还没看」,只要妈妈满意于「反正他最后看了就行」,异步处理就没问题。

    如果妈妈对这情况不能容忍,对小红大发雷霆,小红也就不敢用书架方式了。

    确实是用了有效果

    即解耦、提速、广播、削峰这些方面的收益,超过放置书架、监控书架这些成本。

    否则如果是盲目照搬,「听说老赵家买了书架,咱们家也买一个」,买回来却没什么用,只是让步骤变多了,还不如直接把书递给对方呢,那就不对了。

    不得不佩服大牛的解释的这么通俗易懂

    参考:

    [1]-祁达方:好书一起读(149):消息队列(https://zhuanlan.zhihu.com/p/24860107)
    [2]-jasonGeng88:一个故事告诉你什么是消息队列 (https://github.com/jasonGeng88/blog/blob/master/201705/MQ.md)
    [3]-预流:消息队列之 RabbitMQ(https://www.jianshu.com/p/79ca08116d57)

  • 相关阅读:
    104.Maximum Depth of Binary Tree
    103.Binary Tree Zigzag Level Order Traversal
    102.Binary Tree Level Order Traversal
    101.Symmetric Tree
    100.Same Tree
    99.Recover Binary Search Tree
    98.Validate Binary Search Tree
    97.Interleaving String
    static静态初始化块
    serialVersionUID作用
  • 原文地址:https://www.cnblogs.com/zhenghengbin/p/9539422.html
Copyright © 2011-2022 走看看