# æ¶æ¯éåé¢è¯é¢
å¤§å®¶å¥½ï¼ææ¯å°æã
æ¶æ¯éåè¿åï¼å¨é¢è¯éåºç°çé¢çè¶æ¥è¶é«ï¼å°¤å ¶æ¯åè¿æä¸å®è§æ¨¡ä¸å¡çåå¦ï¼åºæ¬é䏿ãå¾å¤äººå¹³æ¶ç¨ MQ å°±æ¯å¾éåæ¶æ¯ãæ¶è´¹æ¶æ¯ï¼é®èµ·æ¥è½è¯´åºä¸ª"è§£è¦ã弿¥ãåå³°"ï¼ä½ä¸æ¦è¢«è¿½é®"æ¶æ¯ä¸¢äºæä¹å""æ¶æ¯éå¤äºæä¹å¤ç""积åäºå ç¾ä¸æ¡æ¶æ¯æä¹è§£å³"ï¼å°±å¼å§è¯´ä¸æ¸ æ¥äºãè¿åç¥è¯å ¶å®ä¸ç®é¾ï¼ä½è¦çå¾ææ·±åº¦ï¼è¿æ¯å¾æåçæéã
è¿ç¯æç« æ´çäºæ¶æ¯éåé¢è¯ä¸æå¸¸è¢«é®å°çç¥è¯ç¹ï¼æ¶µç MQ ç使ç¨åºæ¯ãæ¶æ¯å¯é æ§ãå¹çå¤çãæ¶æ¯ç§¯åï¼ä»¥å RocketMQãKafkaãRabbitMQ ä¸å¤§ä¸»æµ MQ çæ ¸å¿åçå对æ¯ï¼è¦çæ¯è¾å ¨é¢ã
æå åå¨é¢è¯éç¹å«å®¹æè¢«æ·±æï¼å»ºè®®éç¹è±æ¶é´ï¼
- æ¶æ¯å¯é æ§ï¼ç产è ãBrokerãæ¶è´¹è ä¸ä¸ªç¯èåèªæä¹ä¿è¯ä¸ä¸¢æ¶æ¯ï¼è¿æ¯å¿ èé¢ï¼èä¸èå®å¾åæ¬¢è¿½é®æ¯ä¸ªç¯èçç»èã
- é夿¶è´¹åå¹çï¼ä¸ºä»ä¹ä¼éå¤ãæä¹è®¾è®¡å¹çæ¹æ¡ï¼è¿ä¸ªåä¸å¡ç»åå¾ç´§ï¼çèµ·æ¥å®¹ææµäºè¡¨é¢ã
- æ¶æ¯ç§¯åï¼å¦ä½å¿«éå¤ç积åï¼å°¤å ¶æ¯ RocketMQ ééåæ°åæ¶è´¹è æ°çå ³ç³»ï¼æ¯å¾å¤äººçç²åºã
- Kafka å RocketMQ çåºå«ï¼å卿¨¡åãåè°æºå¶ãéç¨åºæ¯ï¼è¿æ¯é«é¢å¯¹æ¯é¢ï¼é¢è¯éé®å¾å¾å¤ã
- äºå¡æ¶æ¯ï¼æä¹ä¿è¯æ¬å°äºå¡åæ¶æ¯åéçä¸è´æ§ï¼åæ¶æ¯æºå¶æ¯æä¹å·¥ä½çï¼è¿åè½ååå¸å¼äºå¡æé©ï¼ç好äºå¾å åã
å¦æä½ æ¯ç¬¬ä¸æ¬¡ç³»ç»åå¤è¿åï¼å»ºè®®å ææ¸ æ¥ MQ çåºæ¬åçï¼ä¸ºä»ä¹ç¨ãæä¹ç¨ï¼ï¼åå»çå¯é æ§åå¹çè¿ä¸¤ä¸ªæ ¸å¿é®é¢ï¼ç¶åå对æ¯å ä¸ªä¸»æµ MQ çå·®å¼ï¼è¿ä¸ªé¡ºåºå¦ä¸æ¥ä¼æ¯è¾é¡ºã
# æ¶æ¯éååºæ¯
# ä»ä¹æ¯æ¶æ¯éåï¼
ä½ å¯ä»¥ææ¶æ¯éåç解为ä¸ä¸ªä½¿ç¨é忥éä¿¡çç»ä»¶ãå®çæ¬è´¨ï¼å°±æ¯ä¸ªè½¬åå¨ï¼å å«åæ¶æ¯ãåæ¶æ¯ãæ¶è´¹æ¶æ¯çè¿ç¨ãæç®åçæ¶æ¯é忍¡åå¦ä¸ï¼

æä»¬éå¸¸è¯´çæ¶æ¯éåï¼ç®ç§°MQï¼Message Queueï¼ï¼å®å
¶å®å°±ææ¶æ¯ä¸é´ä»¶ï¼å½åä¸çæ¯è¾æµè¡ç弿ºæ¶æ¯ä¸é´ä»¶å
æ¬ï¼RabbitMQãRocketMQãKafkaã
# 为ä»ä¹éè¦æ¶æ¯éåï¼
妿ç¨ä¸å¥è¯æ¦æ¬ä¸ºä»ä¹æä»¬è¦å¤§è´¹å¨ç« å°å¼å ¥ MQï¼æ ¸å¿å ¶å®å°±æ¯ä¸ºäºè§£å³ç³»ç»æ¶æä¸çä¸å¤§çç¹ï¼è§£è¦ã弿¥ãåå³°ã
æå¯ä»¥ç»åå®é çä¸å¡åºæ¯ï¼ç»ä½ è¿è´¯å°æ±æ¥ä¸ä¸è¿ä¸ç¹ï¼
第ä¸ç¹ï¼ææ ¸å¿çä½ç¨æ¯ä¸ºäºãè§£è¦ãï¼æç»å¨ä¸èµ·çç³»ç»æå¼ï¼ã 卿²¡æ MQ çæ¶åï¼å设æä»¬å个çµåç³»ç»ï¼ç¨æ·ä»å®æ¬¾åï¼ç³»ç»è¦å¹²å¥½å ä»¶äºï¼æ£åºåãå伿 å¸ãå 积åãè¿è¦åçä¿¡éç¥ãå¦æè®¢åç³»ç»ç´æ¥ç¨ RPC è°ç¨å»æ¨ä¸ªéç¥è¿äºåç³»ç»ï¼é£ä»£ç å°±é«åº¦è¦åå¨äºä¸èµ·ãä¸ä¸æä¸å¤©ä¸éè¦åçä¿¡äºï¼æè æ°å äºä¸ä¸ªèªå¨åè´§æå¡ï¼è®¢åç³»ç»çç å就徿´å¤©å»æ¹ä»£ç éæ°åçï¼æ´å«æå¦æåªå¤©ãå积åæå¡ãæäºæ¥éï¼çè³ä¼è¿ç´¯æ´ä¸ªè®¢åæ¯ä»æµç¨è·ç失败ã å¼å ¥ MQ åï¼æ´ä¸ªé»è¾å°±åäºã订åç³»ç»ä»å®æ¬¾ï¼å®åªéè¦å¯¹ç MQ 丢ä¸å¥è¯ï¼å䏿¡æ¶æ¯ï¼ï¼ãç¨æ·Aæ¯ä»æåäºãï¼å®ç主线任å¡å°±å½»åºç»æäºãåç»ä¸ç®¡æå 个åç³»ç»å ³å¿è¿ä»¶äºï¼å®ä»¬èªå·±å»è®¢é MQ 就好äºï¼åªæä»¥åæ°å åå¤ä¾èµæå¡ï¼è®¢åç³»ç»ç代ç ä¹ä¸è¡é½ä¸ç¨æ¹ãè¿å°±è¾¾å°äºç©çåé»è¾ä¸çå½»åºè§£è¦ï¼ç³»ç»å®¹éçæé«ã
第äºç¹ï¼é¡ºçæç« 带æ¥çæ§è½æåå«ä½ã弿¥ãã ç´§æ¥ä¸é¢çä¾åï¼å¦æè¦ä¸²è¡è°ç¨åçä¿¡ãå 积åççè¿ä¹å¤éæ ¸å¿æµç¨ï¼åªææ¯ä¸ªæ¥å£åªç¨ 50 毫ç§ï¼å èµ·æ¥ç¨æ·å¨é¡µé¢çå¾ çæ¶é´å¯è½å°±å¾å¤§åç§çè³å¥½å ç§ï¼ç¯ç转ååï¼ä½éªæå·®ã æäº MQï¼ä¸»æµç¨å ¶å®åªéè¦æç¶ææ¹æï¼ç¶åå¾ MQ éæä¸æ¡æ¶æ¯ï¼èæ¶å¤§æ¦å 毫ç§ï¼ï¼ç«å»å°±å¯ä»¥ç»å端ååºãæåä½ æ¯ä»æåãäºãååçä¿¡ãå 积åè¿ç§ã䏿¯éå¾å¨è¿é¶ç¹å ç§å 宿ãçæä½ï¼å®å ¨å¯ä»¥è®©ç³»ç»å¨åå°é¡ºç MQ æ ¢æ ¢æ§è¡ï¼è¿æ ·åå°æ¥å£çååºæ¶é´å°±å¤§å¹ 缩çäºã
第ä¸ç¹ï¼æ¯é«å¹¶ååºæ¯ä¸çä¿å½ç¥å¨ï¼å«ä½ãåå³°å¡«è°·ãã 平常æä»¬åºå±ç MySQL æ°æ®åºï¼ä¸ç§éæä¸ªä¸ä¸¤åå¹¶åå¯è½æ²¡äºã使¯ä¸æ¦æä¿éãç§æï¼ç¬é´å¦ææä¸¤ä¸ä¸ªè¯·æ±æ¶è¿æ¥ï¼å¦æç´æ¥æå°æ°æ®åºä¸ï¼æ°æ®åºç»å¯¹å½åºå®æºã è¿ä¸ªæ¶åï¼MQ å°±æ®æ¼äºä¸ä¸ªæå ¶å ³é®ç**ãèæ°´æ± ãæè ãæéåºã**çä½ç¨ãè¿ä¸¤ä¸ä¸ªç¬æ¶çæ´è¯·æ±è¿æ¥ï¼æä»¬ç»ä¸å æè¿ MQ éæåçãç¶åå端ç订åå¤çç¨åºï¼æ ¹æ®èªå·±æ°æ®åºçå®çæåè½åï¼å¹³ç¨³å°ã以ä¸ç§éä¸ä¸¤å个çéåº¦ï¼æ ¢æ ¢ä» MQ éå¾å¤æä»»å¡æ¥æ¶åãè¿å°±å游ä¹åºé¨å£çèå½¢æéééï¼æç¬é´çåçæµéæ´ªå³°ï¼åå³°ï¼ï¼åæ£å°äºåç»æ ¢æ ¢å¤çï¼å¡«è°·ï¼ãè½ç¶ç¨æ·ä½æä¸å¯è½æ¯æéå¤äºå ç§éï¼ä½æ»æ¯æ´ä¸ªå¤§çç³»ç»å´©æºè¦å¥½æ æ°åã
æ»ç»ä¸ä¸ï¼ å¼å ¥æ¶æ¯éåï¼ç¡®å®ä¼è®©ç³»ç»æ´ä½å夿ï¼è¿éè¦å¤çæ¶æ¯ä¸ä¸¢å¤±ãä¸é夿¶è´¹è¿äºéº»ç¦äºå¿ã使¯ä¸ºäºæ¢åå个æå¡ä¹é´çè§£è¦ãæ ¸å¿æ¥å£éè¿å¼æ¥å¤§å¹ åå°ååºæ¶é´ã以åé¢å¯¹å åå ååçªåæµéæ¶çåå³°ä¿å½ï¼è¿å¨ç¨å¾®å¤æä¸ç¹çç³»ç»é齿¯æå ¶å¿ è¦çãè¿å°±æ¯æä»¬éè¦ MQ çæ ¹æ¬åå ã
# æ¶æ¯éåæä»ä¹ç¼ºç¹ï¼
å ³äºæ¶æ¯éåï¼MQï¼çä¼ç¼ºç¹ï¼å¨è½¯ä»¶æ¶æè®¾è®¡éæä¸å¥èè¯å«ã没æé¶å¼¹ããå¼å ¥ MQ ç»å¯¹æ¯ä¸æ¬¡å ¸åç Trade-offï¼ææ¯æè¡¡ï¼ï¼å®æ¢è½æ¯æç³»ç»ï¼åè½å¸¦æ¥ä¸å 让人头ç¼ç麻ç¦ã
æä»¬å¯ä»¥å䏤颿¥çï¼
é¦å æ¯å®çä¼ç¹ï¼æ»ç»èµ·æ¥å°±æ¯ãç³»ç»æ¶ææå½ç䏿¿æ§ãï¼
- è§£è¦ï¼æåä¸ªåæ¬äºç¸å ³èçç³»ç»æè§£å¼ãA ç³»ç»åªè¦ææ¶æ¯ä¸¢ç» MQ å°±å®äºäºï¼B ç³»ç»æè æ¥åæ°å ç C ç³»ç»æ³è¦æ°æ®ï¼èªå·±å» MQ æ¿å°±è¡ãA ç³»ç»ç代ç ä¸ç¨å为äºå«çç³»ç»é¢ç¹ä¿®æ¹ï¼å¤§å®¶åå¹²åçã
- 弿¥ï¼æåäºç¨æ·çååºé度ãä¸äºéæ ¸å¿ãä½åå¾è´¹æ¶é´çæä½ï¼æ¯å¦åçä¿¡ãé积åï¼ï¼å ¨é¨æè¿ MQ åå°æ ¢æ ¢æ§è¡ã主æµç¨å 毫ç§å°±ç»æäºï¼ç¨æ·ç使æä½³ã
- åå³°ï¼è¿æ¯å¤§ä¿ãç§ææ¶æ¡å¨æ°æ®åºåé¢çè¶ çº§ç¾çãææ´ªæ°´çå ½è¬ç¬é´æ¶å ¥çå¹¶å请æ±ï¼å æ¦æªå¨ MQ çéåéï¼åæäºç»æ°´é¿æµï¼è®©æ°æ®åºè½æç §èªå·±çèå¥å¹³ç¨³å¤çï¼ä¿ä½ç³»ç»ä¸å´©æºã
使¯ï¼æ¢ç¶å®è¿ä¹å¥½ï¼ä¸ºä»ä¹ä¸æ¯ä¸ªå°æ¹é½å å¢ï¼è¿å°±ä¸å¾ä¸æå®å¸¦æ¥çä¸å¤§ç¼ºç¹æè 说æ¯å·¨å¤§ææï¼
第ä¸ï¼ç³»ç»æ´ä½çãå¯ç¨æ§ãåèåä½äºã 卿²¡æ MQ æ¶ï¼A ç³»ç»ç´æ¥è° B ç³»ç»ï¼åªè¦å®ä¿©ä¸åºé®é¢å°±è¡ãç°å¨ä¸é´æ¨ªæäºä¸ä¸ª MQ ç»ä»¶ï¼å¤æäºä¸ä¸ªãä¸é´äººãã䏿¦è¿ä¸ªæºå¨å®æºãç½ç»æ éï¼æ´ä¸ªä¸å¡é¾è·¯ç´æ¥ç«çªãæä»¥å¼å ¥ MQï¼ä½ å°±ä¸å¾ä¸è±å¤§ä»·é±åç²¾å廿æ¯å¦ä¸»ä»é群ï¼å»ä¿è¯ MQ çç»å¯¹é«å¯ç¨ï¼ä¸ç¶è¿å°±æ¯ç»ç³»ç»åä¸äºä¸é¢å¤§é·ã
第äºï¼ç³»ç»çãå¼å夿æ§ãåææ°çº§ä¸åã 忬å¾ç®åçä¸ä¸ªæ¹æ³è°ç¨ï¼æ¢æåæ¶æ¯ä¹åï¼å¼å人åå°±é¢ä¸´æ æ°ä¸ªè®©äººæå¤´åçå¼å¸¸åºæ¯ãæ¯å¦ï¼ç½ç»æå¨å¯¼è´ä¸æ¡æ¶æ¯åäºä¸¤æ¬¡ï¼B ç³»ç»æä¹ä¿è¯ä¸æèçç鱿£ä¸¤æ¬¡ï¼ï¼è¿å°±éè¦åè·¨ä¸å¡çé²éåå¹çæ§è®¾è®¡ï¼ï¼åæ¯å¦ï¼MQ èªå·±éå¯äºï¼è¿æ²¡å¤çå®çæ¶æ¯æä¹ä¿è¯ä¸ä¸¢å¤±ï¼è¿äºé½éè¦æä»¬å¨åä»£ç æ¶å¢å é常å¤ç确认æºå¶ãè¡¥å¿æºå¶ã
第ä¸ï¼æå¤´ç¼çãæ°æ®ä¸è´æ§ãé®é¢ã A ç³»ç»æ¬å°ä¸å¡æ§è¡æåäºï¼æ¶æ¯åç» MQ äºï¼å°±é«é«å ´å ´åè¯å端ãæä½æåããç»æä¸æ¸¸ç B ç³»ç»æ¿å°è¿æ¡æ¶æ¯åï¼ç±äºä¸æ¡ç©ºæéå¼å¸¸æ²¡å¤ç好ï¼ä¸å¡å¤±è´¥äºãç°å¨å¥½äºï¼A 以为æåäºï¼B å®é 失败äºï¼ä¸¤è¾¹çæ°æ®äº§çå½»åºçè±èãæ³è¦è§£å³è¿ä¸ªé®é¢ï¼æä»¬å°±ä¸å¾ä¸å¼å ¥ç¸å¯¹å¤æçãåå¸å¼äºå¡ãæ¹æ¡ï¼æè å¼åé¢å¤ç对账å人工补å¿å·¥å ·ã
æ»ç»ä¸ä¸ï¼ MQ 就忝䏿å¨å巨大çé忦å¨ï¼ä¼ç¹æå ¶èç¼ãä½å®ç缺ç¹å³å®äºï¼æä»¬ç»ä¸æ¯é¢åå°±ç¨ãåªæå½ä¸å¡åºæ¯çç对解è¦ã弿¥ãæé«å¹¶åæå¼ºçéæ±ï¼ä¸è¿é¨åæ¶çè¿è¿å¤§è¿å¼å ¥è¿äºå¤ææ§å¸¦æ¥çéº»ç¦æ¶ï¼æä»¬æä¼å»è°¨æ å°ä½¿ç¨å®ã
# æ¶æ¯éåæä¹éåï¼
KafkaãActiveMQãRabbitMQãRocketMQæ¥è¿è¡ä¸å维度对æ¯ã
| ç¹æ§ | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
|---|---|---|---|---|
| åæºååé | ä¸çº§ | ä¸çº§ | 10 ä¸çº§ | 10 ä¸çº§ |
| æ¶ææ§ | 毫ç§çº§ | å¾®ç§çº§ | 毫ç§çº§ | 毫ç§çº§ |
| å¯ç¨æ§ | é«ï¼ä¸»ä»ï¼ | é«ï¼ä¸»ä»ï¼ | é常é«ï¼åå¸å¼ï¼ | é常é«ï¼åå¸å¼ï¼ |
| æ¶æ¯éå¤ | è³å°ä¸æ¬¡ | è³å°ä¸æ¬¡ | è³å°ä¸æ¬¡ æå¤ä¸æ¬¡ | è³å°ä¸æ¬¡æå¤ä¸æ¬¡ |
| æ¶æ¯é¡ºåºæ§ | æåº | æåº | æåº | ååºæåº |
| æ¯æä¸»é¢æ° | å级 | ç¾ä¸çº§ | å级 | ç¾çº§ï¼å¤äºæ§è½ä¸¥é䏿» |
| æ¶æ¯å溯 | 䏿¯æ | 䏿¯æ | æ¯æï¼ææ¶é´åæº¯ï¼ | æ¯æï¼æoffsetåæº¯ï¼ |
| 管ççé¢ | æ®é | æ®é | å®å | æ®é |
éåçæ¶åï¼æä»¬éè¦æ ¹æ®ä¸å¡åºæ¯ï¼ç»åä¸è¿°ç¹æ§æ¥è¿è¡éåã
æ¯å¦ä½ è¦æ¯æå¤©ç«ååä¸ç±»è¶ 大åçç§ææ´»å¨ï¼è¿ç§ä¸é¤åä¹°åï¼é£ç®¡ççé¢ãæ¶æ¯å溯å¥çä¸éè¦ã
æä»¬éè¦çä»ä¹ï¼çååéï¼
æä»¥ä¼å éKafkaåRocketMQè¿ç§æ´é«ååçã
æ¯å¦åä¸ä¸ªå ¬å¸çä¸å°ï¼å¯¹å¤æä¾è½åï¼é£å¯è½ä¼æå¾å¤ä¸»é¢æ¥å ¥ï¼è¿æ¶å主é¢ä¸ªæ°åæ¯å¾éè¦çèéï¼åKafkaè¿æ ·ç¾çº§çï¼å°±ä¸å¤ªç¬¦åè¦æ±ï¼å¯ä»¥æ ¹æ®æ åµèèå级çRocketMQï¼çè³ç¾ä¸çº§çRabbitMQã
忝妿¯ä¸ä¸ªéèç±»ä¸å¡ï¼é£ä¹éç¹èèçå°±æ¯ç¨³å®æ§ãå®å ¨æ§ï¼åå¸å¼é¨ç½²çKafkaåRocketå°±æ´æä¼å¿ã
ç¹å«è¯´ä¸ä¸æ¶ææ§ï¼RabbitMQ以微ç§çæ¶æä½ä¸ºæçï¼ä½å®é 䏿¯«ç§åå¾®ç§ï¼å¨ç»å¤§å¤æ°æ åµä¸ï¼é½æ²¡ææç¥çåºå«ï¼å ä¸ç½ç»å¸¦æ¥çæ³¢å¨ï¼è¿ä¸ç¹å¨ç产è¿ç¨ä¸ï¼åèä¸ä¼ä½ä¸ºéè¦çèéã
å ¶å®çç¹æ§ï¼å¦æ¶æ¯ç¡®è®¤ãæ¶æ¯å溯ï¼ä¹ç»å¸¸ä½ä¸ºèéçåºæ¯ï¼ç®¡ççé¢çè¯è¯å ¬å¸èå®äºï¼åæ£æåè¿çå°æ¹ï¼é½ä¸çéè¿ä¸ªï¼æ¯ç«é½æèªå·±çè¿ç»´ä½ç³»ã
# æ¶æ¯éå使ç¨åºæ¯æåªäºï¼
- è§£è¦ï¼å¯ä»¥å¨å¤ä¸ªç³»ç»ä¹é´è¿è¡è§£è¦ï¼å°åæ¬éè¿ç½ç»ä¹é´çè°ç¨çæ¹å¼æ¹ä¸ºä½¿ç¨MQè¿è¡æ¶æ¯ç弿¥é讯ï¼åªè¦è¯¥æä½ä¸æ¯éè¦åæ¥çï¼å°±å¯ä»¥æ¹ä¸ºä½¿ç¨MQè¿è¡ä¸åç³»ç»ä¹é´çèç³»ï¼è¿æ ·é¡¹ç®ä¹é´ä¸ä¼åå¨è¦åï¼ç³»ç»ä¹é´ä¸ä¼äº§ç太大çå½±åï¼å°±ç®ä¸ä¸ªç³»ç»æäºï¼ä¹åªæ¯æ¶æ¯æ¤åå¨MQé颿²¡äººè¿è¡æ¶è´¹èå·²ï¼ä¸ä¼å¯¹å ¶ä»çç³»ç»äº§çå½±åã
- 弿¥ï¼å å ¥ä¸ä¸ªæä½è®¾è®¡å°å¥½å 个æ¥éª¤ï¼è¿äºæ¥éª¤ä¹é´ä¸éè¦åæ¥å®æï¼æ¯å¦å®¢æ·å»å建äºä¸ä¸ªè®¢åï¼è¿è¦å»å®¢æ·è½¨è¿¹ç³»ç»æ·»å 䏿¡è½¨è¿¹ãå»åºåç³»ç»æ´æ°åºåãå»å®¢æ·ç³»ç»ä¿®æ¹å®¢æ·çç¶æççãè¿æ ·å¦æè¿ä¸ªç³»ç»é½ç´æ¥è¿è¡è°ç¨ï¼é£ä¹å°ä¼äº§ç大éçæ¶é´ï¼è¿æ ·å¯¹äºå®¢æ·æ¯æ æ³æ¥æ¶çï¼å¹¶ä¸åæ·»å 客æ·è½¨è¿¹è¿ç§æä½æ¯ä¸éè¦å»åæ¥æä½çï¼å¦æä½¿ç¨MQå°å®¢æ·åå»ºè®¢åæ¶ï¼å°åé¢ç轨迹ãåºåãç¶æçä¿¡æ¯çæ´æ°å ¨é½æ¾å°MQéé¢ç¶åå»å¼æ¥æä½ï¼è¿æ ·å°±å¯å å¿«ç³»ç»ç访é®éåº¦ï¼æä¾æ´å¥½ç客æ·ä½éªã
- åå³°ï¼ä¸ä¸ªç³»ç»è®¿é®æµéæé«å³°æ¶æï¼ä¹æä½å³°æ¶æï¼æ¯å¦è¯´ï¼ä¸åæ´ç¹æä¸ä¸ªæ¢è´æ´»å¨ççãæ¯å¦ç³»ç»å¹³æ¶æµéå¹¶ä¸é«ï¼ä¸ç§éåªæ100å¤ä¸ªå¹¶å请æ±ï¼ç³»ç»å¤ç没æä»»ä½ååï¼ä¸åé£å¹³æµªéï¼å°äºæä¸ªæ¢è´æ´»å¨æ¶é´ï¼ç³»ç»å¹¶å访é®äºå§å¢ï¼æ¯å¦è¾¾å°äºæ¯ç§5000个并å请æ±ï¼èæä»¬çç³»ç»æ¯ç§åªè½å¤ç2000个请æ±ï¼é£ä¹ç±äºæµéå¤ªå¤§ï¼æä»¬çç³»ç»ãæ°æ®åºå¯è½å°±ä¼å´©æºãè¿æ¶å¦æä½¿ç¨MQè¿è¡æµéåå³°ï¼å°ç¨æ·ç大鿶æ¯ç´æ¥æ¾å°MQéé¢ï¼ç¶åæä»¬çç³»ç»å»æèªå·±çæå¤§æ¶è´¹è½å廿¶è´¹è¿äºæ¶æ¯ï¼å°±å¯ä»¥ä¿è¯ç³»ç»ç稳å®ï¼åªæ¯å¯è½è¦è·è¿ä¸å¡é»è¾ï¼ç»ç¨æ·è¿åç¹å®é¡µé¢æè ç¨åéè¿å ¶ä»æ¹å¼éç¥å ¶ç»æ
# æ¶æ¯é夿¶è´¹æä¹è§£å³ï¼
ç产端为äºä¿è¯æ¶æ¯åéæåï¼å¯è½ä¼é夿¨é(ç´å°æ¶å°æåACK)ï¼ä¼äº§çé夿¶æ¯ã使¯ä¸ä¸ªæççMQ Serveræ¡æ¶ä¸è¬ä¼æ³åæ³è§£å³ï¼é¿å åå¨é夿¶æ¯(æ¯å¦ï¼ç©ºé´æ¢æ¶é´ï¼åå¨å·²å¤çè¿çmessage_id)ï¼ç»ç产端æä¾ä¸ä¸ªå¹çæ§çåéæ¶æ¯æ¥å£ã
使¯æ¶è´¹ç«¯å´æ æ³æ ¹æ¬è§£å³è¿ä¸ªé®é¢ï¼å¨é«å¹¶åæ åè¦æ±ä¸ï¼æåæ¶æ¯+ä¸å¡å¤ç+æäº¤æ¶è´¹ä½ç§»éè¦åäºå¡å¤çï¼å¦å¤æ¶è´¹ç«¯æå¡å¯è½å®æºï¼å¾å¯è½ä¼æåå°é夿¶æ¯ã
æä»¥ï¼åªè½ä¸å¡ç«¯èªå·±åæ§å¶ï¼å¯¹äºå·²ç»æ¶è´¹æåçæ¶æ¯ï¼æ¬å°æ°æ®åºè¡¨æRedisç¼åä¸å¡æ è¯ï¼æ¯æ¬¡å¤çåå è¿è¡æ ¡éªï¼ä¿è¯å¹çã
# æ¶æ¯ä¸¢å¤±æä¹è§£å³çï¼
使ç¨ä¸ä¸ªæ¶æ¯éåï¼å ¶å®å°±å为ä¸å¤§åï¼ç产è ãä¸é´ä»¶ãæ¶è´¹è ï¼æä»¥è¦ä¿è¯æ¶æ¯å°±æ¯ä¿è¯ä¸ä¸ªç¯èé½ä¸è½ä¸¢å¤±æ°æ®ã

- æ¶æ¯çäº§é¶æ®µï¼ç产è ä¼ä¸ä¼ä¸¢æ¶æ¯ï¼åå³äºç产è 对äºå¼å¸¸æ åµçå¤çæ¯å¦åçã仿¶æ¯è¢«çäº§åºæ¥ï¼ç¶åæäº¤ç» MQ çè¿ç¨ä¸ï¼åªè¦è½æ£å¸¸æ¶å° ï¼ MQ ä¸é´ä»¶ï¼ ç ack 确认ååºï¼å°±è¡¨ç¤ºåéæåï¼æä»¥åªè¦å¤ç好è¿åå¼åå¼å¸¸ï¼å¦æè¿åå¼å¸¸åè¿è¡æ¶æ¯éåï¼é£ä¹è¿ä¸ªé¶æ®µæ¯ä¸ä¼åºç°æ¶æ¯ä¸¢å¤±çã
- æ¶æ¯åå¨é¶æ®µï¼Kafka å¨ä½¿ç¨æ¶æ¯é¨ç½²ä¸ä¸ªé群ï¼ç产è å¨å叿¶æ¯æ¶ï¼éåä¸é´ä»¶é常ä¼åãå¤ä¸ªèç¹ãï¼ä¹å°±æ¯æå¤ä¸ªå¯æ¬ï¼è¿æ ·ä¸æ¥ï¼å³ä¾¿å ¶ä¸ä¸ä¸ªèç¹æäºï¼ä¹è½ä¿è¯éç¾¤çæ°æ®ä¸ä¸¢å¤±ã
- æ¶æ¯æ¶è´¹é¶æ®µï¼æ¶è´¹è æ¥æ¶æ¶æ¯+æ¶æ¯å¤çä¹åï¼æåå¤ ack çè¯ï¼é£ä¹æ¶æ¯é¶æ®µçæ¶æ¯ä¸ä¼ä¸¢å¤±ãä¸è½æ¶å°æ¶æ¯å°±å ackï¼å¦åå¯è½æ¶æ¯å¤çä¸éææäºï¼æ¶æ¯å°±ä¸¢å¤±äºã
# ä½¿ç¨æ¶æ¯éåè¿åºè¯¥æ³¨æåªäºé®é¢ï¼
éè¦èèæ¶æ¯å¯é æ§åé¡ºåºæ§æ¹é¢çé®é¢ã
# æ¶æ¯éåçå¯é æ§ãé¡ºåºæ§æä¹ä¿è¯ï¼
æ¶æ¯å¯é æ§å¯ä»¥éè¿ä¸é¢è¿äºæ¹å¼æ¥ä¿è¯
- æ¶æ¯æä¹
åï¼ç¡®ä¿æ¶æ¯éåè½å¤æä¹
åæ¶æ¯æ¯é常å
³é®çãå¨ç³»ç»å´©æºãé坿è
ç½ç»æ
éçæ
åµä¸ï¼æªå¤ççæ¶æ¯ä¸åºä¸¢å¤±ãä¾å¦ï¼å RabbitMQ å¯ä»¥éè¿é
ç½®å°æ¶æ¯æä¹
åå°ç£çï¼éè¿å°éååæ¶æ¯é½è®¾ç½®ä¸ºæä¹
åçæ¹å¼ï¼è®¾ç½®
durable = trueï¼ï¼è¿æ ·å¨æå¡å¨éå¯åï¼æ¶æ¯ä¾ç¶å¯ä»¥è¢«éæ°è¯»ååå¤çã - æ¶æ¯ç¡®è®¤æºå¶ï¼æ¶è´¹è
卿åå¤çæ¶æ¯åï¼åºè¯¥åæ¶æ¯éååé确认ï¼acknowledgmentï¼ãæ¶æ¯éååªææ¶å°ç¡®è®¤åï¼æä¼å°æ¶æ¯ä»éåä¸ç§»é¤ãå¦ææ²¡ææ¶å°ç¡®è®¤ï¼æ¶æ¯éåå¯è½ä¼å¨ä¸å®æ¶é´åéæ°åéæ¶æ¯ç»å
¶ä»æ¶è´¹è
æè
忬¡åéç»åä¸ä¸ªæ¶è´¹è
ã以 Kafka 为ä¾ï¼æ¶è´¹è
éè¿
commitSyncæècommitAsyncæ¹æ³æ¥æäº¤åç§»éï¼offsetï¼ï¼ä»èç¡®è®¤æ¶æ¯çæ¶è´¹ã - æ¶æ¯éè¯çç¥ï¼å½æ¶è´¹è å¤çæ¶æ¯å¤±è´¥æ¶ï¼éè¦æåççéè¯çç¥ãå¯ä»¥è®¾ç½®éè¯æ¬¡æ°åéè¯é´éæ¶é´ãä¾å¦ï¼å¨ç¬¬ä¸æ¬¡å¤ç失败åï¼çå¾ ä¸æ®µæ¶é´ï¼å¦ 5 ç§ï¼åè¿è¡ç¬¬äºæ¬¡éè¯ï¼å¦æéè¯å¤æ¬¡ï¼å¦ 3 次ï¼åä»ç¶å¤±è´¥ï¼å¯ä»¥å°æ¶æ¯åéå°æ»ä¿¡éåï¼ä»¥ä¾¿åç»äººå·¥ææ¥æè éåå ¶ä»ç¹æ®å¤çã
æ¶æ¯é¡ºåºæ§ä¿è¯çæ¹å¼å¦ä¸ï¼
- æåºæ¶æ¯å¤çåºæ¯è¯å«ï¼é¦å éè¦æç¡®ä¸å¡åºæ¯ä¸åªäºæ¶æ¯æ¯éè¦ä¿è¯é¡ºåºçãä¾å¦ï¼å¨éè交æç³»ç»ä¸ï¼å¯¹äºåç¨æ·ç转账æä½é¡ºåºæ¯ä¸è½æä¹±çã对äºéè¦é¡ºåºå¤ççæ¶æ¯ï¼è¦ç¡®ä¿æ¶æ¯éååæ¶è´¹è è½å¤æç §ç¹å®ç顺åºè¿è¡å¤çã
- æ¶æ¯éåå¯¹é¡ºåºæ§çæ¯æï¼é¨åæ¶æ¯éåæ¬èº«æä¾äºé¡ºåºæ§ä¿è¯çåè½ãæ¯å¦ Kafka å¯ä»¥éè¿å°æ¶æ¯ååå°åä¸ä¸ªååºï¼Partitionï¼æ¥ä¿è¯æ¶æ¯å¨ååºå æ¯æåºçï¼æ¶è´¹è æç §ååºé¡ºåºè¯»åæ¶æ¯å°±å¯ä»¥ä¿è¯æ¶æ¯é¡ºåºãä½è¿ä¹å¯è½ä¼éå¶æ¶æ¯çå¹¶è¡å¤çç¨åº¦ï¼éè¦å¨é¡ºåºæ§åååéä¹é´è¿è¡æè¡¡ã
- æ¶è´¹è 顺åºå¤ççç¥ï¼æ¶è´¹è å¨å¤çé¡ºåºæ¶æ¯æ¶ï¼åºè¯¥é¿å å¹¶åå¤çå¯è½å¯¼è´é¡ºåºæä¹±çæ åµãä¾å¦ï¼å¯ä»¥éè¿åçº¿ç¨æè 使ç¨çº¿ç¨æ± å¹¶å¯¹é¡ºåºæ¶æ¯è¿è¡ä¸²è¡åå¤ççæ¹å¼ï¼ç¡®ä¿æ¶æ¯æç §æ£ç¡®ç顺åºè¢«æ¶è´¹ã
# å¦ä½ä¿è¯å¹çåï¼
å¹çæ§æ¯æ å䏿ä½ç夿¬¡æ§è¡å¯¹ç³»ç»ç¶æçå½±åä¸ä¸æ¬¡æ§è¡ç»æä¸è´ãä¾å¦ï¼æ¯ä»æ¥å£è¥å ç½ç»éè¯è¢«å¤æ¬¡è°ç¨ï¼æç»åºç¡®ä¿ä» æ£æ¬¾ä¸æ¬¡ãå®ç°å¹çåçæ ¸å¿æ¹æ¡ï¼
- å¯ä¸æ è¯ï¼å¹çé®ï¼ï¼å®¢æ·ç«¯ä¸ºæ¯ä¸ªè¯·æ±çæå ¨å±å¯ä¸IDï¼å¦ UUIDãä¸å¡ä¸»é®ï¼ï¼æå¡ç«¯æ ¡éªè¯¥IDæ¯å¦å·²å¤çï¼éç¨åºæ¯æ¥å£è°ç¨ãæ¶æ¯æ¶è´¹çã
- æ°æ®åºäºå¡ + ä¹è§éï¼éè¿çæ¬å·æç¶æå段æ§å¶å¹¶åæ´æ°ï¼ç¡®ä¿å¤æ¬¡æ´æ°çåäºå次æä½ï¼éç¨åºæ¯æ°æ®åºè®°å½æ´æ°ï¼å¦ä½é¢æ£åã订åç¶æåæ´ï¼ã
- æ°æ®åºå¯ä¸çº¦æï¼å©ç¨æ°æ®åºå¯ä¸ç´¢å¼é²æ¢é夿°æ®åå ¥ï¼éç¨åºæ¯æ°æ®æå ¥åºæ¯ï¼å¦è®¢åå建ï¼ã
- åå¸å¼éï¼éè¿éæºå¶ä¿è¯å䏿¶å»ä» æä¸ä¸ªè¯·æ±æ§è¡å ³é®æä½ï¼éç¨åºæ¯é«å¹¶åä¸çèµæºæ¢å¤ºï¼å¦ç§æï¼ã
- æ¶æ¯å»éï¼æ¶æ¯éåç产è ä¸ºæ¯æ¡æ¶æ¯çæå¯ä¸çæ¶æ¯ IDï¼æ¶è´¹è å¨å¤çæ¶æ¯åï¼å æ£æ¥è¯¥æ¶æ¯ ID æ¯å¦å·²ç»å¤çè¿ï¼å¦æå·²ç»å¤çè¿å丢å¼è¯¥æ¶æ¯ã
# å¦ä½å¤çæ¶æ¯éåçæ¶æ¯ç§¯åé®é¢ï¼
æ¶æ¯ç§¯åæ¯å 为ç产è çç产é度ï¼å¤§äºæ¶è´¹è çæ¶è´¹é度ãéå°æ¶æ¯ç§¯åé®é¢æ¶ï¼æä»¬éè¦å ææ¥ï¼æ¯ä¸æ¯æbug产çäºã
妿䏿¯bugï¼æä»¬å¯ä»¥ä¼åä¸ä¸æ¶è´¹çé»è¾ï¼æ¯å¦ä¹åæ¯ä¸æ¡ä¸æ¡æ¶æ¯æ¶è´¹å¤ççè¯ï¼æä»¬å¯ä»¥ç¡®è®¤æ¯ä¸æ¯å¯ä»¥ä¼ä¸ºæ¹éå¤çæ¶æ¯ãå¦æè¿æ¯æ ¢ï¼æä»¬å¯ä»¥èèæ°´å¹³æ©å®¹ï¼å¢å Topicçéåæ°ï¼åæ¶è´¹ç»æºå¨çæ°éï¼æåæ´ä½æ¶è´¹è½åã
妿æ¯bug导è´å ç¾ä¸æ¶æ¯æç»ç§¯åå å°æ¶ãæå¦ä½å¤çå¢ï¼éè¦è§£å³bugï¼ä¸´æ¶ç´§æ¥æ©å®¹ï¼å¤§æ¦æè·¯å¦ä¸ï¼
- å ä¿®å¤consumeræ¶è´¹è çé®é¢ï¼ä»¥ç¡®ä¿å ¶æ¢å¤æ¶è´¹é度ï¼ç¶åå°ç°æconsumer é½åæã
- æ°å»ºä¸ä¸ª topicï¼partition æ¯åæ¥ç 10 åï¼ä¸´æ¶å»ºç«å¥½åå 10åçqueue æ°éã
- ç¶ååä¸ä¸ªä¸´æ¶çååæ°æ®ç consumer ç¨åºï¼è¿ä¸ªç¨åºé¨ç½²ä¸å»æ¶è´¹ç§¯åçæ°æ®ï¼æ¶è´¹ä¹åä¸åèæ¶çå¤çï¼ç´æ¥åå轮询åå ¥ä¸´æ¶å»ºç«å¥½ç 10 åæ°éç queueã
- æ¥ç临æ¶å¾ç¨ 10 åçæºå¨æ¥é¨ç½² consumerï¼æ¯ä¸æ¹ consumer æ¶è´¹ä¸ä¸ªä¸´æ¶ queue çæ°æ®ãè¿ç§åæ³ç¸å½äºæ¯ä¸´æ¶å° queue èµæºå consumer èµæºæ©å¤§ 10 åï¼ä»¥æ£å¸¸ç 10 åéåº¦æ¥æ¶è´¹æ°æ®ã
- çå¿«éæ¶è´¹å®ç§¯åæ°æ®ä¹åï¼å¾æ¢å¤åå é¨ç½²çæ¶æï¼éæ°ç¨åå ç consumer æºå¨æ¥æ¶è´¹æ¶æ¯ã
# å¦ä½ä¿è¯æ°æ®ä¸è´æ§ï¼äºå¡æ¶æ¯å¦ä½å®ç°ï¼
䏿¡æ®éçMQæ¶æ¯ï¼ä»äº§çå°è¢«æ¶è´¹ï¼å¤§æ¦æµç¨å¦ä¸ï¼

- ç产è äº§çæ¶æ¯ï¼åé带MQæå¡å¨
- MQæ¶å°æ¶æ¯åï¼å°æ¶æ¯æä¹ åå°åå¨ç³»ç»ã
- MQæå¡å¨è¿åACkå°ç产è ã
- MQæå¡å¨ææ¶æ¯pushç»æ¶è´¹è
- æ¶è´¹è æ¶è´¹å®æ¶æ¯ï¼ååºACK
- MQæå¡å¨æ¶å°ACKï¼è®¤ä¸ºæ¶æ¯æ¶è´¹æåï¼å³å¨åå¨ä¸å 餿¶æ¯ã
æä»¬ä¸¾ä¸ªä¸è®¢åçä¾åå§ã订åç³»ç»å建å®è®¢ååï¼ååéæ¶æ¯ç»ä¸æ¸¸ç³»ç»ãå¦æè®¢åå建æåï¼ç¶åæ¶æ¯æ²¡ææååéåºå»ï¼ä¸æ¸¸ç³»ç»å°±æ æ³æç¥è¿ä¸ªäºæ ï¼åºå¯¼è´æ°æ®ä¸ä¸è´ã
å¦ä½ä¿è¯æ°æ®ä¸è´æ§å¢ï¼å¯ä»¥ä½¿ç¨äºå¡æ¶æ¯ãä¸èµ·æ¥çä¸äºå¡æ¶æ¯æ¯å¦ä½å®ç°çå§ã

- ç产è äº§çæ¶æ¯ï¼åé䏿¡åäºå¡æ¶æ¯å°MQæå¡å¨
- MQæ¶å°æ¶æ¯åï¼å°æ¶æ¯æä¹ åå°åå¨ç³»ç»ï¼è¿æ¡æ¶æ¯çç¶ææ¯å¾ åéç¶æã
- MQæå¡å¨è¿åACK确认å°ç产è ï¼æ¤æ¶MQä¸ä¼è§¦åæ¶æ¯æ¨éäºä»¶
- çäº§è æ§è¡æ¬å°äºå¡
- 妿æ¬å°äºå¡æ§è¡æåï¼å³commitæ§è¡ç»æå°MQæå¡å¨ï¼å¦ææ§è¡å¤±è´¥ï¼åérollbackã
- å¦ææ¯æ£å¸¸çcommitï¼MQæå¡å¨æ´æ°æ¶æ¯ç¶æä¸ºå¯åéï¼å¦ææ¯rollbackï¼å³å 餿¶æ¯ã
- å¦ææ¶æ¯ç¶ææ´æ°ä¸ºå¯åéï¼åMQæå¡å¨ä¼pushæ¶æ¯ç»æ¶è´¹è ãæ¶è´¹è æ¶è´¹å®å°±åACKã
- 妿MQæå¡å¨é¿æ¶é´æ²¡ææ¶å°ç产è çcommitæè rollbackï¼å®ä¼åæ¥ç产è ï¼ç¶åæ ¹æ®æ¥è¯¢å°çç»ææ§è¡æç»ç¶æã
# æ¶æ¯é忝åèåªç§è®¾è®¡æ¨¡å¼ï¼
æ¯åèäºè§å¯è 模å¼ååå¸è®¢é 模å¼ï¼ä¸¤ç§è®¾è®¡æ¨¡å¼æè·¯æ¯ä¸æ ·çï¼ä¸¾ä¸ªçæ´»ä¾åï¼
- è§å¯è 模å¼ï¼æå ¬å¸ç»èªå·±åå·¥åæé¥¼åç²½åï¼æ¯ç±å ¬å¸çè¡æ¿é¨é¨åéçï¼è¿ä»¶äºä¸éå交ç»ç¬¬ä¸æ¹ï¼åå æ¯ãå ¬å¸ãåãåå·¥ãæ¯ä¸ä¸ªæ´ä½
- åå¸-è®¢é æ¨¡å¼ï¼æå ¬å¸è¦ç»å ¶ä»äººååç§å¿«éï¼å 为ãå ¬å¸ãåãå ¶ä»äººãæ¯ç¬ç«çï¼å ¶å¯ä¸çæ¡¥æ¢æ¯ãå¿«éãï¼æä»¥è¿ä»¶äºéå交ç»ç¬¬ä¸æ¹å¿«éå ¬å¸è§£å³
ä¸è¿°è¿ç¨ä¸ï¼å¦æå ¬å¸èªå·±å»ç®¡çå¿«éçé éï¼é£å ¬å¸å°±ä¼åæä¸ä¸ªå¿«éå ¬å¸ï¼ä¸å¡ç¹æé¾ä»¥ç®¡çï¼å½±åå ¬å¸èªèº«ç主è¥ä¸å¡ï¼å æ¤ä½¿ç¨ä½ç§æ¨¡å¼éè¦èèä»ä¹æ åµä¸¤è æ¯éè¦è¦åç
è§å¯è 模å¼
è§å¯è
模å¼å®é
ä¸å°±æ¯ä¸ä¸ªä¸å¯¹å¤çå
³ç³»ï¼å¨è§å¯è
模å¼ä¸åå¨ä¸ä¸ªä¸»é¢åå¤ä¸ªè§å¯è
ï¼ä¸»é¢ä¹æ¯è¢«è§å¯è
ï¼å½æä»¬ä¸»é¢å叿¶æ¯æ¶ï¼ä¼éç¥å个è§å¯è
ï¼è§å¯è
å°ä¼æ¶å°ææ°æ¶æ¯ï¼å¾è§£å¦ä¸ï¼æ¯ä¸ªè§å¯è
é¦å
订é
主é¢ï¼è®¢é
æååå½ä¸»é¢åéæ¶æ¯æ¶ä¼å¾ªç¯æ´ä¸ªè§å¯è
å表ï¼éä¸åéæ¶æ¯éç¥ã

åå¸è®¢é 模å¼
åå¸è®¢é 模å¼åè§å¯è 模å¼çåºå«å°±æ¯åå¸è å订é è å®å ¨è§£è¦ï¼éè¿ä¸é´çåå¸è®¢é ä¸å¿è¿è¡æ¶æ¯éç¥ï¼åå¸è å¹¶ä¸ç¥éèªå·±åå¸çæ¶æ¯ä¼éç¥ç»è°ï¼å æ¤åå¸è®¢é æ¨¡å¼æä¸ä¸ªéè¦è§è²ï¼åå¸è ->åå¸è®¢é ä¸å¿->订é è ã
å¾è§£å¦ä¸ï¼å½åå¸è
å叿¶æ¯å°åå¸è®¢é
ä¸å¿åï¼åå¸è®¢é
ä¸å¿ä¼å°æ¶æ¯éç¥ç»ææè®¢é
该åå¸è
ç订é
è

# è®©ä½ åä¸ä¸ªæ¶æ¯éåï¼è¯¥å¦ä½è¿è¡æ¶æè®¾è®¡ï¼
è¿ä¸ªé®é¢é¢è¯å®ä¸»è¦èå¯ä¸ä¸ªæ¹é¢çç¥è¯ç¹ï¼
- ä½ ææ²¡æå¯¹æ¶æ¯éåçæ¶æåçæ¯è¾äºè§£
- èå¯ä½ ç个人设计è½å
- èå¯ç¼ç¨ææ³ï¼å¦ä»ä¹é«å¯ç¨ã坿©å±æ§ãå¹çççã
éå°è¿ç§è®¾è®¡é¢ï¼å¤§é¨å人ä¼å¾èåï¼å ä¸ºå¹³æ¶æ²¡ææèè¿ç±»ä¼¼çé®é¢ã大夿°äººå¹³æ¶å头å¢å æ¹å¥ï¼ä¸å»æèæ¡æ¶èåçä¸äºåçãæå¾å¤ç±»ä¼¼çé®é¢ï¼æ¯å¦è®©ä½ æ¥è®¾è®¡ä¸ä¸ª Dubbo æ¡æ¶ï¼æè è®©ä½ æ¥è®¾è®¡ä¸ä¸ªMyBatis æ¡æ¶ï¼ä½ 伿乿èå¢ï¼
åçè¿ç±»é®é¢ï¼å¹¶ä¸è¦æ±ä½ ç ç©¶è¿é£ææ¯çæºç ï¼ä½ ç¥éé£ä¸ªææ¯æ¡æ¶çåºæ¬ç»æãå·¥ä½åçå³å¯ã设计ä¸ä¸ªæ¶æ¯éåï¼æä»¬å¯ä»¥ä»è¿å 个è§åº¦å»æèï¼

- é¦å æ¯æ¶æ¯éåçæ´ä½æµç¨ï¼produceråéæ¶æ¯ç»brokerï¼brokeråå¨å¥½ï¼brokerååéç»consumeræ¶è´¹ï¼consumerå夿¶è´¹ç¡®è®¤çã
- produceråéæ¶æ¯ç»brokerï¼brokeråæ¶æ¯ç»consumeræ¶è´¹ï¼é£å°±éè¦ä¸¤æ¬¡RPCäºï¼RPCå¦ä½è®¾è®¡å¢ï¼å¯ä»¥åè弿ºæ¡æ¶Dubboï¼ä½ å¯ä»¥è¯´è¯´æå¡åç°ãåºåååè®®çç
- brokerèèå¦ä½æä¹ åå¢ï¼æ¯æ¾æä»¶ç³»ç»è¿æ¯æ°æ®åºå¢ï¼ä¼ä¸ä¼æ¶æ¯å 积å¢ï¼æ¶æ¯å 积å¦ä½å¤çå¢ã
- æ¶è´¹å ³ç³»å¦ä½ä¿åå¢ï¼ç¹å¯¹ç¹è¿æ¯å¹¿ææ¹å¼å¢ï¼å¹¿æå ³ç³»åæ¯å¦ä½ç»´æ¤å¢ï¼zkè¿æ¯config server
- æ¶æ¯å¯é æ§å¦ä½ä¿è¯å¢ï¼å¦ææ¶æ¯éå¤äºï¼å¦ä½å¹çå¤çå¢ï¼
- æ¶æ¯éåçé«å¯ç¨å¦ä½è®¾è®¡å¢ï¼å¯ä»¥åèKafkaçé«å¯ç¨ä¿éæºå¶ãå¤å¯æ¬ -> leader & follower -> broker æäºéæ°é举 leader å³å¯å¯¹å¤æå¡ã
- æ¶æ¯äºå¡ç¹æ§ï¼ä¸æ¬å°ä¸å¡å个äºå¡ï¼æ¬å°æ¶æ¯è½åº;æ¶æ¯æéå°æå¡ç«¯ï¼æ¬å°æå é¤ï¼å®æ¶ä»»å¡æ«ææ¬å°æ¶æ¯åºï¼è¡¥å¿åéã
- MQå¾ä¼¸ç¼©æ§å坿©å±æ§ï¼å¦ææ¶æ¯ç§¯åæè èµæºä¸å¤æ¶ï¼å¦ä½æ¯æå¿«éæ©å®¹ï¼æé«ååï¼å¯ä»¥åç §ä¸ä¸ Kafka ç设计ç念ï¼broker -> topic -> partitionï¼æ¯ä¸ª partition æ¾ä¸ä¸ªæºå¨ï¼å°±åä¸é¨åæ°æ®ã妿ç°å¨èµæºä¸å¤äºï¼ç®ååï¼ç» topic å¢å partitionï¼ç¶ååæ°æ®è¿ç§»ï¼å¢å æºå¨ï¼ä¸å°±å¯ä»¥åæ¾æ´å¤æ°æ®ï¼æä¾æ´é«çååéäºã
# RocketMQ
# æ¶æ¯éå为ä»ä¹éæ©RocketMQçï¼
项ç®ç¨çæ¯ RocketMQ æ¶æ¯éåãéæ©RocketMQçåå æ¯ï¼
- å¼åè¯è¨ä¼å¿ãRocketMQ ä½¿ç¨ Java è¯è¨å¼åï¼æ¯èµ·ä½¿ç¨ Erlang å¼åç RabbitMQ æ¥è¯´ï¼æçæ´å®¹æä¸æçé 读ä½éªååä¼ãå¨éå° RocketMQ è¾ä¸ºåºå±çé®é¢æ¶ï¼å¤§é¨åçæ Java çåå¦é½å¯ä»¥æ·±å ¥é è¯»å ¶æºç ï¼åæãææ¥é®é¢ã
- ç¤¾åºæ°å´æ´»è·ãRocketMQ æ¯é¿é巴巴弿ºä¸å é¨å¨å¤§é使ç¨çæ¶æ¯éåï¼è¯´æ RocketMQ æ¯çç¡®ç»å¾èµ·æ®é ·çç产ç¯å¢èéªçï¼å¹¶ä¸è½å¤é对线ä¸ç¯å¢å¤æçéæ±åºæ¯æä¾ç¸åºçè§£å³æ¹æ¡ã
- ç¹æ§ä¸°å¯ãæ ¹æ® RocketMQ 宿¹ææ¡£çå举ï¼å
¶é«çº§ç¹æ§è¾¾å°äº
12 ç§ï¼ä¾å¦é¡ºåºæ¶æ¯ãäºå¡æ¶æ¯ãæ¶æ¯è¿æ»¤ã宿¶æ¶æ¯çãé¡ºåºæ¶æ¯ãäºå¡æ¶æ¯ãæ¶æ¯è¿æ»¤ã宿¶æ¶æ¯ãRocketMQ 丰å¯çç¹æ§ï¼è½å¤ä¸ºæä»¬å¨å¤æçä¸å¡åºæ¯ä¸å°½å¯è½å¤å°æä¾æè·¯åè§£å³æ¹æ¡ã
# RocketMQåKafkaçåºå«æ¯ä»ä¹ï¼å¦ä½åææ¯éåï¼
Kafkaçä¼ç¼ºç¹ï¼
- ä¼ç¹ï¼é¦å ï¼Kafkaçæå¤§ä¼å¿å°±å¨äºå®çé«ååéï¼å¨æ®éæºå¨4CPU8Gçé ç½®ä¸ï¼ä¸å°æºå¨å¯ä»¥æä½åå ä¸çQPSï¼è¿ä¸ç¹è¿æ¯ç¸å½ä¼è¶çãKafkaæ¯æé群é¨ç½²ï¼å¦æé¨åæºå¨å®æºä¸å¯ç¨ï¼åä¸å½±åKafkaçæ£å¸¸ä½¿ç¨ã
- 缺ç¹ï¼Kafkaæå¯è½ä¼é ææ°æ®ä¸¢å¤±ï¼å 为å®å¨æ¶å°æ¶æ¯çæ¶åï¼å¹¶ä¸æ¯ç´æ¥åå°ç©çç£ççï¼èæ¯å åå ¥å°ç£çç¼å²åºéé¢çãKafkaåè½æ¯è¾çåä¸ ä¸»è¦çå°±æ¯æ¯ææ¶åæ¶æ¯ï¼é«çº§åè½åºæ¬æ²¡æï¼å°±ä¼é æéç¨åºæ¯åéã
RocketMQæ¯é¿é巴巴弿ºçæ¶æ¯ä¸é´ä»¶ï¼ä¼ç¼ºç¹
- ä¼ç¹ï¼æ¯æåè½æ¯è¾å¤ï¼æ¯å¦å»¶è¿éåãæ¶æ¯äºå¡ççï¼ååéä¹é«ï¼åæºååéè¾¾å° 10 ä¸çº§ï¼æ¯æå¤§è§æ¨¡é群é¨ç½²ï¼çº¿æ§æ©å±æ¹ä¾¿ï¼Javaè¯è¨å¼åï¼æ»¡è¶³äºå½å ç»å¤§é¨åå ¬å¸ææ¯æ
- 缺ç¹ï¼æ§è½ç¸æ¯ kafka æ¯å¼±ä¸ç¹ï¼å 为 kafka ç¨å°äº sendfile çé¶æ·è´ææ¯ï¼è RocketMQ ä¸»è¦æ¯ç¨ mmap+write æ¥å®ç°é¶æ·è´ã
该æä¹éæ©å¢ï¼
- 妿æä»¬ä¸å¡åªæ¯æ¶åæ¶æ¯è¿ç§åä¸ç±»åçéæ±ï¼èä¸å¯ä»¥å 许å°é¨åæ°æ®ä¸¢å¤±çå¯è½æ§ï¼ä½æ¯åè¦æ±æé«çååéå髿§è½çè¯ï¼å°±ç´æ¥éKafkaå°±è¡äºï¼å°±å¥½æ¯æä»¬å ¬å¸æ³è¦æ¶éåä¼ è¾ç¨æ·è¡ä¸ºæ¥å¿ä»¥åå ¶ä»ç¸å ³æ¥å¿çå¤çï¼å°±éç¨çKafkaä¸é´ä»¶ã
- å¦æå ¬å¸çéè¦éè¿ mq æ¥å®ç°ä¸äºä¸å¡éæ±ï¼æ¯å¦å»¶è¿éåãæ¶æ¯äºå¡çï¼å ¬å¸ææ¯æ ä¸»è¦æ¯Javaè¯è¨çè¯ï¼å°±ç´æ¥ä¸æ¥å°ä½éæ©RocketMQï¼è¿æ ·ä¼çå¾å¤äºæ ã
# RocketMQå»¶æ¶æ¶æ¯çåºå±åç
æ»ä½çåç示æå¾ï¼å¦ä¸æç¤ºï¼

broker 卿¥æ¶å°å»¶æ¶æ¶æ¯çæ¶åï¼ä¼å°å»¶æ¶æ¶æ¯åå ¥å°å»¶æ¶Topicçéåä¸ï¼ç¶åScheduleMessageServiceä¸ï¼æ¯ä¸ª queue 对åºç宿¶ä»»å¡ä¼ä¸åå°è¢«æ§è¡ï¼æ£æ¥ queue ä¸åªäºæ¶æ¯å·²å°è®¾å®æ¶é´ï¼ç¶å转åå°æ¶æ¯çåå§Topicï¼è¿äºæ¶æ¯å°±ä¼è¢«åèªç producer æ¶è´¹äºã
# RocektMQæä¹å¤çåå¸å¼äºå¡ï¼
RocketMQæ¯ä¸ç§æç»ä¸è´æ§çåå¸å¼äºå¡ï¼å°±æ¯è¯´å®ä¿è¯çæ¯æ¶æ¯æç»ä¸è´æ§ï¼è䏿¯å2PCã3PCãTCC飿 ·å¼ºä¸è´åå¸å¼äºå¡
å设 A ç» B 转 100åé±ï¼åæ¶å®ä»¬ä¸æ¯åä¸ä¸ªæå¡ä¸ï¼ç°å¨ç®æ æ¯å°±æ¯ A å100åé±ï¼B å 100åé±ã
å®é æ åµå¯è½æåç§ï¼
1ï¼å°±æ¯Aè´¦æ·å100 ï¼æåï¼ï¼Bè´¦æ·å 100 ï¼æåï¼
2ï¼å°±æ¯Aè´¦æ·å100ï¼å¤±è´¥ï¼ï¼Bè´¦æ·å 100 ï¼å¤±è´¥ï¼
3ï¼å°±æ¯Aè´¦æ·å100ï¼æåï¼ï¼Bè´¦æ·å 100 ï¼å¤±è´¥ï¼
4ï¼å°±æ¯Aè´¦æ·å100 ï¼å¤±è´¥ï¼ï¼Bè´¦æ·å 100 ï¼æåï¼
è¿é 第1å第2 ç§æ 嵿¯è½å¤ä¿è¯äºå¡çä¸è´æ§çï¼ä½æ¯ 第3å第4 æ¯æ æ³ä¿è¯äºå¡çä¸è´æ§çã
飿们æ¥çä¸RocketMQæ¯å¦ä½æ¥ä¿è¯äºå¡çä¸è´æ§çã

åå¸å¼äºå¡çæµç¨å¦ä¸å¾ï¼
1ãAæå¡å åé个Half Messageï¼æ¯ææä¸è½è¢«Consumeræ¶è´¹çæ¶æ¯ãProducer å·²ç»ææ¶æ¯æååéå°äºBroker 端ï¼ä½æ¤æ¶æ¯è¢«æ 记为æä¸è½æéç¶æï¼å¤äºè¯¥ç§ç¶æä¸çæ¶æ¯ç§°ä¸ºåæ¶æ¯ãéè¦ Producerå¯¹æ¶æ¯çäºæ¬¡ç¡®è®¤åï¼Consumeræè½å»æ¶è´¹å®ï¼ç»Brockç«¯ï¼æ¶æ¯ä¸æºå¸¦ Bæå¡ å³å°è¦+100å çä¿¡æ¯ã
2ãå½Aæå¡ç¥éHalf Messageåéæååï¼é£ä¹å¼å§ç¬¬3æ¥æ§è¡æ¬å°äºå¡ã
3ãæ§è¡æ¬å°äºå¡(伿ä¸ç§æ åµ1ãæ§è¡æåã2ãæ§è¡å¤±è´¥ã3ãç½ç»çåå å¯¼è´æ²¡æååº)
4.1)ã妿æ¬å°äºå¡æåï¼é£ä¹ProductåBrockæå¡å¨åéCommit,è¿æ ·Bæå¡å°±å¯ä»¥æ¶è´¹è¯¥messageã
4.2)ã妿æ¬å°äºå¡å¤±è´¥ï¼é£ä¹ProductåBrockæå¡å¨åéRollback,é£ä¹å°±ä¼ç´æ¥å é¤ä¸é¢è¿æ¡åæ¶æ¯ã
4.3)ã妿å 为ç½ç»çåå è¿è¿æ²¡æè¿åå¤±è´¥è¿æ¯æåï¼é£ä¹ä¼æ§è¡RocketMQçåè°æ¥å£ï¼æ¥è¿è¡äºå¡ç忥ã
ä»ä¸é¢æµç¨å¯ä»¥å¾ç¥ åªæAæå¡æ¬å°äºå¡æ§è¡æå ï¼Bæå¡æè½æ¶è´¹è¯¥messageã
é£ä¹ Aè´¦æ·å100 ï¼æåï¼ï¼Bè´¦æ·å 100 ï¼å¤±è´¥ï¼ï¼è¿æ¶åBæå¡å¤±è´¥æä¹åï¼
妿Bæç»æ§è¡å¤±è´¥ï¼å ä¹å¯ä»¥æå®å°±æ¯ä»£ç æé®é¢æä»¥æå¼èµ·çå¼å¸¸ï¼å 为æ¶è´¹ç«¯RocketMQæéè¯æºå¶ï¼å¦æä¸æ¯ä»£ç é®é¢ä¸è¬éè¯å æ¬¡å°±è½æåã
妿æ¯ä»£ç çåå å¼èµ·å¤æ¬¡éè¯å¤±è´¥åï¼ä¹æ²¡æå ³ç³»ï¼å°è¯¥å¼å¸¸è®°å½ä¸æ¥ï¼ç±äººå·¥å¤çï¼äººå·¥å åºå¤çåï¼å°±å¯ä»¥è®©äºå¡è¾¾å°æç»çä¸è´æ§ã
# RocketMQæ¶æ¯é¡ºåºæä¹ä¿è¯ï¼
æ¶æ¯çæåºæ§æ¯ææ¶æ¯çæ¶è´¹é¡ºåºè½å¤ä¸¥æ ¼ä¿å䏿¶æ¯çåé顺åºä¸è´ãä¾å¦ï¼ä¸ä¸ªè®¢å产çäº3æ¡æ¶æ¯ï¼å嫿¯è®¢åå建ã订å仿¬¾å订å宿ã卿¶æ¯æ¶è´¹æ¶ï¼å䏿¡è®¢åè¦ä¸¥æ ¼æç §è¿ä¸ªé¡ºåºè¿è¡æ¶è´¹ï¼å¦åä¸å¡ä¼åçæ··ä¹±ãåæ¶ï¼ä¸å订åä¹é´çæ¶æ¯åæ¯å¯ä»¥å¹¶åæ¶è´¹çï¼æ¯å¦å¯ä»¥å æ§è¡ç¬¬ä¸ä¸ªè®¢åç仿¬¾ï¼åæ§è¡ç¬¬äºä¸ªè®¢åçå建ã
RocketMQéç¨äºå±é¨é¡ºåºä¸è´æ§çæºå¶ï¼å®ç°äºå个éåä¸çæ¶æ¯ä¸¥æ ¼æåºãä¹å°±æ¯è¯´ï¼å¦ææ³è¦ä¿è¯é¡ºåºæ¶è´¹ï¼å¿ é¡»å°ä¸ç»æ¶æ¯åéå°åä¸ä¸ªéåä¸ï¼ç¶ååç±æ¶è´¹è è¿è¡æ³¨ææ¶è´¹ã
RocketMQæ¨èçé¡ºåºæ¶è´¹è§£å³æ¹æ¡æ¯ï¼å®è£ ä¸å¡ååä¸åçéåï¼ç¶åå°éè¦é¡ºåºæ¶è´¹çæ¶æ¯åå¾åä¸éåä¸å³å¯ï¼ä¸åä¸å¡ä¹é´çæ¶æ¯ä»éç¨å¹¶åæ¶è´¹ãè¿ç§æ¹å¼å¨æ»¡è¶³é¡ºåºæ¶è´¹çåæ¶æé«äºæ¶æ¯çå¤çé度ï¼å¨ä¸å®ç¨åº¦ä¸é¿å äºæ¶æ¯å 积é®é¢
RocketMQ é¡ºåºæ¶æ¯çåçæ¯ï¼
- å¨ Producerï¼ç产è ï¼ æä¸æ¹éè¦ä¿è¯é¡ºåºçæ¶æ¯åéå°åä¸ä¸ª MessageQueue
- Consumerï¼æ¶è´¹è ï¼ åéè¿å éçæºå¶æ¥ä¿è¯æ¶æ¯æ¶è´¹çé¡ºåºæ§ï¼Broker 端éè¿å¯¹ MessageQueue è¿è¡å éï¼ä¿è¯åä¸ä¸ª MessageQueue åªè½è¢«åä¸ä¸ª Consumer è¿è¡æ¶è´¹ã
# RocketMQæä¹ä¿è¯æ¶æ¯ä¸è¢«é夿¶è´¹ï¼
å¨ä¸å¡é»è¾ä¸å®ç°å¹çæ§ï¼ç¡®ä¿å³ä½¿æ¶æ¯è¢«é夿¶è´¹ï¼ä¹ä¸ä¼å½±åä¸å¡ç¶æã
ä¾å¦ï¼å¯¹äºæ¯ä»æè½¬è´¦ç±»æä½ï¼å¯ä»¥ä½¿ç¨å¯ä¸è®¢åå·æäºå¡IDä½ä¸ºå¹çæ§çæ è¯ç¬¦ï¼ç¡®ä¿åæ ·çæä½åªä¼è¢«æ§è¡ä¸æ¬¡ã
# RocketMQæ¶æ¯ç§¯åäºï¼æä¹åï¼
å¤ç RocketMQ çæ¶æ¯ç§¯åï¼å ¶å®æç¹åã大禹治水ãï¼æ»ä½æè·¯å¯ä»¥å为**ãç´§æ¥ç鿢æãåãäºåææ¥æ ¹å ã**两æ¥èµ°ã
妿å¨ç产ä¸çªç¶åè¦ï¼åç°æå ç¾ä¸æ¡æ¶æ¯å 积äºï¼æä»¬é叏伿以ä¸å ä¸ªå±æ¬¡æ¥åºå¯¹ï¼
ç¬¬ä¸æï¼ä¹æ¯ææ¬è½çååºï¼å°è¯ç»æ¶è´¹è ï¼Consumerï¼æ©å®¹ã æ¢ç¶å¤çæ ¢äºï¼é£ç´æ¥å å å°æ¶è´¹è æå¡å¨ä¸å°±è¡äºåï¼ ä½è¿éæä¸ä¸ªéå¸¸æ ¸å¿ãä¸ç»å¸¸è®©äººè¸©åç RocketMQ ç¥è¯ç¹ï¼å¨ RocketMQ éï¼ä¸ä¸ªéåï¼MessageQueueï¼å䏿¶å»åªè½è¢«ä¸ä¸ªæ¶è´¹è æºå¨å ¨æå æã æ¯å¦ï¼ä½ è¿ä¸ª Topic é»è®¤åªæ 4 个éåï¼é£ä½ å½åé¨ç½²äº 4 å°æ¶è´¹æºå¨ï¼é度已ç»è¾¾å°ä¸éäºãè¿æ¶åå°±ç®ä½ ç´§æ¥åå 10 å°æºå¨è¿å»ï¼è¿ 10 å°æºå¨ä¹ä¼å¨é£å¿å¹²çªç¼ï¼æ ¹æ¬åä¸å°éåï¼ä¹å°±èµ·ä¸å°ä»»ä½å éæéçä½ç¨ã
飿ä¹åå¢ï¼è¿å°±å¼åºæä»¬çç¬¬äºæï¼éå°æµ·éç§¯åæ¶çæ£çã大æãï¼ä¸´æ¶Topic嫿¥æ¯ã å¦æç§¯åå®å¨å¤ªå¤ï¼ä¸ºäºå¿«éæ¢å¤æ£å¸¸ä¸å¡ï¼æä»¬ä¼ç«å»åä¸å¥é常ç®åçãæ¬ç ç¨åºãä¸çº¿ãè¿ä¸ªç¨åºæ²¡æä»»ä½å¤æçä¸å¡é»è¾ï¼å®å¯ä¸çä»»å¡ï¼å°±æ¯å ¨éæç§¯åçè Topic éçæ¶æ¯æåºæ¥ï¼åå°ä¸å¨å°åå°ä¸ä¸ªä¸´æ¶å»ºç«çæ° Topic éå»ã ç»å¦çå°æ¹å¨äºï¼å»ºæ° Topic çæ¶åï¼æä»¬å¯ä»¥ä¸å£æ°ç»å®åé æ°åæä¸ç¾ä¸ªéåãæ¥çï¼æä»¬åé¨ç½²å åå°çæ£å¹²æ´»çä¸å¡æ¶è´¹è æºå¨ï¼å»å¯¹æ¥è¿ä¸ªå¤éåçæ° Topicãè¿æ ·å°±è½çªç ´åæ¥èéåæ°éçç©çéå¶ï¼ä»¥ååçè³å ååçé度æç§¯åçè´¦ç»æ¸ æãç积åå¤çå®äºï¼ååå忥çè Topic æ¶æã
ç¬¬ä¸æï¼ä¸å¡å åºæ¹æ¡ã 妿è·ä¸å¡æ¹æ²éåï¼åç°ç³»ç»å·²ç»æ¿ä¸´å´©æºï¼èä¸è¿äºç§¯åçæ¶æ¯ï¼æ¯å¦ä¸äºç¨æ·çéå ³é®ç¹å»æ¥å¿ãæ®éçåç¹æ°æ®ï¼ä¸¢äºä¹ä¸å½±åæ ¸å¿è¥æ¶ãé£ä¹å¯ä»¥ç´æ¥å¨ RocketMQ çæ§å¶å°ä¸ï¼ä¸é®ææ¶è´¹ç»çãæ¶è´¹ç¹ä½ï¼Offsetï¼ãéç½®å°ææ°çæ¶é´ç¹ãè¿å°±ç¸å½äºäººä¸ºå°æä¹å积åçæ¶æ¯å ¨é¨è·³è¿ä½åºäºï¼å ä¿ä½å½ä¸çç³»ç»å¯ç¨æ§ã
æåï¼å½ç§¯åå¤çå®äºï¼ä¸å®è¦å»åãäºå诸èäº®ãææ¥æ ¹å ã æ¶æ¯ä¸ºä»ä¹ä¼ç§¯åï¼åæå «ä¹ä¸æ¯å 为åé¢åå¾å¤ªå¿«ï¼èæ¯å 为å颿¶è´¹å¾å¤ªæ ¢äºãæ¯å¦ä½ çæ¶è´¹è 代ç 鿝䏿¯å¨è°ç¬¬ä¸æ¹çæ¥å£ï¼æ°å¥½é£ä¸ªæ¥å£ä»å¤©ç½ç»æå¨ä¸ç´å¨è¶ æ¶è¿ç´¯äºä½ ï¼åæè æ¯æ¶è´¹è å¨å MySQL çæ¶åï¼åºç°äºæ ¢æ¥è¯¢çè³æ»éï¼åªææ¾å°ä»£ç éå¡èåçå°æ¹ï¼ä¼åæå®ï¼æ¯å¦å¼å ¥ç¼åãä¼å SQLï¼ï¼æè½ä¿è¯ä»¥åä¸ååæ´ªæ°´ã
æ»ç»ä¸ä¸æçåçï¼ é¢å¯¹ RocketMQ æ¶æ¯ç§¯åï¼é¦å è¦è¯ä¼°ç§¯åéï¼å°é积åéè¿æ©å®¹ Consumerï¼åææ¯éåæ°è¶³å¤å¹²æ´»ï¼æ¥è§£å³ï¼æµ·é积åå使ç¨ã转åä¸´æ¶æ©å®¹ Topicãçææéè¿è¡æè´å éï¼å½ç¶ä¸å¡å 许çè¯è·³è¿æ¶è´¹ä¹æ¯æ¢è¡æ·å¾ï¼æåååè¿å¤´æ¥æ»ç£æ¶è´¹è 代ç éçæ§è½ç¶é¢ãè¿æ¯æä»¬ææ¥è¿ç±»é®é¢çä¸å¥æ¯è¾è¿è´¯çç»åæ³ã
# kafka
# 对Kafkaæä»ä¹äºè§£åï¼
Kafkaç¹ç¹å¦ä¸ï¼
- é«ååéãä½å»¶è¿ï¼kafkaæ¯ç§å¯ä»¥å¤çå å䏿¡æ¶æ¯ï¼å®çå»¶è¿æä½åªæå 毫ç§ï¼æ¯ä¸ªtopicå¯ä»¥åå¤ä¸ªpartition, consumer group 对partitionè¿è¡consumeæä½ã
- 坿©å±æ§ï¼kafkaéç¾¤æ¯æçæ©å±
- æä¹ æ§ãå¯é æ§ï¼æ¶æ¯è¢«æä¹ åå°æ¬å°ç£çï¼å¹¶ä¸æ¯ææ°æ®å¤ä»½é²æ¢æ°æ®ä¸¢å¤±
- 容鿧ï¼å 许é群ä¸èç¹å¤±è´¥ï¼è¥å¯æ¬æ°é为n,åå 许n-1个èç¹å¤±è´¥ï¼
- é«å¹¶åï¼æ¯ææ°å个客æ·ç«¯åæ¶è¯»å
# Kafka 为ä»ä¹è¿ä¹å¿«ï¼
- 顺åºåå ¥ä¼åï¼Kafkaå°æ¶æ¯é¡ºåºåå ¥ç£çï¼åå°äºç£çç坻鿶é´ãè¿ç§æ¹å¼æ¯éæºåå ¥æ´é«æï¼å 为ç£ç读å头å¨é¡ºåºåå ¥æ¶åªéç§»å¨ä¸æ¬¡ã
- æ¹éå¤çææ¯ï¼Kafkaæ¯ææ¹éåéæ¶æ¯ï¼è¿æå³çç产è å¨åéæ¶æ¯æ¶å¯ä»¥çå¾ ç´å°æè¶³å¤çæ°æ®ç§¯ç´¯å°ä¸å®éï¼ç¶åååéãè¿ç§æ¹æ³åå°äºç½ç»å¼éåç£çI/Oæä½ç次æ°ï¼ä»èæé«äºååéã
- é¶æ·è´ææ¯ï¼Kafka使ç¨é¶æ·è´ææ¯ï¼å¯ä»¥ç´æ¥å°æ°æ®ä»ç£çåéå°ç½ç»å¥æ¥åï¼é¿å äºå¨ç¨æ·ç©ºé´åå æ ¸ç©ºé´ä¹é´ç夿¬¡æ°æ®æ·è´ãè¿å¤§å¹ éä½äºCPUåå åçè´è½½ï¼æé«äºæ°æ®ä¼ è¾æçã
- åç¼©ææ¯ï¼Kafkaæ¯æå¯¹æ¶æ¯è¿è¡å缩ï¼è¿ä¸ä» åå°äºç½ç»ä¼ è¾çæ°æ®éï¼è¿æé«äºæ´ä½çååéã
# kafkaçæ¨¡åä»ç»ä¸ä¸ï¼kafkaæ¯æ¨éè¿æ¯æåï¼
æ¶è´¹è 模å
æ¶æ¯ç±ç产è åéå°kafkaé群åï¼ä¼è¢«æ¶è´¹è æ¶è´¹ãä¸è¬æ¥è¯´æä»¬çæ¶è´¹æ¨¡åæä¸¤ç§ï¼æ¨é模å(psuh)åæå模å(pull)ã
æ¨é模åï¼pushï¼
- åºäºæ¨é模åï¼pushï¼çæ¶æ¯ç³»ç»ï¼ææ¶æ¯ä»£çè®°å½æ¶è´¹è çæ¶è´¹ç¶æã
- æ¶æ¯ä»£çå¨å°æ¶æ¯æ¨éå°æ¶è´¹è åï¼æ è®°è¿æ¡æ¶æ¯å·²ç»æ¶è´¹ï¼ä½è¿ç§æ¹å¼æ æ³å¾å¥½å°ä¿è¯æ¶è´¹è¢«å¤çã
- 妿è¦ä¿è¯æ¶æ¯è¢«å¤çï¼æ¶æ¯ä»£çåé宿¶æ¯åï¼è¦è®¾ç½®ç¶æä¸ºãå·²åéãï¼åªè¦æ¶å°æ¶è´¹è ç确认请æ±åææ´æ°ä¸ºãå·²æ¶è´¹ãï¼è¿å°±éè¦ä»£çä¸è®°å½ææçæ¶è´¹ç¶æï¼ä½æ¾ç¶è¿ç§æ¹å¼ä¸å¯åã
缺ç¹ï¼
- push模å¼å¾é¾éåºæ¶è´¹éçä¸åçæ¶è´¹è
- å ä¸ºæ¶æ¯åééçæ¯ç±brokerå³å®çï¼push模å¼çç®æ æ¯å°½å¯è½ä»¥æå¿«éåº¦ä¼ éæ¶æ¯ï¼ä½æ¯è¿æ ·å¾å®¹æé æconsumeræ¥ä¸åå¤çæ¶æ¯ï¼å ¸åç表ç°å°±æ¯æç»æå¡ä»¥åç½ç»æ¥å¡ã
æå模å(pull)
kafkaéç¨æåæ¨¡åï¼ç±æ¶è´¹è èªå·±è®°å½æ¶è´¹ç¶æï¼æ¯ä¸ªæ¶è´¹è äºç¸ç¬ç«å°é¡ºåºæåæ¯ä¸ªååºçæ¶æ¯ã

说æï¼
- æä¸¤ä¸ªæ¶è´¹è ï¼ä¸åæ¶è´¹è ç»ï¼æååä¸ä¸ªä¸»é¢çæ¶æ¯ï¼æ¶è´¹è Açæ¶è´¹è¿åº¦æ¯3ï¼æ¶è´¹è Bçæ¶è´¹è¿åº¦æ¯6ã
- æ¶è´¹è æåçæå¤§ä¸ééè¿æé«æ°´ä½ï¼watermarkï¼æ§å¶ï¼çäº§è ææ°åå ¥çæ¶æ¯å¦æè¿æ²¡æè¾¾å°å¤ä»½æ°éï¼å¯¹æ¶è´¹è æ¯ä¸å¯è§çã
- è¿ç§ç±æ¶è´¹è æ§å¶åç§»éçä¼ç¹æ¯ï¼æ¶è´¹è å¯ä»¥æç §ä»»æçé¡ºåºæ¶è´¹æ¶æ¯ãæ¯å¦ï¼æ¶è´¹è å¯ä»¥éç½®å°æ§çåç§»éï¼éæ°å¤çä¹åå·²ç»æ¶è´¹è¿çæ¶æ¯ï¼æè ç´æ¥è·³å°æè¿çä½ç½®ï¼ä»å½åçæ¶å»å¼å§æ¶è´¹ã
æ¶è´¹è ç»
kafka æ¶è´¹è æ¯ä»¥consumer groupæ¶è´¹è ç»çæ¹å¼å·¥ä½ï¼ç±ä¸ä¸ªæè å¤ä¸ªæ¶è´¹è ç»æä¸ä¸ªç»ï¼å ±åæ¶è´¹ä¸ä¸ªtopicãæ¯ä¸ªååºå¨å䏿¶é´åªè½ç±groupä¸çä¸ä¸ªæ¶è´¹è 读åï¼ä½æ¯å¤ä¸ªgroupå¯ä»¥åæ¶æ¶è´¹è¿ä¸ªpartitionã

ä¸å¾ä¸ï¼æä¸ä¸ªç±ä¸ä¸ªæ¶è´¹è ç»æçgroupï¼æä¸ä¸ªæ¶è´¹è 读å主é¢ä¸ç两个ååºï¼å¦å¤ä¸¤ä¸ªåå«è¯»åä¸ä¸ªååºãæä¸ªæ¶è´¹è 读åæä¸ªååºï¼ä¹å¯ä»¥å«åæä¸ªæ¶è´¹è æ¯æä¸ªååºçæ¥æè ã
ä¼ç¹å¨äºï¼
- æ¶è´¹è å¯ä»¥éè¿æ°´å¹³æ©å±çæ¹å¼åæ¶è¯»å大éçæ¶æ¯ã
- 妿ä¸ä¸ªæ¶è´¹è 失败äºï¼é£ä¹å ¶ä»çgroupæåä¼èªå¨è´è½½å衡读åä¹åå¤±è´¥çæ¶è´¹è 读åçååºã
æ¶è´¹æ¹å¼
kafka æ¶è´¹è éç¨ pullï¼æï¼æ¨¡å¼ä» brokerä¸è¯»åæ°æ®ã
pull çä¼ç¹ï¼
- pull 模å¼å¯ä»¥æ ¹æ® consumer çæ¶è´¹è½å以éå½çéçæ¶è´¹æ¶æ¯
缺ç¹ï¼
- 妿 kafka æ²¡ææ°æ®ï¼æ¶è´¹è å¯è½ä¼é·å ¥å¾ªç¯ä¸ï¼ä¸ç´è¿åç©ºæ°æ®ãé对è¿ä¸ç¹ï¼Kafka çæ¶è´¹è 卿¶è´¹æ°æ®æ¶ä¼ä¼ å ¥ä¸ä¸ªæ¶é¿åæ° timeoutï¼å¦æå½åæ²¡ææ°æ®å¯ä¾æ¶è´¹ï¼consumer ä¼çå¾ ä¸æ®µæ¶é´ä¹ååè¿åï¼è¿æ®µæ¶é¿å³ä¸º timeoutã
# Kafka å¦ä½ä¿è¯é¡ºåºè¯»åæ¶æ¯ï¼
Kafka å¯ä»¥ä¿è¯å¨åä¸ä¸ªååºå æ¶æ¯æ¯æåºçï¼ç产è åå ¥å°åä¸ååºçæ¶æ¯ä¼æç §åå ¥é¡ºåºè¿½å å°ååºæ¥å¿æä»¶ä¸ï¼æ¶è´¹è ä»ååºä¸è¯»åæ¶æ¯æ¶ä¹ä¼æç §è¿ä¸ªé¡ºåºãè¿æ¯ Kafka 天ç¶å ·å¤çç¹æ§ã
è¦å¨ Kafka ä¸ä¿è¯é¡ºåºè¯»åæ¶æ¯ï¼éè¦ç»åç产è ãæ¶è´¹è çé 置以ååéçä¸å¡å¤çé»è¾æ¥å®ç°ã以ä¸å ·ä½è¯´æå¦ä½å®ç°é¡ºåºè¯»åæ¶æ¯ï¼
- ç产è ç«¯ç¡®ä¿æ¶æ¯é¡ºåºï¼ä¸ºäºä¿è¯æ¶æ¯åå ¥åä¸ååºä»èç¡®ä¿é¡ºåºæ§ï¼ç产è éè¦å°æ¶æ¯åéå°æå®ååºãå¯ä»¥éè¿èªå®ä¹ååºå¨æ¥å®ç°ï¼éè¿ä¸ºæ¶æ¯æå®ç¸åçKeyï¼ä¿è¯ç¸åKeyçæ¶æ¯åéå°åä¸ååºã
- æ¶è´¹è 端ä¿è¯é¡ºåºæ¶è´¹ï¼æ¶è´¹è 卿¶è´¹æ¶æ¯æ¶ï¼éè¦åçº¿ç¨æ¶è´¹åä¸ååºçæ¶æ¯ï¼è¿æ ·æè½ä¿è¯æé¡ºåºå¤çæ¶æ¯ãå¦æä½¿ç¨å¤çº¿ç¨æ¶è´¹åä¸ååºï¼å°±æ æ³ä¿è¯æ¶æ¯å¤ççé¡ºåºæ§ã
Kafka æ¬èº«ä¸è½ä¿è¯è·¨ååºçæ¶æ¯é¡ºåºæ§ï¼å¦æéè¦å ¨å±çæ¶æ¯é¡ºåºæ§ï¼é常æä»¥ä¸ä¸¤ç§æ¹æ³ï¼
- åªä½¿ç¨ä¸ä¸ªååºï¼å°æææ¶æ¯é½åå ¥å°åä¸ä¸ªååºï¼æ¶è´¹è ä¹åªä»è¿ä¸ªååºæ¶è´¹æ¶æ¯ãä½è¿ç§æ¹å¼ä¼å¯¼è´ Kafka çå¹¶è¡å¤çè½åä¸éï¼å 为 Kafka çæ§è½ä¼å¿å¨äºå¤ååºå¹¶è¡å¤çã
- ä¸å¡å±é¢ä¿è¯ï¼å¨ä¸å¡ä»£ç ä¸å¯¹æ¶æ¯è¿è¡ç¼å·ææ·»å æ¶é´æ³çæ è¯ï¼æ¶è´¹è 卿¶è´¹æ¶æ¯åï¼æ ¹æ®è¿äºæ è¯å¯¹æ¶æ¯è¿è¡æåºå¤çãä½è¿ç§æ¹å¼ä¼å¢å ä¸å¡ä»£ç çå¤æåº¦ã
# kafka æ¶æ¯ç§¯åæä¹åï¼
Kafka æ¶æ¯ç§¯åæ¯ä¸ä¸ªå¸¸è§çé®é¢ï¼å®å¯è½ä¼å¯¼è´æ°æ®å¤çå»¶è¿ï¼çè³å½±åä¸å¡çæ£å¸¸è¿è¡ï¼ä¸é¢æ¯ä¸äºè§£å³ Kafka æ¶æ¯ç§¯åé®é¢çå¸¸ç¨æ¹æ³ï¼
- å¢å æ¶è´¹è å®ä¾å¯ä»¥æé«æ¶æ¯çæ¶è´¹é度ï¼ä»èç¼è§£ç§¯åé®é¢ãä½ éè¦ç¡®ä¿æ¶è´¹è ç»ä¸çæ¶è´¹è æ°éä¸è¶ è¿ååºæ°éï¼å 为ä¸ä¸ªååºå䏿¶é´åªè½è¢«ä¸ä¸ªæ¶è´¹è æ¶è´¹ã
- å¢å Kafka 主é¢çååºæ°éå¯ä»¥æé«æ¶æ¯çå¹¶è¡å¤çè½åãå¨å建æ°ååºåï¼ä½ éè¦éæ°å¹³è¡¡æ¶è´¹è ç»ï¼è®©æ´å¤çæ¶è´¹è å¯ä»¥åæ¶æ¶è´¹æ¶æ¯ã
# Kafka为ä»ä¹ä¸ä¸ªååºåªè½ç±æ¶è´¹è ç»çä¸ä¸ªæ¶è´¹è æ¶è´¹ï¼è¿æ ·è®¾è®¡çæä¹æ¯ä»ä¹ï¼
å䏿¶å»ï¼ä¸æ¡æ¶æ¯åªè½è¢«ç»ä¸çä¸ä¸ªæ¶è´¹è å®ä¾æ¶è´¹

å¦æä¸¤ä¸ªæ¶è´¹è è´è´£åä¸ä¸ªååºï¼é£ä¹å°±æå³ç两个æ¶è´¹è åæ¶è¯»åååºçæ¶æ¯ï¼ç±äºæ¶è´¹è èªå·±å¯ä»¥æ§å¶è¯»åæ¶æ¯çoffsetï¼å°±æå¯è½C1æè¯»å°2ï¼èC1读å°1ï¼C1è¿æ²¡å¤çå®ï¼C2å·²ç»è¯»å°3äºï¼åä¼é æå¾å¤æµªè´¹ï¼å 为è¿å°±ç¸å½äºå¤çº¿ç¨è¯»ååä¸ä¸ªæ¶æ¯ï¼ä¼é ææ¶æ¯å¤ççéå¤ï¼ä¸ä¸è½ä¿è¯æ¶æ¯ç顺åºã
# 妿æä¸ä¸ªæ¶è´¹ä¸»é¢topicï¼æä¸ä¸ªæ¶è´¹ç»groupï¼topicæ10个ååºï¼æ¶è´¹çº¿ç¨æ°åååºæ°çå ³ç³»æ¯æä¹æ ·çï¼
topicä¸çä¸ä¸ªååºåªè½è¢«åä¸ä¸ªconsumer groupä¸çä¸ä¸ªconsumerçº¿ç¨æ¥æ¶è´¹ï¼ä½åä¹å¹¶ä¸æç«ï¼å³ä¸ä¸ªconsumer线ç¨å¯ä»¥æ¶è´¹å¤ä¸ªååºçæ°æ®ï¼æ¯å¦Kafkaæä¾çConsoleConsumerï¼é»è®¤å°±åªæ¯ä¸ä¸ªçº¿ç¨æ¥æ¶è´¹ææååºçæ°æ®ã

æä»¥ï¼ååºæ°å³å®äºåç»æ¶è´¹è 个æ°çä¸éã
å¦æä½ çååºæ°æ¯Nï¼é£ä¹æå¥½çº¿ç¨æ°ä¹ä¿æä¸ºNï¼è¿æ ·é常è½å¤è¾¾å°æå¤§çååéãè¶ è¿Nçé ç½®åªæ¯æµªè´¹ç³»ç»èµæºï¼å 为å¤åºç线ç¨ä¸ä¼è¢«åé å°ä»»ä½ååºã
# æ¶æ¯ä¸é´ä»¶å¦ä½åå°é«å¯ç¨ï¼
å ³äºæ¶æ¯ä¸é´ä»¶å¦ä½åå°é«å¯ç¨ï¼å ¶å®æ 论æä»¬ç¨çæ¯ KafkaãRocketMQ è¿æ¯ RabbitMQï¼å®ä»¬åºå±å®ç°é«å¯ç¨çãæ ¸å¿å¿æ³ã齿¯ç¸éçã
妿ç¨å¤§ç½è¯æ¥æ¦æ¬ï¼æ¶æ¯ä¸é´ä»¶çé«å¯ç¨å ¶å®å°±æ¯è¦ä¿é两件äºï¼ç¬¬ä¸æ¯ãæºå¨æäºæå¡ä¸è½åãï¼ç¬¬äºæ¯ãæºå¨æäºæ°æ®ä¸è½ä¸¢ãã
为äºåå°è¿ä¸¤ç¹ï¼ä¸çé常ä¼ç»åéç¨ä¸å¥å ³é®æºå¶ï¼æç»ä½ 梳çä¸ä¸ï¼
é¦å ç¬¬ä¸æ¥ï¼ä¹æ¯æåºç¡çï¼æç ´åç¹ï¼éç¨ãé群ä¸å¤å¯æ¬æºå¶ãã åæºæ»æç½¢å·¥çæ¶åï¼æä»¥å±ä»¬å¿ é¡»å¾ä¸ç©çé群ãä½å æé群è¿ä¸å¤ï¼å¦æä¸æ¡æ¶æ¯åªåå¨ A æºå¨ä¸ï¼A æºå¨ä¸æçµï¼æ¶æ¯è¿æ¯æ²¡æ³æ¶è´¹ãæä»¥æ ¸å¿å¨äº**ãæ°æ®è¦æå身ãï¼ä¹å°±æ¯è¦æä¸»ä»ï¼Master-Slaveï¼æè 坿¬ï¼Replicaï¼ã å½çäº§è ææ¶æ¯åç»ã主èç¹ãåï¼ç³»ç»ä¼å¨åå°æææè¿æ¡æ¶æ¯å¤å¶å°ãä»èç¹ãä¸å»ã è¿ééå¸¸ä¼æä¸ªç»å ¸çé¢è¯èç¹ï¼å°±æ¯æä¹å¤å¶ï¼ 妿æ¯ã弿¥å¤å¶ãï¼ä¸»èç¹æ¶å°æ¶æ¯ç´æ¥åè¯å¼åè æåäºï¼ç¶ååæ ¢æ ¢åæ¥ç»ä»èç¹ï¼è¿æ ·é度æå¿«ï¼ä½å¦æä¸»èç¹çªç¶å®æºï¼æ²¡æ¥å¾ååæ¥çæ°æ®å°±ä¸¢äºã 妿æ¯ã忥å¤å¶ã**ï¼ä¸»èç¹å¿ é¡»çå°ä»èç¹ä¹åè¿ç£çäºï¼æåè¯å¼åè æåãè¿æ ·æå ¶å®å ¨ï¼ä½æ§è½ä¼åå½±åãæä»¥å¨å®é ç产ä¸ï¼æä»¬é叏伿 ¹æ®ä¸å¡çææç¨åº¦æ¥æè¡¡ï¼æ¾ä¸ä¸ªåéçæä¸ç¹ã
ç¬¬äºæ¥ï¼æäºæ°æ®å¯æ¬ä¹åï¼è¿å¾æãèªå¨éä¸»ï¼æ éè½¬ç§»ï¼æºå¶ãã æä¸ªæ¯æ¹ï¼å³ä½¿ä»èç¹ï¼Slaveï¼æéæå®æ´çæ°æ®ï¼ä½å¦æä¸»èç¹ï¼Masterï¼å®æºäºï¼ä»èç¹ä¸ç¥éèªå·±è¯¥è½¬æ£ï¼ç³»ç»ç §æ ·ä¼ç«çªã æä»¥ï¼é«å¯ç¨ MQ å¿ é¡»æä¸ä¸ªãæé«ææ¥é¨ãï¼æ¯å¦ Kafka ä¾èµ Zookeeper/KRaftï¼RocketMQ 使ç¨åºå±ç Dledger æºå¶ï¼ãå®ä»¬çåºå±ä¼è·çä¸å¥ç±»ä¼¼ Raft çéä¸¾ç®æ³ï¼å¤§å®¶æ¶å»ä¿æå¿è·³äºç¸ææ¯ã䏿¦å¤§å®¶åç°ä¸»èç¹ä¸è·³äºï¼å°±ä¼é©¬ä¸åèµ·ãæ°ä¸»æç¥¨ãï¼å¨å©ä¸çä»èç¹éï¼æä¸ä¸ªæ°æ®æå ¨ãæå¥åº·çä»èç¹ï¼ç«éææä¸ºæ°ç主èç¹ï¼ç«å»æ¥ç®¡åå ¥è¯·æ±ãæ´ä¸ªè¿ç¨å¾å¾å¨ç§çº§çè³æ¯«ç§çº§èªå¨å®æï¼ä¸å¡å±å¤§å¤æ°æ¶åçè³æè§ä¸å°åé¡¿ã
ç¬¬ä¸æ¥ï¼æå¤é¢è¿éè¦ä¸å±ãå¨æè·¯ç±æç¥æºå¶ãã ç°å¨æä»¬ç MQ æå¡ç«¯å·²ç»è½å¨å®æºæ¶èªå¨åæ¢äºï¼é£å代ç çãç产è ãåãæ¶è´¹è ãæä¹ç¥é该è¿åªå°æ°æºå¨å¢ï¼ è¿å°±éè¦ç±»ä¼¼ RocketMQ ç NameServer æè Kafka çé«å¯ç¨å®¢æ·ç«¯åºåºäºãè¿äºåè°ç»ä»¶æ¶å»ç¯ç Broker 们çä¸ä¸¾ä¸å¨ï¼ä¸æ¦åçäºä¸é¢è¯´ç主ä»åæ¢ï¼å®ä»¬ä¼è¿ éæææ°çè·¯ç±è¡¨ï¼ä¹å°±æ¯è°æ¯æ°è大ï¼ä¸åç»ä¸å¡ç«¯ç代ç ãä¸å¡ä»£ç æ¿å°äºææ°çå°åï¼å°±è½ç¬é´è°æ´æ¹åï¼ç»§ç»ç»æ£å¸¸åæ´»çèç¹åæ¶æ¯ã
æ»ç»ä¸ä¸ï¼ æ¶æ¯ä¸é´ä»¶çé«å¯ç¨ï¼æ¬è´¨ä¸å°±æ¯ä¾é **ãå¤èç¹å¯æ¬æºå¶ãä¿è¯äºæ°æ®ä¸å¤åï¼ä¾é ãèªå¨é䏾䏿 é转移ãä¿è¯äºæå¡ç«¯å¤§èä¸å®æºï¼æåä¾é ãå¨æè·¯ç±åè°ç»ä»¶ã**æ ç¼è¡æ¥äºå®¢æ·ç«¯ãè¿ä¸å¥ç»åæ³æä¸æ¥ï¼æçæ£æçäºä¼ä¸çº§æ¶æ¯ç³»ç»æå ¶ååºçé«å¯ç¨åºç³ã
# Kafka å RocketMQ æ¶æ¯ç¡®è®¤æºå¶æä»ä¹ä¸åï¼
å ³äº Kafka å RocketMQ 卿¶æ¯ç¡®è®¤æºå¶ï¼Ackæºå¶ï¼ä¸çåºå«ï¼è¿å ¶å®è·å®ä»¬ä¸¤è çè¯çèæ¯æå¾å¤§å ³ç³»ãKafka 骨åéæ¯ä¸ºäºæµ·éæ¥å¿å¤çè¯ççï¼è¿½æ±çæ¯æè´çååéï¼è RocketMQ æ¯é¿éä¸ºäºæ¯æååä¸çµåä¸å¡é身æé çï¼è¿½æ±çæ¯æå ¶ä¸¥èçä¸å¡å¯é æ§ã
æä»¬å¯ä»¥ä»ãç产è åæ¶æ¯ç确认ãåãæ¶è´¹è æ¶è´¹åç确认ãä¸¤ä¸ªé¶æ®µæ¥çï¼ç±äºä¾§éç¹ä¸åï¼å ¶å®å·®å«æºå¤§çã
第ä¸ï¼æä»¬å çãç产è 端ãç确认æºå¶ï¼ä¹å°±æ¯ MQ åè¯å¤§çï¼è¿æ¡æ¶æ¯ææ¶å¦¥äºï¼ã
- Kafka ç©çæ¯åºäºå¯æ¬ç
acksæºå¶ãå®ç»å¼åè çäºä¸ä¸ªé项ï¼acks=0ï¼ååºå»å°±ä¸ç®¡äºï¼ãacks=1ï¼åªè¦Leaderèç¹å䏿¥å°±è¿åæåï¼ãacks=all/-1ï¼å¿ é¡»çææåæ¥å¯æ¬ISRé½å䏿¥æç®æåï¼ãå®çæ ¸å¿è®¾è®¡æè·¯æ¯å´ç»çåå¸å¼é群ç坿¬åæ¥æºå¶æ¥ç¡®ä¿åå¨å¯é æ§çã - RocketMQ çä¾§éç¹æç¹ä¸ä¸æ ·ï¼å®æ´å ³æ³¨åæºå±é¢å䏻仿¶æä¸çç©çè½çãå®ç确认æºå¶ä¸»è¦ä¾èµäºä½ çé群é ç½®ï¼æ¯åæ¥å·çè¿æ¯å¼æ¥å·çï¼æ¯åæ¥å¤å¶ï¼ä¸»ä»é½å宿è¿åï¼è¿æ¯å¼æ¥å¤å¶ï¼ç¸å¯¹äº Kafkaï¼RocketMQ å¨ä¸å¡ä¸å¾å¾ä¼é ç½®æã忥ååãï¼ä¹å°±æ¯è¿½æ±ç©ç级å«çä¸ä¸¢æ¶æ¯ã
第äºï¼ä¹æ¯æä»¬å¨æ¥å¸¸åä»£ç æ¶æç¥ææ·±çåºå«ï¼ä¹å°±æ¯ãæ¶è´¹è 端ãç确认æºå¶ã ç¨ä¸å¥éä¿çè¯æ¥è¯´ï¼Kafka æ¯ãè¿åº¦æ¡æ¨¡å¼ãï¼è RocketMQ æ¯ãåæ®ç¾æ¶æ¨¡å¼ãã
- Kafka çæ¶è´¹è 确认ï¼å«ä½ãæäº¤åç§»éï¼Offset Commitï¼ãã ç®å说ï¼Kafka çéåå°±å䏿¬ä¹¦ï¼æ¶è´¹è æ¶è´¹å°±åå¨çä¹¦ï¼æ¯æ¬¡åè¯ Kafka çæ¯ãæå·²ç»çå°ç¬¬100页äºããè¿å°±å¸¦æ¥ä¸ä¸ªé®é¢ï¼å¦ææ¯æ¹éæ¶è´¹ï¼ç¬¬99æ¡æ¶æ¯å¤ç失败äºï¼ç¬¬100æ¡æåäºãä½ è¦æ¯æäº¤äºç¬¬100页çè¿åº¦ï¼ç¬¬99æ¡å°±ç¸å½äºè¢«è·³è¿ä¸¢å¤±äºï¼ä½ è¦æ¯ä¸æäº¤ï¼ä¸æ¬¡éå¯åå¾ä»å¤´åçä¸éãKafka åçæ²¡æå¾å¥½å°æä¾åæ¡æ¶æ¯çº§å«ç失败éè¯æºå¶ï¼é常éè¦æä»¬å¨ä¸å¡ä»£ç éèªå·±æè·å¼å¸¸å»å¤çã
- RocketMQ çæ¶è´¹è
ç¡®è®¤ï¼æ¯é常贴åä¸å¡é»è¾çã å®è½ç¶åºå±ä¹æè¿åº¦ï¼ä½å¨ä»£ç å±é¢ï¼å®è¦æ±æ¶è´¹è
é对æ¯ä¸æ¡/æ¯ä¸æ¹æ¶æ¯æç¡®è¿åç¶æï¼è¦ä¹æ¯
CONSUME_SUCCESSï¼æ¶è´¹æåï¼ï¼è¦ä¹æ¯RECONSUME_LATERï¼ç¨åéè¯ï¼ã ç»å¦çå°æ¹å¨äºï¼å¦æä½ è¿åäºå¤±è´¥æè æäºå¼å¸¸ï¼RocketMQ ä¸ä¼å¡å¨é£éï¼å®ä¼èªå¨æè¿æ¡æ¶æ¯å¡è¿ä¸ä¸ªå ç½®ç**ãéè¯éåãéï¼å¹¶ä¸æä¸å¥é¶æ¢¯å¼çå»¶è¿çå¾ æ¶é´ï¼æ¯å¦ç10ç§ã30ç§ã1åéååè®©ä½ æ¶è´¹ï¼ï¼å¦æéè¯äºåå æ¬¡é½ä¸è¡ï¼æåå®è¿ä¼å¸®ä½ ææ¶æ¯æ¾è¿ãæ»ä¿¡éåï¼DLQï¼ã**ï¼æ¹ä¾¿äººå·¥é¡ºè¤æ¸ç廿æ¥ãè¿ç§ä¿å§å¼çåæ¡æ¶æ¯ç¡®è®¤åéè¯æºå¶ï¼å¯¹çµåç夿çä¸å¡åºæ¯æå ¶å好ã
æ»ç»ä¸ä¸ï¼ Kafka ç确认æºå¶å¼ºè°æ´ä½æ¹æ¬¡åååï¼æ´æ³¨é坿¬ä¹é´çåæ¥ï¼æ¶è´¹è 端éç¨æéåç§»éçæ¹å¼ï¼ç¨å¾®æç¹ç²ç²åº¦ï¼è RocketMQ ç确认æºå¶å¸¦ææå¼ºçãä¸å¡åºå ãï¼ä¸ä» å ³æ³¨ç©çè½çï¼å¨æ¶è´¹è ç«¯æ´æ¯æä¾äºç²¾ç»å°åæ¡æ¶æ¯çº§å«çæå/å¤±è´¥ç¶æç¡®è®¤åèªå¨éè¯éç¯ãè¿ä¹æ¯ä¸ºä»ä¹å¨å¤§æ°æ®é¢å大家é¦é Kafkaï¼èå¨ç¨å¾®å¤æçå¾®æå¡ä¸å¡éï¼å¤§å®¶æ´åç± RocketMQ çåå ã
# Kafka å RocketMQ ç broker æ¶ææä»ä¹åºå«
Kafka æ¯ä¸ºäºå¤§æ°æ®é¢åçæ¥å¿æµå¤ç设计çï¼è RocketMQ æ¯é¿éå½å¹´å¨åå䏿µ·éä¸å¡åºæ¯ä¸ï¼å 为è§å¾ Kafka 没æ³å®å ¨æ»¡è¶³éæ±ï¼ä»èåé´æ¹é åºæ¥çã
å¨ Broker çæ ¸å¿æ¶æè®¾è®¡ä¸ï¼å®ä»¬æå¤§çåºå«ä¸»è¦éä¸å¨**ãæä»¶å卿¨¡åãããåè°æºå¶ã以åãé«å¯ç¨ç²åº¦ã**ä¸ä¸ªæ¹é¢ï¼è¯¦ç»è¯´ä¸ä¸ï¼
æè´å½ã乿¯ææ ¸å¿çåºå«ï¼å¨äºãæä»¶å卿¨¡åãã
- Kafka ç Broker éç¨çæ¯ãç¬ç«çååºæä»¶ãè®¾è®¡ã æä¸ªæ¯æ¹ï¼Kafka å°±åæ¯ç»æ¯ä¸ªå ·ä½çä¸å¡ï¼Partitionï¼åç¬åå¤äºä¸ä¸ªå°æ¬åãä¸å¡ A çæ¶æ¯åè¿ A çæ¬åï¼ä¸å¡ B çæ¶æ¯åè¿ B çæ¬åãå½ä¸»é¢ï¼Topicï¼æ¯è¾å°æ¶ï¼è¿ç§è®¾è®¡é度æå¿«ï¼æ¯é常纯粹çç£ç顺åºåã ä½é®é¢æ¥äºï¼å¨çµåå¾®æå¡åºæ¯ä¸ï¼å¯è½æåä¸ä¸ä¸ªç³»ç»é½å¨ç¨ MQï¼å¦æäº§çäºä¸ä¸ä¸ªä¸»é¢ï¼Kafka ç Broker åºå±å°±ä¼æä¸ä¸ä¸ªæä»¶åæ¶å¨åå ¥ã忬çã顺åºåãç¬é´éåæäºãç£çéæºåãï¼æ§è½æ´è·ï¼æºå¨å¡æ»ã
- RocketMQ ç Broker 忝ã大ä¸ç»çæ··ååå¨ã设计ã é¿éå°±æ¯ä¸ºäºè§£å³ä¸é¢è¯´çæµ·é Topic å¯¼è´æ§è½ä¸éçé®é¢ï¼è®¾è®¡äºèåç CommitLog + ConsumeQueue æ¶æã ä¸ç®¡ä½ æå¤å°ä¸ªä¸»é¢ï¼ææçæ¶æ¯æ¥å° Broker åï¼ä¸ç®¡ä¸ä¸äºåä¸ï¼å ¨é¨é¡ºåºè¿½å åå°ä¸ä¸ªå ¬å ±çãå·¨å¤§çæ¥å¿æä»¶éï¼ä¹å°±æ¯ CommitLogï¼ãè¿å°±ä¿è¯äºæ 论 Topic æ°éæä¹æ´å¢ï¼åå ¥æ°¸è¿æ¯æè´çç£ç顺åºåã 飿¶è´¹è æä¹æ¾èªå·±çæ¶æ¯å¢ï¼ Broker åå°ä¼æä¸æ³¢ä¸é¨ç线ç¨ï¼å®æ¶æå¤§æä»¶éçæ¶æ¯ä½ç½®æåºæ¥ï¼æ´çæä¸æ¬æ¬è½»é级çãç®å½ãï¼ä¹å°±æ¯ ConsumeQueueï¼ãæ¶è´¹è 顺çç®å½å»å¤§æä»¶éææ°æ®å°±è¡äºãè¿å°±æ¯ä¸¤è å¨åºå±æ¶æä¸æ°´ç«ä¸å®¹çåºå«ã
第äºä¸ªåºå«ï¼å¨äº Broker 身åçãåè°å¤§èãä¸åã
- Kafka æå ¶ä¾èµå¤é¨ç»ä»¶ï¼ä¼ ç»æ¶æä¾èµ Zookeeperï¼æ°çæ¢æäºå ç½®ç KRaftï¼ã Kafka ç Broker æ¯ä¸ªçº¯ç²¹çæå·¥äººï¼å®æå æ°æ®ç®¡çãé群é主è¿ç§æå ¶å¤æçèåå³å¨å ¨äº¤ç»äº Zookeeperï¼æè KRaft æ§å¶å¨èç¹ï¼ãèç¹ä¸å¤ï¼å¿è·³ä¿æ´»åæ°æ®åæ¥çå¼éæ¯é常大çã
- RocketMQ ç Broker æé çæ¯æå ¶è½»é级ç NameServerã é¿éå½å¹´æµè¯æ¶å«å¼ Zookeeper å®å¨å¤ªéã太容æå¨ç½ç»é£æ´ä¸å´©æºï¼äºæ¯èªå·±åäºä¸ªæç®ç NameServerãNameServer èç¹ä¹é´çè³é½æ¯äºç¸ä¸éä¿¡çï¼å ¨é åºä¸ç Broker 们主å¨ç»ææç NameServer è¿è¡ãå¤å¤´æ±æ¥ããè¿ç§è®¾è®¡è®©ææä»»ä½ä¸ä¸ª NameServer é½ä¸å½±å大å±ï¼Broker æ¶æåå¾å¼å¸¸ç®å稳å®ã
第ä¸ä¸ªåºå«ï¼é«å¯ç¨çãç²åº¦ãä¸ä¸æ ·ã
- Kafka çé«å¯ç¨æ¯ãPartition ååºçº§å«ãçã ä¸å° Broker 宿ºäºï¼Kafka æ¯å¨åºå±æç¾ä¸åä¸ªå°æ¬åï¼Partitionï¼éï¼ä¸ä¸ªä¸ªå»éæ°é举æ°ç Leaderï¼è¿éè¦èè´¹ä¸å®æ¶é´ã
- RocketMQ çé«å¯ç¨æ¯ãBroker æå¡å¨èç¹çº§å«ãçã 宿´ååäºä¼ ç»æ°æ®åºç䏻仿¨¡å¼ï¼Master-Slaveï¼ãMaster æäºï¼æ¶è´¹è å°±ç´æ¥æ ç¼åæ¢å»è¯» Slaveãç¸å¯¹æ¥è¯´ï¼ç®¡çå±çº§æ´é«ï¼æºå¶ä¹æ´ååäºç©çæºå¨å±é¢ç容ç¾ã
æ»ç»ä¸ä¸ï¼ Kafka ç Broker æ¶æå°±åæ¯**ãåå¸å¼çæä»¶ç³»ç»ãï¼æ¯ä¸ªååºèªæ²»ï¼éåå¤§æ°æ®åºæ¯ä¸å° Topicç大ååéï¼è RocketMQ ç Broker æ¯å ¸åçãæ°æ®åºå¼ææç»´ã**ï¼éè¿ç»ä¸ç CommitLog è§£å³æµ·é Topic çåå ¥ç¶é¢ï¼åç¨ NameServer æåå¸å¼åè°åå°æè´è½»éåï¼æ¯é常强æçä¼ä¸çº§ä¸å¡å¾®æå¡å©å¨ã
# RabbitMQ
# RabbitMQ å AMQP æ¯ä»ä¹å ³ç³»ï¼
妿ç¨ä¸å¥è¯æ¥ç®åæ¦æ¬ï¼é£å°±æ¯ï¼AMQP æ¯ä¸å¥ç论æ åï¼è RabbitMQ æ¯è¿å¥æ åçå ·ä½è½å°å®ç°ã
å¦æä½ åè¿ Javaï¼é£å®ä¿©çå ³ç³»å°±åæ¯æä»¬ä»£ç éç**ãæ¥å£ï¼Interfaceï¼ãåãå®ç°ç±»ã**çå ³ç³»ãæä»¬å¯ä»¥è¿æ ·æ¥çè§£ï¼
é¦å ï¼AMQP æ¯ãå¾çº¸ãã AMQP çå ¨åå«ãé«çº§æ¶æ¯éååè®®ãã请注æï¼å®æ¯ä¸ä¸ªãåè®®ãï¼æ¬èº«å¹¶ä¸æ¯ä¸ä¸ªå¯ä»¥ç´æ¥å®è£ è¿è¡ç软件ãå®å°±åä¸ä»½è¯¦ç»ç交éè§åæè 建çå¾çº¸ï¼è§å®äºä¸å¥çæ³çæ¶æ¯éåç³»ç»åºè¯¥é¿ä»ä¹æ ·ãæ¯å¦ï¼å®å¨åè®®éå®ä¹äºï¼æ¶æ¯ååºæ¥ä¹åä¸è½ç´æ¥è¿éåï¼ä¸é´å¾æä¸ªä¸è¥¿å«ãäº¤æ¢æºï¼Exchangeï¼ãï¼è¿å¾æè·¯ç±é®æ¥æææ¶æ¯å»åªå¿ãå®åªç®¡å®è§ç©ï¼ä¸è´è´£å代ç ã
å ¶æ¬¡ï¼RabbitMQ æ¯ãçæ¿åãã æäºå¾çº¸ï¼è¯å®å¾æäººæå®çåºæ¥ï¼RabbitMQ å°±æ¯é£åº§çå¥½çæ¿åãå ¶å®å½å¹´æå¾å¤å¢éæ³å»å®æ AMQP è¿å¥ç论ï¼è RabbitMQ çå¼åå¢éç¨å¹¶åæ§è½æé«ç Erlang è¯è¨ï¼å®ç¾å°ç §ç AMQP è¿å¥åè®®æ åï¼ååºäºä¸ä¸ªçæ£å¯ä»¥éçµè¿è¡ç软件产åãå¯ä»¥è¯´ï¼RabbitMQ æ¯ä»å¤©å¸é¢ä¸æ AMQP åè®®è´¯å½»å¾æåæ±åå³ã乿¯æç¥åç䏿¬¾æ¶æ¯ä¸é´ä»¶ã
çè§£è¿å±å ³ç³»ï¼å¯¹æä»¬å®é å¼åçæä¹å¨åªéå¢ï¼ å°±å¨äº**ãçµæ´»çè·¯ç±è½åããå¾å¤ç®åç MQ å°±æ¯ç产è åæ¶æ¯ãéååæ¶æ¯ãæ¶è´¹è åæ¶æ¯ï¼ä¸æ¡ç´çº¿èå·²ãä½å¨ AMQP åè®®çè§èéï¼äºæ 没é£ä¹ç®åãå AMQP åºå çå½±åï¼æä»¬å¨ç¨ RabbitMQ çæ¶åï¼ç产è åçæ¶æ¯å®é 䏿¯å åç»äºäº¤æ¢æºï¼Exchangeï¼**ï¼äº¤æ¢æºå°±åä¸ä¸ªæ¥ææå ¶ä¸°å¯ç»éªçãé®å±åæ£åãï¼å®å¯ä»¥æ ¹æ®æä»¬é ç½®çåç§è§åââæ¯å¦æååç´æ¥æéãæéé ç¬¦æ¨¡å¼æéãæè å¹²èç´æ¥å¹¿ææå ï¼æä¸æ¡æ¶æ¯ç²¾åå°ååç»ä¸åçç®æ éåãè¿ç§é常强大çè·¯ç±æºå¶ï¼æ°æ°å°±æ¯ AMQP åè®®èµäº RabbitMQ æå¤§çä¸å¼ ççã
æ»ç»ä¸ä¸å°±æ¯ï¼ AMQP æä¾äºæ¶æ¯éååºè¯¥æä¹è®¾è®¡çæ ¸å¿çµéåè§èï¼è RabbitMQ æè¿å¥è§èåæäºç°å®ï¼æä¸ºäºä¸æ¬¾ä¼ä¸çº§ç髿§è½æ¶æ¯ä¸é´ä»¶ãè¿å°±æ¯å®ä¿©çå ³ç³»ã
# RabbitMQ æ ¸å¿ç»ä»¶æåªäºï¼

RabbitMQ çæ ¸å¿ç»ä»¶ï¼é½æ¯æ¶æ¯ä»ååºå°æ¶è´¹å¿ ä¸å¯å°çé¨åï¼
é¦å æ¯ç产è ï¼Producerï¼ï¼å®å°±æ¯åéæ¶æ¯ç䏿¹ï¼æ¯å¦æä»¬çä¸å¡æå¡ï¼è´è´£æéè¦å¼æ¥å¤ççæ¶æ¯ï¼äº¤ç» RabbitMQï¼ä¸ä¼ç´æ¥å»æ¾æ¶è´¹è ã
ç¶åæ¯æ¶è´¹è ï¼Consumerï¼ï¼å®æ¯çå¬å¹¶å¤çæ¶æ¯ç䏿¹ï¼ä¸ç´ç¯çéåï¼ä¸æ¦éåéææ°æ¶æ¯ï¼å°±ä¼ååºæ¥æ§è¡ä¸å¡é»è¾ã
æ¥ä¸æ¥æ¯éåï¼Queueï¼ï¼è¿æ¯ RabbitMQ éçæ£å卿¶æ¯çå°æ¹ï¼éç¨å è¿å åºçæºå¶ï¼æ¶æ¯ä¼ä¸ç´åå¨è¿éï¼ç´å°è¢«æ¶è´¹è åèµ°ï¼æ¯æ´ä¸ªæ¶æ¯éåçæ ¸å¿è½½ä½ã
ç¶åæ¯äº¤æ¢æºï¼Exchangeï¼ï¼ç产è ä¸ä¼ç´æ¥ææ¶æ¯åç»éåï¼èæ¯å åç»äº¤æ¢æºï¼å®ç¸å½äºä¸ä¸ªæ¶æ¯ååå¨ï¼ä¼æç §æä»¬è®¾å®çè§åï¼ææ¶æ¯è·¯ç±å°å¯¹åºçéåéï¼ä¹å°±æ¯æä»¬åæè¯´çåç§äº¤æ¢æºç±»åã
è¿æè·¯ç±é®ï¼RoutingKeyï¼ åç»å®ï¼Bindingï¼ï¼ç»å®æ¯æäº¤æ¢æºåéåå ³èèµ·æ¥ç纽带ï¼è·¯ç±é®åæ¯ç产è åæ¶æ¯æ¶å¸¦çæ è¯ï¼äº¤æ¢æºä¼æ ¹æ®è·¯ç±é®åç»å®çè§åï¼å¤ææ¶æ¯è¯¥æå°åªä¸ªéåã
æåæ¯è¿æ¥ï¼Connectionï¼ åä¿¡éï¼Channelï¼ï¼Connection æ¯å®¢æ·ç«¯å RabbitMQ ä¹é´ç TCP é¿è¿æ¥ï¼è Channel æ¯å»ºç«å¨è¿æ¥ä¹ä¸çè½»é级信éï¼å 为 TCP è¿æ¥åå»ºéæ¯å¼éå¾å¤§ï¼æä»¥ç¨å¤ä¸ªä¿¡éæ¥ä¼ è¾æ¶æ¯ï¼è½å¤§å¤§èçèµæºã
ç®åæ»ç»å°±æ¯ï¼ç产è åæ¶æ¯ç»äº¤æ¢æºï¼äº¤æ¢æºéè¿è·¯ç±é®åç»å®ï¼ææ¶æ¯æå°éåï¼æåæ¶è´¹è ä»éååæ¶æ¯æ¶è´¹ï¼æ´ä¸ªæµç¨å°±é è¿äºæ ¸å¿ç»ä»¶å®æã
# RabbitMQ æåªå ç§äº¤æ¢æºç±»åï¼
RabbitMQ éæ ¸å¿çäº¤æ¢æºä¸å ±åç§ï¼å嫿¯ç´è¿ãæå½¢ã主é¢åå¤´äº¤æ¢æºï¼å ¶ä¸åä¸ç§æ¯å·¥ä½ä¸æå¸¸ç¨çï¼å¤´äº¤æ¢æºåºæ¬å¾å°ç¨å°ã
第ä¸ç§æ¯ç´è¿äº¤æ¢æºï¼Directï¼ï¼å®æ¯ç²¾åå¹é çæ¨¡å¼ï¼æ¶æ¯ä¼æ ¹æ®è·¯ç±é®å®å ¨ä¸è´ï¼æè½¬åå°å¯¹åºçéåãæ¯å¦è·¯ç±é®è®¾æ
user.loginï¼å°±åªä¼åç»ç»å®äºè¿ä¸ª exact é®çéåï¼éåä¸å¯¹ä¸ãç²¾åæéçåºæ¯ã第äºç§æ¯æå½¢äº¤æ¢æºï¼Fanoutï¼ï¼å®å°±æ¯å¹¿ææ¨¡å¼ï¼å®å ¨ä¸çè·¯ç±é®ï¼åªè¦éåç»å®äºè¿ä¸ªäº¤æ¢æºï¼æææ¶æ¯é½ä¼æ èåç»ææéåãéå群åéç¥ã夿å¡åæ¥æ´æ°è¿ç±»åºæ¯ï¼æçå¾é«ã
第ä¸ç§æ¯ä¸»é¢äº¤æ¢æºï¼Topicï¼ï¼å®æ¯æè·¯ç±é®æ¨¡ç³å¹é ï¼ç¨
*å¹é ä¸ä¸ªåè¯ã#å¹é å¤ä¸ªæ 0 个åè¯ï¼æ¯æçµæ´»çä¸ç§ãæ¯å¦ç¨order.#ï¼å°±è½å¹é order.createãorder.payææä»¥ order å¼å¤´çè·¯ç±é®ï¼éåæä¸å¡ä¸»é¢åç±»ãæ¹éè·¯ç±çåºæ¯ã第åç§æ¯å¤´äº¤æ¢æºï¼Headersï¼ï¼å®ä¸çè·¯ç±é®ï¼èæ¯æ ¹æ®æ¶æ¯å¤´éçé®å¼å¯¹æ¥å¹é ï¼ä½æ¯æ§è½æ¯è¾å·®ï¼å®é å¼åéå ä¹ä¸ç¨ï¼ç®åäºè§£å°±è¡ã
# RabbitMQçç¹æ§ä½ ç¥éåªäºï¼
RabbitMQ 以 å¯é æ§ãçµæ´»æ§ å ææ©å±æ§ ä¸ºæ ¸å¿ä¼å¿ï¼éåéè¦ç¨³å®æ¶æ¯ä¼ éçå¤æç³»ç»ãå ¶ä¸°å¯çæä»¶ååè®®æ¯æä½¿å ¶å¨å¾®æå¡ãIoTãéèçé¢å广æ³åºç¨ï¼æ¯è¾æ ¸å¿çç¹æ§æå¦ä¸ï¼
- æä¹
åæºå¶ï¼RabbitMQ æ¯ææ¶æ¯ãéåå交æ¢å¨çæä¹
åãå½å¯ç¨æä¹
åæ¶ï¼æ¶æ¯ä¼è¢«åå
¥ç£çï¼å³ä½¿ RabbitMQ æå¡å¨éå¯ï¼æ¶æ¯ä¹ä¸ä¼ä¸¢å¤±ãä¾å¦ï¼å¨å£°æéåæ¶å¯ä»¥è®¾ç½®
durableåæ°ä¸ºtrueæ¥å®ç°éåçæä¹ åï¼
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# 声æä¸ä¸ªæä¹
åéå
channel.queue_declare(queue='durable_queue', durable=True)
- æ¶æ¯ç¡®è®¤æºå¶ï¼æä¾äºç产è
ç¡®è®¤åæ¶è´¹è
确认æºå¶ãç产è
å¯ä»¥è®¾ç½®
confirm模å¼ï¼å½æ¶æ¯æåå°è¾¾ RabbitMQ æå¡å¨æ¶ï¼ä¼æ¶å°ç¡®è®¤æ¶æ¯ï¼æ¶è´¹è å¨å¤ç宿¶æ¯åï¼å¯ä»¥å RabbitMQ åé确认信å·ï¼åç¥æå¡å¨è¯¥æ¶æ¯å·²è¢«æåå¤çï¼æå¡å¨æä¼å°æ¶æ¯ä»éåä¸å é¤ã - éåéåï¼æ¯æå建éåéåï¼å°éåçå 容å¤å¶å°å¤ä¸ªèç¹ä¸ï¼æé«æ¶æ¯çå¯ç¨æ§åå¯é æ§ãå½ä¸ä¸ªèç¹åºç°æ éæ¶ï¼å ¶ä»èç¹ä»ç¶å¯ä»¥æä¾æå¡ï¼ç¡®ä¿æ¶æ¯ä¸ä¼ä¸¢å¤±ã
- å¤ç§äº¤æ¢å¨ç±»åï¼RabbitMQ æä¾äºå¤ç§ç±»åç交æ¢å¨ï¼å¦ç´è¿äº¤æ¢å¨ï¼Direct Exchangeï¼ãæå½¢äº¤æ¢å¨ï¼Fanout Exchangeï¼ã主é¢äº¤æ¢å¨ï¼Topic Exchangeï¼å头é¨äº¤æ¢å¨ï¼Headers Exchangeï¼ãä¸åç±»åç交æ¢å¨æ ¹æ®ä¸åçè§åå°æ¶æ¯è·¯ç±å°éåä¸ãä¾å¦ï¼æå½¢äº¤æ¢å¨ä¼å°æ¥æ¶å°çæ¶æ¯å¹¿æå°ææç»å®çéåä¸ï¼ä¸»é¢äº¤æ¢å¨åæ ¹æ®æ¶æ¯çè·¯ç±é®åç»å®é®çå¹é è§åè¿è¡è·¯ç±ã
# RabbitMQçåºå±æ¶ææ¯ä»ä¹ï¼

以䏿¯ RabbitMQ çä¸äºæ ¸å¿æ¶æç»ä»¶åç¹æ§ï¼
- æ ¸å¿ç»ä»¶ï¼ç产è è´è´£åéæ¶æ¯å° RabbitMQãæ¶è´¹è è´è´£ä» RabbitMQ æ¥æ¶å¹¶å¤çæ¶æ¯ãRabbitMQ æ¬èº«è´è´£åå¨åè½¬åæ¶æ¯ã
- äº¤æ¢æºï¼äº¤æ¢æºæ¥æ¶æ¥èªç产è çæ¶æ¯ï¼å¹¶æ ¹æ® routing key åç»å®è§åå°æ¶æ¯è·¯ç±å°ä¸ä¸ªæå¤ä¸ªéåã
- æä¹ åï¼RabbitMQ æ¯ææ¶æ¯çæä¹ åï¼å¯ä»¥å°æ¶æ¯ä¿åå¨ç£çä¸ï¼ä»¥ç¡®ä¿å¨ RabbitMQ éå¯åæ¶æ¯ä¸ä¸¢å¤±ï¼éåä¹å¯ä»¥è®¾ç½®ä¸ºæä¹ åï¼ä»¥ä¿è¯å ¶ç»æå¨éå¯åä¸ä¼ä¸¢å¤±ã
- 确认æºå¶ï¼ä¸ºäºç¡®ä¿æ¶æ¯å¯é éè¾¾ï¼RabbitMQ 使ç¨ç¡®è®¤æºå¶ï¼è´¹è å¨å¤ç宿¶æ¯ååéç¡®è®¤ç» RabbitMQï¼æªç¡®è®¤çæ¶æ¯ä¼éæ°å ¥éã
- é«å¯ç¨æ§ï¼RabbitMQ æä¾äºé群模å¼ï¼å¯ä»¥å°å¤ä¸ª RabbitMQ å®ä¾ç»æä¸ä¸ªé群ï¼ä»¥æé«å¯ç¨æ§åè´è½½åè¡¡ãéè¿éåéåï¼å¯ä»¥å¨å¤ä¸ªèç¹ä¸å¤å¶åä¸éåçå 容ï¼ä»¥é²æ¢åç¹æ éã
# æ¶æ¯ä¸é´ä»¶rabbitMQçå¯é æ§ä¿éæä¹åï¼
RabbitMQ çå¯é æ§ä¿éæ ¸å¿æ¯ç¡®ä¿ ãæ¶æ¯ä¸ä¸¢å¤±ãä¸éå¤ãä¸ç§¯åãï¼è¿éè¦ä»ç产è ãRabbitMQ æå¡å¨ãæ¶è´¹è ä¸ä¸ªç¯èå±å±æå ³ã

é¦å æ¯ç产è ç¯èï¼è¦ä¿è¯æ¶æ¯è½æåæéå°äº¤æ¢æºãè¿å°±éè¦å¼å¯ç产è 确认æºå¶ï¼Publisher Confirmï¼ï¼ä¸æ¦æ¶æ¯è¢«äº¤æ¢æºæ¥æ¶ï¼RabbitMQ ä¼è¿å确认éç¥ï¼è¥æéå¤±è´¥ï¼æ¯å¦äº¤æ¢æºä¸åå¨ï¼ï¼ç产è è½åæ¶éè¯ï¼åæ¶å»ºè®®å¼å¯äºå¡æºå¶ï¼ä½äºå¡ä¼å½±åååéï¼æä»¥å¤§é¨ååºæ¯ä¸ç¨ç¡®è®¤æºå¶æ´åéãå¦å¤ï¼ç产è è¦å¤çç½ç»å¼å¸¸ãè¿æ¥ä¸æçé®é¢ï¼æ¯å¦è®¾ç½®åççéè¯æ¬¡æ°åé´éï¼é¿å å ä¸´æ¶æ éå¯¼è´æ¶æ¯ä¸¢å¤±ã
ç¶åæ¯ RabbitMQ æå¡å¨ç¯èï¼è¦é²æ¢æ¶æ¯å¨æå¡å¨ç«¯ä¸¢å¤±ãè¿å°±éè¦ç»éååæ¶æ¯é½è®¾ç½®æä¹ åï¼éåæä¹ åè½ä¿è¯ RabbitMQ éå¯åéå䏿¶å¤±ï¼æ¶æ¯æä¹ ååè½ä¿è¯æ¶æ¯å¨æå¡å¨éå¯åä¸ä¸¢å¤±ï¼éè¿å°æ¶æ¯åå ¥ç£çå®ç°ï¼ãåæ¶ï¼è¦åçè®¾ç½®äº¤æ¢æºåéåçç»å®å ³ç³»ï¼é¿å å ç»å®éè¯¯å¯¼è´æ¶æ¯æ æ³è·¯ç±å°éåï¼å¯ä»¥å¼å¯äº¤æ¢æºçæ»ä¿¡åè½ï¼å°æ æ³è·¯ç±çæ¶æ¯è½¬åå°æ»ä¿¡éåï¼åç»äººå·¥å¤çï¼ãå¦å¤ï¼æå¡å¨è¦å好é群é¨ç½²åæ°æ®å¤ä»½ï¼æ¯å¦ä¸»ä»å¤å¶ãéåéåï¼é²æ¢åç¹æ éå¯¼è´æ¶æ¯ä¸¢å¤±ã
æåæ¯æ¶è´¹è ç¯èï¼è¦ä¿è¯æ¶æ¯è½è¢«æ£ç¡®å¤çä¸ä¸é夿¶è´¹ãæ¶è´¹è éè¦å¼å¯æå¨ç¡®è®¤æ¨¡å¼ï¼ackï¼ï¼åªæå½æ¶æ¯è¢«æåå¤çï¼æ¯å¦ä¸å¡é»è¾æ§è¡å®æãæ°æ®å ¥åºæåï¼åï¼ææå¨åé ack éç¥ RabbitMQ å 餿¶æ¯ï¼è¥å¤çå¤±è´¥ï¼æ¯å¦ä¸å¡å¼å¸¸ãç³»ç»å´©æºï¼ï¼åä¸åé ackï¼RabbitMQ ä¼å°æ¶æ¯éæ°å ¥éï¼çå¾ åç»éè¯ãåæ¶ï¼è¦å¤çæ¶æ¯é夿¶è´¹çé®é¢ï¼è¿å°±éè¦å¨ä¸å¡å±é¢åå¹çæ§è®¾è®¡ï¼æ¯å¦ç»æ¶æ¯è®¾ç½®å¯ä¸ IDï¼æ¶è´¹æ¶å æ¥è¯¢è¯¥ ID æ¯å¦å·²å¤çï¼è¥å·²å¤çåç´æ¥å¿½ç¥ï¼é¿å é夿§è¡ä¸å¡é»è¾ãå¦å¤ï¼æ¶è´¹è è¦æ§å¶æ¶è´¹é度ï¼é¿å å æ¶è´¹è¿æ ¢å¯¼è´æ¶æ¯ç§¯åï¼å¯ä»¥éè¿éæµæºå¶ï¼æ¯å¦æ¯æ¬¡åªè·å 10 æ¡æ¶æ¯ï¼å¤çå®åè·åä¸ä¸æ¹ï¼æ¥å¹³è¡¡æ¶è´¹è½ååæ¶æ¯å 积é®é¢ã
# 讲ä¸ä¸rabbitMQ çå»¶è¿éååæ»ä¿¡æºå¶
å 说说延è¿éåï¼å®çæ ¸å¿å°±æ¯è®©æ¶æ¯ä¸æ¯ååºå»å°±è¢«æ¶è´¹ï¼èæ¯çæå®æ¶é´åæè®©æ¶è´¹è å¤çã

æ¯å¦çµåé订åå建å 30 åéæ²¡æ¯ä»è¦èªå¨åæ¶ï¼å°±ä¸ç¨æä¸ªå®æ¶ä»»å¡ä¸ç´æ¥æ°æ®åºï¼ç´æ¥ç¨å»¶è¿éåå°±è¡ãå ·ä½å°±æ¯ç产è åæ¶æ¯çæ¶åï¼ç»æ¶æ¯è®¾ç½®ä¸ä¸ªå»¶è¿æ¶é´ï¼è¿ä¸ªæ¶æ¯ä¼å å°ä¸ä¸ªä¸é¨çå»¶è¿äº¤æ¢æºï¼ä¸è¬æ¯ x-delayed-message ç±»åï¼ï¼äº¤æ¢æºä¸ä¼é©¬ä¸è½¬åï¼èæ¯çå¤äºè®¾ç½®çæ¶é´ï¼åææ¶æ¯è½¬å°çæ£çä¸å¡éåï¼æ¶è´¹è çå¬è¿ä¸ªä¸å¡éåï¼å°ç¹å°±æ¶å°æ¶æ¯æ§è¡åæ¶è®¢åçé»è¾ï¼ç¹å«çå¿ã
åçæ»ä¿¡æºå¶ï¼æ»ä¿¡å°±æ¯é£äºæ²¡æ³æ£å¸¸å¤ççæ¶æ¯ï¼ç¸å½äºç»è¿äº ãé®é¢æ¶æ¯ã æ¾ä¸ªå åºçå°æ¹ï¼ä¸è®©å®ä»¬ä¸ç´å å¨ä¸å¡éåéå èµæºã

é£ä»ä¹æ ·çæ¶æ¯ä¼åææ»ä¿¡å¢ï¼æ¯å¦æ¶è´¹è å¤çæ¶æ¯æ¶åºäºé®é¢ï¼æç¡®æç»æ¥æ¶èä¸ä¸è®©å®éæ°åå°åéåï¼æè æ¶æ¯å¨éåéæ¾å¤ªä¹ è¿æäºï¼éå设置äºåæ´»æ¶é´ï¼ï¼è¿æéåæ»¡äºï¼æ°æ¶æ¯è¿ä¸æ¥ï¼æèçé£äºæ¶æ¯å°±ä¼è¢«æ¤ææ»ä¿¡ãè¿æ¶åæä»¬ç»ä¸å¡éåæåé 置好æ»ä¿¡äº¤æ¢æºå对åºçæ»ä¿¡éåï¼ä¸æ¦ææ¶æ¯åææ»ä¿¡ï¼RabbitMQ å°±ä¼èªå¨æå®è½¬å°æ»ä¿¡éåéï¼ä¹åæä»¬å¯ä»¥ä¸é¨ç嬿»ä¿¡éåï¼è¦ä¹è®°å½æ¥å¿æ¾é®é¢ï¼è¦ä¹äººå·¥å¤çï¼æè 设置éè¯æºå¶ï¼ä¸ä¼è®©é®é¢æ¶æ¯ç³æ²å¤§æµ·ã
å®é 项ç®éè¿ä¿©ç»å¸¸ä¸èµ·ç¨ï¼æ¯å¦è®¢ååæ¶åºæ¯ï¼æä»¬å¯ä»¥ç»è®¢åéåé ç½®æ»ä¿¡äº¤æ¢æºåæ»ä¿¡éåï¼ç产è éè¿å»¶è¿éåç»æ¶æ¯è®¾ç½® 30 åéå»¶è¿ã妿 30 åéå ç¨æ·æ¯ä»äºï¼æ¶è´¹è å¤çæåå°±æ£å¸¸ç¡®è®¤ï¼è¦æ¯æ²¡æ¯ä»ï¼æ¶æ¯å¨è®¢åéåéè¿æå°±åææ»ä¿¡ï¼èªå¨è½¬å°æ»ä¿¡éåï¼æ»ä¿¡éåçæ¶è´¹è æ¶å°åå°±æ§è¡åæ¶è®¢åãéæ¾åºåçæä½ï¼åæ¶è®°å½æ¥å¿ï¼è¿æ ·æ¢å®ç°äºå»¶è¿å¤çï¼åä¿è¯äºå°±ç®ä¸é´åºé®é¢ï¼æ¶æ¯ä¹æå åºï¼æµç¨ä¸ä¼æã
ç®åæ»ç»ä¸ï¼å»¶è¿éå管 ãæ¶æ¯ä»ä¹æ¶åå¤çãï¼æ»ä¿¡æºå¶ç®¡ ãæ¶æ¯å¤ç失败æè¿æäºæä¹åãã
ææ°çå¾è§£æç« é½å¨å ¬ä¼å·é¦åï¼å«å¿è®°å ³æ³¨å¦ï¼ï¼å¦æä½ æ³å å ¥ç¾äººææ¯äº¤æµç¾¤ï¼æ«ç 䏿¹äºç»´ç åå¤ãå 群ãã

