1、PTP模型

Point-to-Point,点对点通信模型。PTP是基于队列(Queue)的,一个队列可以有多个生产者,和多个消费者。消息服务器按照收到消息的先后顺序,将消息放到队列中。队列中的每一条消息,只能由一个消费者进行消费,消费之后就会从队列中移除。

需要注意的是,尽管这里使用Queue的概念,但并不是先进入队列消息,一定会被先消费。在存在多个下游Consumer情况下,一些消息中间件,例如ActiveMQ,为了提升消费能力,会将队列中的消息分发到不同Consumer并行进行处理。这意味着消息发送的时候可能是有序的,但是在消费的时候,就变成无序了。为了保证消费的有序,一些MQ提供了**"专有消费者”或者"排他消费者”**的概念,在这种情况下,队列中的消息仅允许一个消费者进行消费,如果存在多个消费者,那么从中选择一个。但是,这意味着在消息在处理中没有了并行性。如果消息量很多的情况下,将会产生消息积压。为了解决"专有消费者”的性能问题,一些消息中间件采用分区的概念来解决性能问题,我们将在后文进行介绍。

2、Pub/Sub模型

publish-and- subscribe, 即发布订阅模型。在Pub/Sub模型中,生产者将消息发布到一个主题(Topic)中,订阅了该Topic的所有下游消费者,都可以接收到这条消息。如下图:

通常情况下,一个条消息只要被消费一次就行了,那么什么情况下需要所有的消费者都对这条消息进行消费呢?最典型的情况就是需要在内存中对数据进行缓存,并需要实时进行更新。例如,笔者做过一个违禁词系统,对用户输入的评论内容进行违禁词汇检测。这个违禁词系统,部署了在N台服务器上,为了提升检测性能,每台机器都会将违禁词库全量加载到内存中,词库的更新,是通过发送MQ消息来完成的。由于采用Pub/Sub模型,每台机器的consumer,都可以接收到这条消息,直接在内存中更新敏感词库即可。

3、Partition模型

为了解决在PTP模型下,有序消息需要通过"专有消费者”消费带来的性能问题,一些消息中间件,如rocketmq,kafka采用了Partition模型,即分区模型,如下所示:

生产者发送消息到某个Topic中时,最终选择其中一个Partition进行发送。你可以将Parition模型中的分区,理解为PTP模型的队列,不同的是,PTP模型中的队列存储的是所有的消息,而每个Partition只会存储部分数据。对于消息者,此时多了一个消费者组的概念,Paritition会在同一个消费者组下的消费者中进行分配,每个消费者只消费分配给自己的Paritition。上图演示了不同的消费者可能会分配到不同数量的Paritition。Paritition模式巧妙的将PTP模型和Pub/Sub模型结合在了一起:

对于PTP模型:

一条消息只会由一个消费者进行消费,而Partition模型中每个分区最终也只会有一个消费者进行消费。对于通过"专有消费者"来保证全局消费有序的场景,在Partition模型中,只需保证创建的Topic只有一个Partition即可,这个Paritition最终也只会分配其中一个消费者。另外,在绝大部分场景下,我们没有必要保证全局有序,例如一个订单产生了3条消息,分别是订单创建,订单付款,订单完成。消费时,要按照这个顺序消费才能有意义。但是订单之间是可以并行消费的,例如将订单1产生的3条消息发送到Partiton 1,将订单2产生的3条消息发送到Partition 2,如此便达到了不同订单之间的并行消费。

对于Pub/Sub模型:

一条消息所有的下游消费者都可以进行消费。在Paritition模型中,只需要为每个消费者设置成不同的消费者组即可。然而,过多的消费者组,会给消息中间件运维带来麻烦。所以一些消息中间件,结合了Partition模型和Pub/Sub模型。例如RocketMQ,支持为消费者组设置消费模式,如果是集群模式,就按照上述描述进行消费,如果是广播模式,就按照Pub/Sub模型进行消费。当然,Partition模型也不全是优点,其最大的限制在于Partition数量是固定的(虽然可以调整),且只可以分配给其中一个消费者。当消费者的数量大于Partition数量时,这些多出来的消费者将无法消费到消息。一些消息中间件对此进行了优化,例如rocketmq,支持单个partition的并行消费。即在对单个消费者内,同时启动多个线程,来消费这个Partition中的数据,当然前提是要求消息不是有序的,对于有序的消息,只能使用一个线程按顺序消费这个Partition中的数据。

4、Transfer模型

Paritition模型中的消费者组概念很有用,同一个Topic下的消息可以由多个不同业务方进行消费,只要使用不同的消费者组即可,不同消费者组消费到的位置单独记录,互不影响。 但是,Paritition模型还是限制了消费者数量不能多于分区数。因此,又有了另外一种消费模型,笔者称之为Transfer模型,如下图所示:

生产者还是将消息发送到Topic中,针对一个Topic,可以创建多个通道,这里称之为channel。与分区不同的是,发送到Topic中的每条消息,都会转发到每个channel,因此每个channel都有这个Topic的全量数据。当然,没有必要把真的把消息体完整的拷贝一份到channel中,可以只记录一下消息元数据,表示有一条放到这个channel中了。消费者在消费消息时,必须指定从哪个channel消费。多个消费者消费同一个channel时,每条消息只会有一个消费者消费达到,这一点与PTP模型类似。事实上,我们可以认为,消费了同一个channel的消费者,就自动组成了一个消费者组。但是,与Partition模型不同的是,这里没有分区的概念,因此消费者的数量可以是任意的。事实上,GO语言编写的NSQ消息中间件,采用的就是这种模型。当然,这种模型与PTP一样,也不能保证被消息有序,除非通过类似于”专用消费者”的概念。

最后

面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?

掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。

如果你需要这份完整版的面试笔记,只需你多多支持我这篇文章。

——对文章进行点赞+评论,关注我,然后再点击这里免费领取

ava-p7)**

[外链图片转存中…(img-RgGVc8BW-1626176201274)]

三年经验java工资,含爱奇艺,小米,腾讯,阿里相关推荐

  1. android开发论坛!关于Android开发的面试经验总结,含爱奇艺,小米,腾讯,阿里

    前言 近期被两则消息刷屏,[字节跳动持续大规模招聘,全年校招超过1万人][腾讯有史以来最大规模的校招启动]当然Android岗位也包含在内,因此Android还是有很多机会的.结合往期面试的同学(主要 ...

  2. 爱奇艺、腾讯视频等接连涨价 地主家也没有余粮了?

    继爱奇艺.芒果TV后,腾讯视频会员也要涨价了. 4月9日,腾讯视频宣布将于4月20日零点对腾讯视频VIP和超级影视VIP会员价格进行调整.其中,腾讯视频VIP月卡以及超级影视VIP的多项套餐等5种会员 ...

  3. 传“爱奇艺与腾讯在接触”:谁才是爱奇艺门外的野蛮人?

    在李彦宏和龚宇联手MBO爱奇艺后,资本市场传来最新的消息是,爱奇艺和腾讯正在进行资本接触. 这并非是爱奇艺和腾讯第一次闹"资本绯闻".2015年上半年,坊间传闻腾讯.百度.爱奇艺三 ...

  4. 互联网晚报 | 10月5日 星期二 | 爱奇艺、腾讯、优酷宣布取消超前点播;蜜雪冰城冲刺A股上市;吴京主演电影票房超200亿...

    ‍ 今日看点 ✦ 爱奇艺.腾讯视频.优酷相继宣布取消剧集超前点播服务 ✦ 吴京主演电影票房超200亿,成为中国电影市场第二位200亿主演票房影人 ✦ 蜜雪冰城冲刺A股上市:已完成IPO辅导备案,门店数 ...

  5. 爱奇艺,腾讯和优酷市场分析(1)

    在影视行业迅猛发展与粉丝经济的强大带动背景下,爱奇艺与腾讯视频借助其自身流量优势,纷纷推出了泡泡与doki两个子功能,爱奇艺更是将原有交互界面改版,以增加用户对于泡泡功能的使用频率.本文主要针对爱奇艺 ...

  6. 动漫市场硝烟再起:优酷、爱奇艺、腾讯三方如何互掐?

    2018年对不少行业来说都不太友好,P2P的频频爆雷.长租公寓的频频爆仓.游戏行业和影视行业均进入资本寒冬等等都证实了这一点.而与游戏行业.影视行业有密切关系的动漫行业在今年也受到了不小的打击.市场上 ...

  7. 步爱奇艺与腾讯视频的后尘,B站扬帆出海能否跨海破圈?

    2020年,"出海潮"成为不少互联网企业的动作之一,哔哩哔哩的出海计划也已经提上了日程. 12月28日消息,B站已经登陆东南亚市场.视频平台"出海",在哔哩哔哩 ...

  8. 弹幕java_120行JAVA代码实现爱奇艺的弹幕下载

    废话不说,直接上代码:文末有彩蛋. package com.huqitong.spiderdanmu; import java.io.ByteArrayOutputStream; import jav ...

  9. 爱奇艺,腾讯Java岗面试经历,这些问题我是真没抗住

    前言 对, 就是今年的金九银十,我满怀希望的抓住了这次面试招聘的好机会,也只是没想到这才开始就遇到了不测,接连面试了两个心仪的公司都没过,面试过程可以算是最心酸了的一次经历了,最心酸的两次-详细的过程 ...

  10. 爱奇艺、腾讯、优酷同日宣布:全面取消超前点播

    近日,视频平台爱奇艺.优酷和腾讯先后宣布,将取消超前点播.这也标志着"超前点播"这一备受争议的模式最终被平台放弃. 面对这一突然宣布的措施,众多网友纷纷叫好,许多人表示,自己开通多 ...

最新文章

  1. weblogic服务器部署的程序,如何直接通过IP访问(即URL中去掉工程名)
  2. 实践教程 | 浅谈 PyTorch 中的 tensor 及使用
  3. linux中cc和S的区别,为什么在linux命令(iostat)中每秒读取(r/s)一直为零?
  4. qgridlayout 动态刷新
  5. 效率系列(四) VS常用快捷键
  6. 寒假每日一题2022【week1 完结】
  7. 报错: MLPClassifier:ConvergenceWarning: Stochastic Optimizer: Maximum iterations (400) reached
  8. osg渲染到纹理技术(一)
  9. Java原生代码连接MySQL数据库
  10. python 读取并显示图片,用plt 同时显示多幅图像
  11. 解决:fatal error: opencv2/xfeatures2d.hpp: No such file or directory
  12. 现代操作系统 第一章 引论
  13. 64位win7旗舰版java_win7 64位旗舰版下载_lenovo windows7 64位旗舰版笔记本专用系统_软件侠下载站...
  14. Dynamical Isometry and a Mean Field Theory of CNNs
  15. 人类社会——为什么要有秩序
  16. commons-cli使用介绍
  17. 读卡器插电脑不显示盘符
  18. java common log使用,log4j和commons.logging日志记录的使用方法
  19. 架构师之路--从原理角度来分析性能
  20. ora-12505 监听程序当前无法识别sid

热门文章

  1. PostgreSQL在何处处理 sql查询之十三
  2. java 不编译咋办_java – 为什么JVM不编译整个程序,而不是逐个编译?
  3. java没有打印mysql日志_0216 aop和打印数据库执行日志
  4. python正则r的作用_Python正则表达式,这一篇就够了!
  5. navicat连接linux远程数据库,使用Navicat forMySql远程连接Linux 系统上的数据库
  6. 计算机科学家和心理学家合作,生物智能与人工智能之间的合作
  7. dataframe转化为array_【Python专栏】12 种高效 Numpy 和 Pandas 函数为你加速分析
  8. 8086标志寄存器FLAG
  9. Win32ASM学习[23]:RadASM快捷键
  10. C++语法:构造函数以及析构函数