三年經驗java工資,含愛奇藝,小米,騰訊,阿里

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)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385635.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三面美團Java崗,java多線程匿名內部類

Part 1微服務架構設計概述 1.1 傳統應用架構的問題 1.2 微服務架構是什么 1.3 微服務架構有哪些特點和挑戰 1.4 如何搭建微服務架構 Part 2微服務開發框架 2.1 Spring Boot 是什么 2.2 如何使用Spring Boot框架 2.3 Spring Boot生產級特性 Part 3微服務網關 3.1 Node.js 是什…

函數signal

1. 函數signal #include <signal.h> void (*signal(int sig,void (*func)(int)))(int)typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 分析&#xff1a; signal參數信號名&#xff0c;func的值是SIG_ING、SIG_DFL或接到…

三面美團Java崗,java架構師線下培訓

性能優化專欄 1.Tomcat性能優化整理 2.JVM性能優化專題 3.Mysql性能優化整理 微服務架構面試專欄 1.SpringCloud面試整理 2.SpringBoot面試整理 3.Dubbo面試整理 并發編程高級面試專欄 開源框架面試題專欄 1.Spring面試整理 2.SpringMVC面試整理 3.MyBatis面試整理 分布式面…

信號 09 | SIGCLD語義

1. SIGCLD信號 SIG_DFL &#xff1a;默認的處理方式是不理會這個信號&#xff0c;但是也不會丟棄子進程狀態&#xff0c;所以如果不用wait&#xff0c;waitpid對其子進行進行狀態信息回收&#xff0c;會產生僵尸進程。SIG_IGN &#xff1a;忽略的處理方式&#xff0c;這個方式…

三面美團Java崗,java電子書下載百度云

Spring 全家桶&#xff1a; Spring 原理Spring面試題思維導圖面試題Spring視頻 Spring 原理 Spring特點Spring 核心組件Spring常用模塊Spring主要包Spring常用注解Sping第三方結合Spring 10C原理Spring APO原理Spring MVC原理Spring Boot原理JPA原理Mybatis緩存Tomcat架構 Sp…

【信號】函數kill、raise、abort、alarm

一、函數kill 1. kill函數原型&#xff1a; int kill(pid_t pid, int signo); //signo:信號名分析&#xff1a; pid > 0&#xff1a; 發送信號給指定的進程pid 0&#xff1a; 發送信號給調用kill函數進程屬于同一個進程組的所有進程pid < 0&#xff1a;信號signo將…

三面美團Java崗,尚學堂java馬士兵全套

SpringBoot經典之作 進入Spring Boot世界 準備開發環境搭建開發工具 基礎 Spring Boot基礎分層開發Web應用程序響應式編程 進階 Spring Boot進階用ORM操作SQL數據庫接口架構風格——RESTful集成安全框架&#xff0c;實現安全認證和授權集成Redis&#xff0c;實現高并發集成R…

信號 09 | 信號概念

信號的概念 信號在我們的生活隨處可見&#xff0c;如&#xff1a;古代戰爭中摔杯為號&#xff1b;代戰爭中的信號彈&#xff1b;體育比賽中使用的信號槍&#xff0c;它們都有共性&#xff1a;1. 簡單 2. 不能攜帶大量的信息 3. 滿足某個特定條件才發送 信號是信息的載體&…

一招徹底幫你搞定HashMap源碼,項目實戰

ES 集群架構演進之路 1、初始階段 訂單中心ES初始階段如一張白紙&#xff0c;架設方案基本沒有&#xff0c;很多配置都是保持集群默認配置。整個集群部署在集團的彈性云上&#xff0c;ES集群的節點以及機器部署都比較混亂。同時按照集群維度來看&#xff0c;一個ES集群會有單…

【信號】信號集、sigprocmask、sigpending

一、信號集操作函數 內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在用程序自定義set來改變mask&#xff0c;來達到屏蔽指定信號目的。 sigset_t set; // typedef unsigned long sig…

一招讓你拿下seata分布式事務框架,看這篇文章準沒錯!

第一階段&#xff1a;架構師筑基必備技能 我覺得&#xff0c;但凡是個成年人應該都清楚扎實的基本功對自己的工作幫助有多重要。從各大招聘網站的招聘要求來看&#xff0c;第一條都明確說明需要扎實的Java基礎。因此&#xff0c;一般筆試以及面試的第一輪&#xff0c;對基礎的…

函數signal、sigaction

二、函數sigaction 修改信號處理動作(通常在Linux用來注冊一個信號的捕捉函數) #inlcude<signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 參數&#xff1a; act&am…

一文了解OOM及解決方案,你還看不明白?

InnoDB總體結構 首先我們來看官網的一張圖(圖片來源于MySQL官網)&#xff1a; 從上圖中可以看出其主要分為兩部分結構&#xff0c;一部分為內存中的結構(上圖左邊)&#xff0c;一部分為磁盤中的結構(上圖右邊) 內存結構 InnoDB內存中的結構主要分為&#xff1a;Buffer Pool,…

信號 09 | 函數pause

函數pause 調用該函數可以造成進程主動掛起&#xff0c;等待信號喚醒&#xff0c;調用該系統調用的進程處于阻塞狀態(主動放棄CPU)直到有信號遞達將其喚醒。 將進程置為可中斷睡眠狀態。然后 它調用schedule()&#xff0c;使linux進程調度器找到另一個進程來運行。pause使調用…

一文搞懂JVM架構和運行時數據區,全網最新

1.Java基礎面試知識點 Java中和equals和hashCode的區別int、char、long各占多少字節數int與integer的區別探探對Java多態的理解String、StringBuffer、StringBuilder區別什么是內部類&#xff1f;內部類的作用抽象類和接口區別抽象類的意義抽象類與接口的應用場景抽象類是否可…

一條正確的Java職業生涯規劃,幫你突破瓶頸

面試題模塊介紹&#xff1a; 一、Java 基礎 JDK 和 JRE 有什么區別&#xff1f; 和 equals 的區別是什么&#xff1f;兩個對象的 hashCode()相同&#xff0c;則 equals()也一定為 true&#xff0c;對嗎&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.roun…

【線程】線程基本函數

一、pthread_self函數 功能&#xff1a;獲取線程ID。 pthread_t pthread_self(void); 線程ID&#xff1a;pthread_t類型&#xff0c;本質&#xff1a;在Linux為無符號整數(%lu)&#xff0c;其他系統可能是結構體實現線程ID是進程內部識別標志。&#xff08;兩個進程間&#…

一條正確的Java職業生涯規劃,順利通過阿里Java崗面試

珍藏版&#xff08;1&#xff09;——Mybatis入門 1.什么是MyBatis 2.為什么我們要用Mybatis? 3.Mybatis快速入門 3.1 導入開發包 3.2準備測試工作 3.3 創建mybatis配置文件 3.4 編寫工具類測試是否獲取到連接 3.5 創建實體與映射關系文件 3.6 編寫DAO 4.Mybatis工作…

線程控制 12 | 線程屬性

本節作為指引性介紹&#xff0c;linux下線程的屬性是可以根據實際項目需要&#xff0c;進行設置&#xff0c;之前我們討論的線程都是采用線程的默認屬性&#xff0c;默認屬性已經可以解決絕大部分開發遇到的問題。如我們對程序的性能提出更高的要求那么需要設置線程屬性&#x…

一次違反常規的Java大廠面試經歷,系列教學

第一部分 Java相關以及答案 答案 第二部分算法跟編程 第三部分html&JavaScript&ajax部分 答案 第四部分Javaweb部分 答案 第五部分數據庫部分 答案 第六部分XML部分 答案 第七部分.流行的框架與新技術 答案 第八、九部分.軟件工程與設計模式以及j2ee部分 最后 筆者…