## RocketMQ * [1.RocketMQä¸çTopicåJMSçqueueæä»ä¹åºå«ï¼](#1rocketmqä¸çtopicåjmsçqueueæä»ä¹åºå«) * [2.RocketMQ Brokerä¸çæ¶æ¯è¢«æ¶è´¹åä¼ç«å³å é¤åï¼](#2rocketmq-brokerä¸çæ¶æ¯è¢«æ¶è´¹åä¼ç«å³å é¤å) * [3.RocketMQæ¶è´¹æ¨¡å¼æå ç§ï¼](#3rocketmqæ¶è´¹æ¨¡å¼æå ç§) * [4.æ¶è´¹æ¶æ¯æ¯pushè¿æ¯pullï¼](#4æ¶è´¹æ¶æ¯æ¯pushè¿æ¯pull) * [5.brokerå¦ä½å¤çæå请æ±çï¼](#5brokerå¦ä½å¤çæå请æ±ç) * [6.RocketMQå¦ä½åè´è½½åè¡¡ï¼](#6rocketmqå¦ä½åè´è½½åè¡¡) * [7.æ¶æ¯é夿¶è´¹å¦ä½è§£å³ï¼](#7æ¶æ¯é夿¶è´¹å¦ä½è§£å³) * [8.å¦ä½è®©RocketMQä¿è¯æ¶æ¯çé¡ºåºæ¶è´¹ï¼](#8å¦ä½è®©rocketmqä¿è¯æ¶æ¯çé¡ºåºæ¶è´¹) * [9.RocketMQå¦ä½ä¿è¯æ¶æ¯ä¸ä¸¢å¤±ï¼](#9rocketmqå¦ä½ä¿è¯æ¶æ¯ä¸ä¸¢å¤±) * [10.rocketMQçæ¶æ¯å 积å¦ä½å¤ç](#10rocketmqçæ¶æ¯å 积å¦ä½å¤ç) * [11.RocketMQå¨åå¸å¼äºå¡æ¯æè¿åæºå¶çåºå±åç?](#11rocketmqå¨åå¸å¼äºå¡æ¯æè¿åæºå¶çåºå±åç) * [12.å¦æè®©ä½ æ¥å¨æå®ç°ä¸ä¸ªåå¸å¼æ¶æ¯ä¸é´ä»¶ï¼æ´ä½æ¶æä½ ä¼å¦ä½è®¾è®¡å®ç°?](#12å¦æè®©ä½ æ¥å¨æå®ç°ä¸ä¸ªåå¸å¼æ¶æ¯ä¸é´ä»¶æ´ä½æ¶æä½ ä¼å¦ä½è®¾è®¡å®ç°) * [13.é«ååéä¸å¦ä½ä¼åç产è åæ¶è´¹è çæ§è½?](#13é«ååéä¸å¦ä½ä¼åç产è åæ¶è´¹è çæ§è½) * [14.å说说RocketMQ æ¯å¦ä½ä¿è¯æ°æ®çé«å®¹éæ§ç?](#14å说说rocketmq-æ¯å¦ä½ä¿è¯æ°æ®çé«å®¹éæ§ç) * [15.ä»»ä½ä¸å°Brokerçªç¶å®æºäºæä¹åï¼](#15ä»»ä½ä¸å°brokerçªç¶å®æºäºæä¹å) * [åèèµæ](#åèèµæ) #### 1.RocketMQä¸çTopicåJMSçqueueæä»ä¹åºå«ï¼ queueå°±æ¯æ¥æºäºæ°æ®ç»æçFIFOéåãèTopicæ¯ä¸ªæ½è±¡çæ¦å¿µï¼æ¯ä¸ªTopicåºå±å¯¹åºN个queueï¼èæ°æ®ä¹çå®åå¨queueä¸çã #### 2.RocketMQ Brokerä¸çæ¶æ¯è¢«æ¶è´¹åä¼ç«å³å é¤åï¼ ä¸ä¼ï¼æ¯æ¡æ¶æ¯é½ä¼æä¹ åå°CommitLogä¸ï¼æ¯ä¸ªConsumerè¿æ¥å°Brokeråä¼ç»´ææ¶è´¹è¿åº¦ä¿¡æ¯ï¼å½ææ¶æ¯æ¶è´¹ååªæ¯å½åConsumerçæ¶è´¹è¿åº¦ï¼CommitLogçoffsetï¼æ´æ°äºã #### 3.RocketMQæ¶è´¹æ¨¡å¼æå ç§ï¼ é群æ¶è´¹ 䏿¡æ¶æ¯åªä¼è¢«åGroupä¸çä¸ä¸ªConsumeræ¶è´¹ å¤ä¸ªGroupåæ¶æ¶è´¹ä¸ä¸ªTopicæ¶ï¼æ¯ä¸ªGroupé½ä¼æä¸ä¸ªConsumeræ¶è´¹å°æ°æ® å¹¿ææ¶è´¹ æ¶æ¯å°å¯¹ä¸ 个Consumer Group ä¸çå个 Consumer å®ä¾é½æ¶è´¹ä¸éãå³å³ä½¿è¿äº Consumer å±äºåä¸ä¸ªConsumer Group ï¼æ¶æ¯ä¹ä¼è¢« Consumer Group ä¸çæ¯ä¸ª Consumer 齿¶è´¹ä¸æ¬¡ã #### 4.æ¶è´¹æ¶æ¯æ¯pushè¿æ¯pullï¼ RocketMQ没æçæ£æä¹çpushï¼é½æ¯pullï¼è½ç¶æpushç±»ï¼ä½å®é åºå±å®ç°éç¨çæ¯é¿è½®è¯¢æºå¶ï¼å³æåæ¹å¼ã brokerç«¯å±æ§ longPollingEnable æ è®°æ¯å¦å¼å¯é¿è½®è¯¢ãé»è®¤å¼å¯ã #### 5.brokerå¦ä½å¤çæå请æ±çï¼ Consumer馿¬¡è¯·æ±Broker Broker䏿¯å¦æç¬¦åæ¡ä»¶çæ¶æ¯ 妿æ ååºConsumer çå¾ ä¸æ¬¡Consumerçè¯·æ± å¦ææ²¡æ DefaultMessageStore#ReputMessageService#runæ¹æ³ PullRequestHoldService æ¥Holdè¿æ¥ï¼æ¯ä¸ª5sæ§è¡ä¸æ¬¡æ£æ¥pullRequestTableææ²¡ææ¶æ¯ï¼æçè¯ç«å³æ¨é æ¯é1msæ£æ¥commitLog䏿¯å¦ææ°æ¶æ¯ï¼æçè¯åå ¥å°pullRequestTable å½ææ°æ¶æ¯çæ¶åè¿åè¯·æ± æèµ·consumerç请æ±ï¼å³ä¸æå¼è¿æ¥ï¼ä¹ä¸è¿åæ°æ® 使ç¨consumerçoffset #### 6.RocketMQå¦ä½åè´è½½åè¡¡ï¼ éè¿Topicå¨å¤Brokerä¸åå¸å¼åå¨å®ç°ã 1ï¼producer端 åé端æå®message queueåéæ¶æ¯å°ç¸åºçbrokerï¼æ¥è¾¾å°åå ¥æ¶çè´è½½åè¡¡ï¼ æååå ¥ååéï¼å½å¤ä¸ªproduceråæ¶åä¸ä¸ªbrokeråå ¥æ°æ®çæ¶åï¼æ§è½ä¼ä¸é æ¶æ¯åå¸å¨å¤brokerä¸ï¼ä¸ºè´è½½æ¶è´¹ååå¤ é»è®¤çç¥æ¯éæºéæ©ï¼ producerç»´æ¤ä¸ä¸ªindex æ¯æ¬¡åèç¹ä¼èªå¢ indexåææbroker个æ°åä½ èªå¸¦å®¹éçç¥ å ¶ä»å®ç°ï¼ SelectMessageQueueByHash hashçæ¯ä¼ å ¥çargs SelectMessageQueueByRandom SelectMessageQueueByMachineRoom 没æå®ç° ä¹å¯ä»¥èªå®ä¹å®ç°MessageQueueSelectoræ¥å£ä¸çselectæ¹æ³ 2ï¼consumer端 éç¨çæ¯å¹³ååé ç®æ³æ¥è¿è¡è´è½½åè¡¡ã å ¶ä»è´è½½åè¡¡ç®æ³ å¹³ååé çç¥(é»è®¤)(AllocateMessageQueueAveragely) ç¯å½¢åé çç¥(AllocateMessageQueueAveragelyByCircle) æå¨é ç½®åé çç¥(AllocateMessageQueueByConfig) æºæ¿åé çç¥(AllocateMessageQueueByMachineRoom) ä¸è´æ§åå¸åé çç¥(AllocateMessageQueueConsistentHash) é è¿æºæ¿çç¥(AllocateMachineRoomNearby) #### 7.æ¶æ¯é夿¶è´¹å¦ä½è§£å³ï¼ å½±åæ¶æ¯æ£å¸¸åéåæ¶è´¹çéè¦åå æ¯ç½ç»çä¸ç¡®å®æ§ã å¼èµ·é夿¶è´¹çåå 1ï¼ACK æ£å¸¸æ åµä¸å¨consumerçæ£æ¶è´¹å®æ¶æ¯ååºè¯¥åéackï¼éç¥brokerè¯¥æ¶æ¯å·²æ£å¸¸æ¶è´¹ï¼ä»queueä¸åé¤ å½ackå 为ç½ç»åå æ æ³åéå°brokerï¼brokerä¼è®¤ä¸ºè¯æ¡æ¶æ¯æ²¡æè¢«æ¶è´¹ï¼æ¤åä¼å¼å¯æ¶æ¯éææºå¶ææ¶æ¯å次æéå°consumer 2ï¼æ¶è´¹æ¨¡å¼ å¨CLUSTERING模å¼ä¸ï¼æ¶æ¯å¨brokerä¸ä¼ä¿è¯ç¸ågroupçconsumeræ¶è´¹ä¸æ¬¡ï¼ä½æ¯é对ä¸ågroupçconsumer伿¨é夿¬¡ è§£å³æ¹æ¡ 1ï¼æ°æ®åºè¡¨ å¤çæ¶æ¯åï¼ä½¿ç¨æ¶æ¯ä¸»é®å¨è¡¨ä¸å¸¦æçº¦æçåæ®µä¸insert 2ï¼Map åæºæ¶å¯ä»¥ä½¿ç¨map ConcurrentHashMap -> putIfAbsent guava cache 3ï¼Redis åå¸å¼éæèµ·æ¥ã #### 8.å¦ä½è®©RocketMQä¿è¯æ¶æ¯çé¡ºåºæ¶è´¹ï¼ é¦å å¤ä¸ªqueueåªè½ä¿è¯å个queueéç顺åºï¼queueæ¯å ¸åçFIFOï¼å¤©ç¶é¡ºåºãå¤ä¸ªqueueåæ¶æ¶è´¹æ¯æ æ³ç»å¯¹ä¿è¯æ¶æ¯çæåºæ§çãæä»¥æ»ç»å¦ä¸ï¼ åä¸topicï¼åä¸ä¸ªQUEUEï¼åæ¶æ¯çæ¶åä¸ä¸ªçº¿ç¨å»åéæ¶æ¯ï¼æ¶è´¹çæ¶å ä¸ä¸ªçº¿ç¨å»æ¶è´¹ä¸ä¸ªqueueéçæ¶æ¯ã #### 9.RocketMQå¦ä½ä¿è¯æ¶æ¯ä¸ä¸¢å¤±ï¼ é¦å å¨å¦ä¸ä¸ä¸ªé¨åé½å¯è½ä¼åºç°ä¸¢å¤±æ¶æ¯çæ åµï¼ Producer端 Broker端 Consumer端 1ï¼Producer端å¦ä½ä¿è¯æ¶æ¯ä¸ä¸¢å¤± éåsend()忥忶æ¯ï¼åéç»ææ¯åæ¥æç¥çã åé失败åå¯ä»¥éè¯ï¼è®¾ç½®éè¯æ¬¡æ°ãé»è®¤3次ã producer.setRetryTimesWhenSendFailed(10); é群é¨ç½²ï¼æ¯å¦åé失败äºçåå å¯è½æ¯å½åBroker宿ºäºï¼éè¯çæ¶åä¼åéå°å ¶ä»Brokerä¸ã 2ï¼Broker端å¦ä½ä¿è¯æ¶æ¯ä¸ä¸¢å¤± ä¿®æ¹å·ççç¥ä¸ºåæ¥å·çãé»è®¤æ åµä¸æ¯å¼æ¥å·ççã flushDiskType = SYNC_FLUSH é群é¨ç½²ï¼ä¸»ä»æ¨¡å¼ï¼é«å¯ç¨ã 3ï¼Consumer端å¦ä½ä¿è¯æ¶æ¯ä¸ä¸¢å¤± å®å ¨æ¶è´¹æ£å¸¸åå¨è¿è¡æå¨ack确认ã #### 10.rocketMQçæ¶æ¯å 积å¦ä½å¤ç é¦å è¦æ¾å°æ¯ä»ä¹åå 导è´çæ¶æ¯å ç§¯ï¼æ¯Producer太å¤äºï¼Consumer太å°äºå¯¼è´çè¿æ¯è¯´å ¶ä»æ åµï¼æ»ä¹å å®ä½é®é¢ã ç¶åç䏿¶æ¯æ¶è´¹é度æ¯å¦æ£å¸¸ï¼æ£å¸¸çè¯ï¼å¯ä»¥éè¿ä¸çº¿æ´å¤consumer临æ¶è§£å³æ¶æ¯å 积é®é¢ã #### 11.RocketMQå¨åå¸å¼äºå¡æ¯æè¿åæºå¶çåºå±åç? åå¸å¼ç³»ç»ä¸çäºå¡å¯ä»¥ä½¿ç¨TCCï¼TryãConfirmãCancelï¼ã2pcæ¥è§£å³åå¸å¼ç³»ç»ä¸çæ¶æ¯ååæ§ RocketMQ 4.3+æä¾åå¸äºå¡åè½ï¼éè¿ RocketMQ äºå¡æ¶æ¯è½è¾¾å°åå¸å¼äºå¡çæç»ä¸è´ RocketMQå®ç°æ¹å¼ï¼ Half Messageï¼é¢å¤çæ¶æ¯ï¼å½brokeræ¶å°æ¤ç±»æ¶æ¯åï¼ä¼åå¨å°RMQ_SYS_TRANS_HALF_TOPICçæ¶æ¯æ¶è´¹éåä¸ æ£æ¥äºå¡ç¶æï¼Brokerä¼å¼å¯ä¸ä¸ªå®æ¶ä»»å¡ï¼æ¶è´¹RMQ_SYS_TRANS_HALF_TOPICéåä¸çæ¶æ¯ï¼æ¯æ¬¡æ§è¡ä»»å¡ä¼åæ¶æ¯åéè 确认äºå¡æ§è¡ç¶æï¼æäº¤ãåæ»ãæªç¥ï¼ï¼å¦ææ¯æªç¥ï¼Brokerä¼å®æ¶å»åè°å¨éæ°æ£æ¥ã è¶ æ¶ï¼å¦æè¶ è¿åæ¥æ¬¡æ°ï¼é»è®¤åæ»æ¶æ¯ã ä¹å°±æ¯ä»å¹¶æªçæ£è¿å ¥Topicçqueueï¼èæ¯ç¨äºä¸´æ¶queueæ¥æ¾æè°çhalf messageï¼çæäº¤äºå¡åæä¼çæ£çå°half message转移å°topicä¸çqueueã #### 12.å¦æè®©ä½ æ¥å¨æå®ç°ä¸ä¸ªåå¸å¼æ¶æ¯ä¸é´ä»¶ï¼æ´ä½æ¶æä½ ä¼å¦ä½è®¾è®¡å®ç°? éè¦èèè½å¿«éæ©å®¹ãå¤©ç¶æ¯æé群 æä¹ åçå§¿å¿ é«å¯ç¨æ§ æ°æ®0丢失çèè æå¡ç«¯é¨ç½²ç®åãclient端使ç¨ç®å #### 13.é«ååéä¸å¦ä½ä¼åç产è åæ¶è´¹è çæ§è½? 1ï¼å¼å åä¸groupä¸ï¼å¤æºé¨ç½²ï¼å¹¶è¡æ¶è´¹ å个Consumeræé«æ¶è´¹çº¿ç¨ä¸ªæ° æ¹éæ¶è´¹ãæ¶æ¯æ¹éæåï¼ä¸å¡é»è¾æ¹éå¤çã 2ï¼è¿ç»´ ç½å¡è°ä¼ jvmè°ä¼ å¤çº¿ç¨ä¸cpuè°ä¼ Page Cache #### 14.å说说RocketMQ æ¯å¦ä½ä¿è¯æ°æ®çé«å®¹éæ§ç? å¨ä¸å¼å¯å®¹éçæ åµä¸ï¼è½®è¯¢éåè¿è¡åéï¼å¦æå¤±è´¥äºï¼éè¯çæ¶åè¿æ»¤å¤±è´¥çBroker 妿å¼å¯äºå®¹éçç¥ï¼ä¼éè¿RocketMQç颿µæºå¶æ¥é¢æµä¸ä¸ªBrokeræ¯å¦å¯ç¨ 妿䏿¬¡å¤±è´¥çBrokerå¯ç¨é£ä¹è¿æ¯ä¼éæ©è¯¥Brokerçéå 妿ä¸è¿°æ åµå¤±è´¥ï¼åéæºéæ©ä¸ä¸ªè¿è¡åé å¨åéæ¶æ¯çæ¶åä¼è®°å½ä¸ä¸è°ç¨çæ¶é´ä¸æ¯å¦æ¥éï¼æ ¹æ®è¯¥æ¶é´å»é¢æµbrokerçå¯ç¨æ¶é´ #### 15.ä»»ä½ä¸å°Brokerçªç¶å®æºäºæä¹åï¼ Broker䏻仿¶æä»¥åå¤å¯æ¬çç¥ãMasteræ¶å°æ¶æ¯åä¼åæ¥ç»Slaveï¼è¿æ ·ä¸æ¡æ¶æ¯å°±ä¸æ¢ä¸ä»½äºï¼Master宿ºäºè¿æslaveä¸çæ¶æ¯å¯ç¨ï¼ä¿è¯äºMQçå¯é æ§åé«å¯ç¨æ§ãèä¸Rocket MQ4.5.0å¼å§å°±æ¯æäºDlegder模å¼ï¼åºäºraftçï¼åå°äºçæ£æä¹çHAã #### åèèµæ https://www.cnblogs.com/javazhiyin/p/13327925.html