diff --git a/ReadMe.md b/ReadMe.md
index 6aabce3..84572da 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -30,6 +30,8 @@
+
+
# Java基础
## 基础知识
@@ -394,6 +396,25 @@ todo
# 消�队列
## Kafka
+* [消�队列kafka详解:Kafka快速上手(Java版)](docs/mq/kafka/消�队列kafka详解:Kafka快速上手(Java版).md)
+* [消æ�¯é˜Ÿåˆ—kafka详解:Kafka一æ�¡æ¶ˆæ�¯å˜åˆ°broker的过程](docs/mq/kafka/消æ�¯é˜Ÿåˆ—kafka详解:Kafka一æ�¡æ¶ˆæ�¯å˜åˆ°broker的过程.md)
+* [消�队列kafka详解:消�队列kafka详解:Kafka介�](docs/mq/kafka/消�队列kafka详解:Kafka介�.md)
+* [消�队列kafka详解:Kafka原�分�总结篇](docs/mq/kafka/消�队列kafka详解:Kafka原�分�总结篇.md)
+* [消�队列kafka详解:Kafka常�命令��置总结](docs/mq/kafka/消�队列kafka详解:Kafka常�命令��置总结.md)
+* [消�队列kafka详解:Kafka架构介�](docs/mq/kafka/消�队列kafka详解:Kafka架构介�.md)
+* [消�队列kafka详解:Kafka的集群工作原�](docs/mq/kafka/消�队列kafka详解:Kafka的集群工作原�.md)
+* [消�队列kafka详解:Kafka��知识点+�试题大全](docs/mq/kafka/消�队列kafka详解:Kafka��知识点+�试题大全.md)
+* [消�队列kafka详解:如何实现延迟队列](docs/mq/kafka/消�队列kafka详解:如何实现延迟队列.md)
+* [消æ�¯é˜Ÿåˆ—kafka详解:如何实现æ»ä¿¡é˜Ÿåˆ—](docs/mq/kafka/消æ�¯é˜Ÿåˆ—kafka详解:如何实现æ»ä¿¡é˜Ÿåˆ—.md)
+
+## RocketMQ
+* [RocketMQ系列:事务消�(最终一致性)](docs/mq/RocketMQ/RocketMQ系列:事务消�(最终一致性).md)
+* [RocketMQ系列:基本概念](docs/mq/RocketMQ/RocketMQ系列:基本概念.md)
+* [RocketMQ系列:广æ’与延迟消æ�¯](docs/mq/RocketMQ/RocketMQ系列:广æ’与延迟消æ�¯.md)
+* [RocketMQ系列:批���与过滤](docs/mq/RocketMQ/RocketMQ系列:批���与过滤.md)
+* [RocketMQ系列:消�的生产与消费](docs/mq/RocketMQ/RocketMQ系列:消�的生产与消费.md)
+* [RocketMQ系列:环境æ�建](docs/mq/RocketMQ/RocketMQ系列:环境æ�建.md)
+* [RocketMQ系列:顺�消费](docs/mq/RocketMQ/RocketMQ系列:顺�消费.md)
# 大�端
* [�端技术�谈开篇:云计算,大数�与AI的故事](docs/backend/�端技术�谈开篇:云计算,大数�与AI的故事.md)
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConfig.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConfig.md"
index 67c9c5a..cb6a94c 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConfig.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConfig.md"
@@ -821,4 +821,13 @@ config:
4\. ʹÓÃä¯ÀÀÆ÷ÔٴηÃÎÊ¡°http://localhost:3366/getConfig¡±£¬½á¹ûÈçÏÂͼ¡£

-ͼ17£ºSpring Cloud Bus ¶¨µã֪ͨ
\ No newline at end of file
+ͼ17£ºSpring Cloud Bus ¶¨µã֪ͨ
+
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConsul.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConsul.md"
index 730cda5..85fcf19 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConsul.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConsul.md"
@@ -239,3 +239,10 @@ Spring Cloud Consul
# ÏîĿԴÂëµØÖ·
https://github.com/macrozheng/springcloud-learning
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudEureka.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudEureka.md"
index b1a2d68..960e5c7 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudEureka.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudEureka.md"
@@ -1041,4 +1041,12 @@ enable-self-preservation: false # false
ÔÚͼ 11 ÖÐ £¬Äú¿ÉÒÔ¿´µ½ÒÔÏÂÄÚÈÝ£º
* ÔÚ DS Replicas Ñ¡ÏîÉÏÃæ³öÏÖÁ˺ìÉ«¾¯¸æÐÅÏ¢¡°EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.¡±£¬³öÏÖ¸ÃÐÅÏ¢±íÃ÷ Eureka µÄ×ÔÎÒ±£»¤»úÖÆ´¦ÓÚ¿ªÆô״̬£¬ÇÒÒѾ±»´¥·¢¡£
-* micro-service-cloud-provider-dept-8001 µÄ·þÎñÐÅÏ¢ÒÀÈ»±£´æ Eureka Server ·þÎñ×¢²á±íÖУ¬²¢Î´±»ÒƳý¡£
\ No newline at end of file
+* micro-service-cloud-provider-dept-8001 µÄ·þÎñÐÅÏ¢ÒÀÈ»±£´æ Eureka Server ·þÎñ×¢²á±íÖУ¬²¢Î´±»ÒƳý¡£
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudGateway.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudGateway.md"
index 8b7ad04..e99968d 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudGateway.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudGateway.md"
@@ -496,9 +496,18 @@ eureka:
2\. ÖØÆô```micro-service-cloud-gateway-9527£¬Ê¹ÓÃä¯ÀÀÆ÷·ÃÎÊ¡°http://eureka7001.com:9527/dept/list¡±£¬ÎÒÃǻᷢÏÖ·ÃÎʱ¨ 406 ´íÎ󣬿ØÖÆÌ¨Êä³öÈçÏ¡£
```2021-10-21 16:25:39.450 INFO 19116 --- [ctor-http-nio-4] net.biancheng.c.filter.MyGlobalFilter : Thu Oct 21 16:25:39 CST 2021½øÈë×Ô¶¨ÒåµÄÈ«¾Ö¹ýÂËÆ÷ MyGlobalFilter
-2021-10-21 16:25:39.451 INFO 19116 --- [ctor-http-nio-4] net.biancheng.c.filter.MyGlobalFilter : ²ÎÊý uname ²»ÄÜΪ null£¡```
+2021-10-21 16:25:39.451 INFO 19116 --- [ctor-http-nio-4] net.biancheng.c.filter.MyGlobalFilter : ²ÎÊý uname ²»ÄÜΪ null£¡
+```
3\. ʹÓÃä¯ÀÀÆ÷·ÃÎÊ¡°http://eureka7001.com:9527/dept/list?uname=123¡±,½á¹ûÈçÏÂͼ¡£

-ͼ7£º×Ô¶¨ÒåÈ«¾ÖÍø¹Ø¹ýÂËÆ÷
\ No newline at end of file
+ͼ7£º×Ô¶¨ÒåÈ«¾ÖÍø¹Ø¹ýÂËÆ÷
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudHystrix.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudHystrix.md"
index adddc7d..1a26d68 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudHystrix.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudHystrix.md"
@@ -1109,4 +1109,12 @@ public class HystrixDashboardConfig {
8\. ʹÓÃä¯ÀÀÆ÷¶à´Î·ÃÎÊ¡°http://eureka7001.com:8004/dept/hystrix/circuit/1¡±ºÍ ¡°http://eureka7001.com:8004/dept/hystrix/circuit/-1¡±£¬²é¿´ Hystrix ¼à¿ØÒ³Ã棬ÈçÏÂͼ¡£

-ͼ16£ºHystrix ¼à¿Ø·þÎñÔËÐÐÇé¿ö
\ No newline at end of file
+ͼ16£ºHystrix ¼à¿Ø·þÎñÔËÐÐÇé¿ö
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudLoadBalancer.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudLoadBalancer.md"
index 9289412..1a35579 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudLoadBalancer.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudLoadBalancer.md"
@@ -336,3 +336,11 @@ LoadBalancerΪ
# ÏîĿԴÂëµØÖ·
https://github.com/macrozheng/springcloud-learning/tree/master/nacos-loadbalancer-service
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudOpenFeign.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudOpenFeign.md"
index d2e6a26..50c14d5 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudOpenFeign.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudOpenFeign.md"
@@ -479,4 +479,11 @@ Logger.Level
2021-10-12 14:33:07.983 DEBUG 13388 --- [p-nio-80-exec-2] n.biancheng.c.service.DeptFeignService : [DeptFeignService#list]
2021-10-12 14:33:07.991 DEBUG 13388 --- [p-nio-80-exec-2] n.biancheng.c.service.DeptFeignService : [DeptFeignService#list] [{"deptNo":1,"deptName":"¿ª·¢²¿","dbSource":"bianchengbang_jdbc"},{"deptNo":2,"deptName":"ÈËʲ¿","dbSource":"bianchengbang_jdbc"},{"deptNo":3,"deptName":"²ÆÎñ²¿","dbSource":"bianchengbang_jdbc"},{"deptNo":4,"deptName":"Êг¡²¿","dbSource":"bianchengbang_jdbc"},{"deptNo":5,"deptName":"ÔËά²¿","dbSource":"bianchengbang_jdbc"}]
2021-10-12 14:33:07.991 DEBUG 13388 --- [p-nio-80-exec-2] n.biancheng.c.service.DeptFeignService : [DeptFeignService#list] <--- END HTTP (341-byte body)```
-```
\ No newline at end of file
+```
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudRibbon.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudRibbon.md"
index 7d3f979..74eff0a 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudRibbon.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudRibbon.md"
@@ -654,4 +654,12 @@ public class MicroServiceCloudConsumerDept80Application {

ͼ6£º¶¨ÖƸºÔؾùºâ²ßÂÔ
-ͨ¹ýͼ 6 ÖÐ dbSource ×Ö¶ÎȡֵµÄ±ä»¯¿ÉÒÔ¿´³ö£¬ÎÒÃǶ¨ÖƵĸºÔؾùºâ²ßÂÔÒѾÉúЧ¡£
\ No newline at end of file
+ͨ¹ýͼ 6 ÖÐ dbSource ×Ö¶ÎȡֵµÄ±ä»¯¿ÉÒÔ¿´³ö£¬ÎÒÃǶ¨ÖƵĸºÔؾùºâ²ßÂÔÒѾÉúЧ¡£
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudSleuth.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudSleuth.md"
index e3f2000..45bc82f 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudSleuth.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudSleuth.md"
@@ -131,4 +131,12 @@ springcloud-learning
## [#](https://www.macrozheng.com/cloud/sleuth.html#%E9%A1%B9%E7%9B%AE%E6%BA%90%E7%A0%81%E5%9C%B0%E5%9D%80)ÏîĿԴÂëµØÖ·
-[https://github.com/macrozheng/springcloud-learning](https://github.com/macrozheng/springcloud-learning)
\ No newline at end of file
+[https://github.com/macrozheng/springcloud-learning](https://github.com/macrozheng/springcloud-learning)
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudZuul.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudZuul.md"
index 7bca86e..9040110 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudZuul.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudZuul.md"
@@ -384,3 +384,9 @@ Zuul
#ÏîĿԴÂëµØÖ·
https://github.com/macrozheng/springcloud-learning
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloud\346\246\202\350\277\260.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloud\346\246\202\350\277\260.md"
index fb27ab5..a525595 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloud\346\246\202\350\277\260.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloud\346\246\202\350\277\260.md"
@@ -134,4 +134,10 @@ Spring Boot
¡¡
}
-````
\ No newline at end of file
+````
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\346\263\250\345\206\214.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\346\263\250\345\206\214.md"
index 3569058..1a59865 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\346\263\250\345\206\214.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\346\263\250\345\206\214.md"
@@ -346,4 +346,12 @@ task
Ò²¾ÍÊÇÔÚ¶ÔÏó³õʼ»¯µÄʱºò¾Í½øÐÐÆô¶¯Ò»¸öÏ̳߳أ¬È¥ÔËÐÐnotifier¶ÔÓ¦µÄ·½·¨¡£Õâ¸örun·½·¨¾ÍÊÇÕâÑùrunµÄ¡£Æô¶¯ºó¾Í»áʵʱ¼àÌýÒì²½¶ÓÁС£ÕâÑùдµÄºÃ´¦£¬¾ÍÊǽ«Ð´ºÍ´¦ÀíÍêÈ«¸ôÀëÁË¡£Í¨¹ý¼àÌý¸ßÐÔÄܵÄÄÚ´æ¶ÓÁУ¬À´´¦ÀíÕâ¸öÊÂÇ飬ËûÕâÑùµÄºÃ´¦£¬1¡¢Ìá¸ßÐÔÄÜ
-
\ No newline at end of file
+
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\246\202\350\247\210.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\246\202\350\247\210.md"
index 0bc283c..dc517a0 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\246\202\350\247\210.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\246\202\350\247\210.md"
@@ -491,4 +491,11 @@ NACOS
µ±È»£¬Ò²»á´æÔÚһЩ²»¿ÉºöÊÓµÄȱµã£¬±ÈÈ磬עÊ͹ýÉÙ£¬´úÂ뻹ÓкܴóµÄÖØ¹¹¿Õ¼ä£¬tenantºÍnamespaceÁ½¸ö¸ÅÄî»ìÏýʹÓá£
-¹ØÓÚSpring Cloud Alibaba NacosµÄ½éÉܵ½´Ë¾Í½áÊøÁË£¬Ï£Íû¶ÔÄãÓÐËù°ïÖú¡£
\ No newline at end of file
+¹ØÓÚSpring Cloud Alibaba NacosµÄ½éÉܵ½´Ë¾Í½áÊøÁË£¬Ï£Íû¶ÔÄãÓÐËù°ïÖú¡£
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\351\205\215\347\275\256\344\270\255\345\277\203.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\351\205\215\347\275\256\344\270\255\345\277\203.md"
index 2ed31c8..7515d8b 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\351\205\215\347\275\256\344\270\255\345\277\203.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\351\205\215\347\275\256\344\270\255\345\277\203.md"
@@ -256,4 +256,11 @@ public class ConfigServerDemo {
×÷ÕߣºÕþ²ÉÔÆµç×ÓÂô³¡ÍŶÓ
Á´½Ó£ºhttps://juejin.cn/post/6999814668390760484
À´Ô´£ºÏ¡ÍÁ¾ò½ð
-Öø×÷Ȩ¹é×÷ÕßËùÓС£ÉÌÒµ×ªÔØÇëÁªÏµ×÷Õß»ñµÃÊÚȨ£¬·ÇÉÌÒµ×ªÔØÇë×¢Ã÷³ö´¦¡£
\ No newline at end of file
+Öø×÷Ȩ¹é×÷ÕßËùÓС£ÉÌÒµ×ªÔØÇëÁªÏµ×÷Õß»ñµÃÊÚȨ£¬·ÇÉÌÒµ×ªÔØÇë×¢Ã÷³ö´¦¡£
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudRocketMQ\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudRocketMQ\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 35fcfef..9be0e22 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudRocketMQ\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudRocketMQ\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -524,4 +524,11 @@ public synchronized void start() throws MQClientException {
×÷Õߣº·ãÒ¶ºì»¨
Á´½Ó£ºhttps://www.jianshu.com/p/8dd4cfeae39d
À´Ô´£º¼òÊé
-Öø×÷Ȩ¹é×÷ÕßËùÓС£ÉÌÒµ×ªÔØÇëÁªÏµ×÷Õß»ñµÃÊÚȨ£¬·ÇÉÌÒµ×ªÔØÇë×¢Ã÷³ö´¦¡£
\ No newline at end of file
+Öø×÷Ȩ¹é×÷ÕßËùÓС£ÉÌÒµ×ªÔØÇëÁªÏµ×÷Õß»ñµÃÊÚȨ£¬·ÇÉÌÒµ×ªÔØÇë×¢Ã÷³ö´¦¡£
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudSeata\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudSeata\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 1287eef..19ce963 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudSeata\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudSeata\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -994,4 +994,12 @@ public BranchStatus branchRollback(BranchType branchType, String xid, long branc
-×îÖջعö·½·¨µ÷ÓõÄÊÇUndoLogManager.undo(dataSourceProxy, xid, branchId);ÅжÏundologÊÇ·ñ´æÔÚ£¬´æÔÚÔòɾ³ý¶ÔÓ¦undolog£¬²¢Ò»ÆðÌá½»£¬µ½´ËseataµÄATģʽԴÂë½âÎöÍê±Ï¡£
\ No newline at end of file
+×îÖջعö·½·¨µ÷ÓõÄÊÇUndoLogManager.undo(dataSourceProxy, xid, branchId);ÅжÏundologÊÇ·ñ´æÔÚ£¬´æÔÚÔòɾ³ý¶ÔÓ¦undolog£¬²¢Ò»ÆðÌá½»£¬µ½´ËseataµÄATģʽԴÂë½âÎöÍê±Ï¡£
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudSentinel\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudSentinel\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 0d6c22c..9fc4976 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudSentinel\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudSentinel\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -650,3 +650,10 @@ public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudConfig\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudConfig\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 60d1f61..4ae8cc8 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudConfig\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudConfig\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -1038,4 +1038,12 @@ if (!remoteProperties.isAllowOverride() || (!remoteProperties.isOverrideNone()
×÷ÕߣºÓµ±§¹Â¶À_to
Á´½Ó£ºhttps://www.jianshu.com/p/60c6ab0e79d5
À´Ô´£º¼òÊé
-Öø×÷Ȩ¹é×÷ÕßËùÓС£ÉÌÒµ×ªÔØÇëÁªÏµ×÷Õß»ñµÃÊÚȨ£¬·ÇÉÌÒµ×ªÔØÇë×¢Ã÷³ö´¦¡£
\ No newline at end of file
+Öø×÷Ȩ¹é×÷ÕßËùÓС£ÉÌÒµ×ªÔØÇëÁªÏµ×÷Õß»ñµÃÊÚȨ£¬·ÇÉÌÒµ×ªÔØÇë×¢Ã÷³ö´¦¡£
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudEureka\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudEureka\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 8ad8c31..0236a13 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudEureka\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudEureka\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -1773,4 +1773,12 @@ Value getValue(final Key key, boolean useReadOnlyCache) {
}
return payload;
}
-```
\ No newline at end of file
+```
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudGateway\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudGateway\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 9a6c22c..80db850 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudGateway\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudGateway\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -404,4 +404,12 @@ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 6\. Ö´ÐйýÂËÆ÷Á´ÖÐµÄÆäËû¹ýÂËÇëÇó
return chain.filter(exchange);
}
-```
\ No newline at end of file
+```
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudHystrix\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudHystrix\346\272\220\347\240\201\345\210\206\346\236\220.md"
index c9323b5..87b59fb 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudHystrix\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudHystrix\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -1183,5 +1183,10 @@ circuitBreaker.allowRequest()
×îÖÕµ÷Óõ½ÎÒÃÇ×Ô¼ºµÄÒµÎñÂß¼¡£
-
-ÏÂÃæ×ܽáÒ»ÏÂÎÒÃÇÕûÌåµÄÒµÎñÂ߼ͼ£º
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudLoadBalancer\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudLoadBalancer\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 9704860..f66f6ba 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudLoadBalancer\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudLoadBalancer\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -659,4 +659,12 @@ public class CustomLoadBalancerConfiguration {

-
\ No newline at end of file
+
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudOpenFeign\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudOpenFeign\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 7a54f90..17db744 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudOpenFeign\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudOpenFeign\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -893,3 +893,10 @@ Response convertResponse(HttpURLConnection connection, Request request) throws I
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudRibbon\346\272\220\347\240\201\345\210\206\346\236\220.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudRibbon\346\272\220\347\240\201\345\210\206\346\236\220.md"
index 57606b3..d06f945 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudRibbon\346\272\220\347\240\201\345\210\206\346\236\220.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudRibbon\346\272\220\347\240\201\345\210\206\346\236\220.md"
@@ -944,4 +944,12 @@ public interface ServerList {
getInitialListOfServersÊÇ»ñÈ¡³õʼ»¯µÄ·þÎñÁÐ±í¡£
getUpdatedListOfServersÊÇ»ñÈ¡¸üеķþÎñÁÐ±í¡£
ServerListÓжà¸öʵÏÖÀ࣬¾ßÌåÓõÄÄĸöÄØ£¬¿ÉÒÔÔÚ
-EurekaRibbonClientConfigurationÀàÖÐÕÒµ½£¬ÕâÊÇRibbonºÍEureka½áºÏµÄ×Ô¶¯ÅäÖÃÀ࣬µ«ÊÇĿǰÎÒÃÇûÓÐÕûºÏEureka£¬ÊÇͨ¹ýÅäÖÃÎļþÅäÖã¬ËùÒÔ»á×ßConfigurationBasedServerListÀà¡£
\ No newline at end of file
+EurekaRibbonClientConfigurationÀàÖÐÕÒµ½£¬ÕâÊÇRibbonºÍEureka½áºÏµÄ×Ô¶¯ÅäÖÃÀ࣬µ«ÊÇĿǰÎÒÃÇûÓÐÕûºÏEureka£¬ÊÇͨ¹ýÅäÖÃÎļþÅäÖã¬ËùÒÔ»á×ßConfigurationBasedServerListÀà¡£
+
+# ²Î¿¼ÎÄÕÂ
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git a/docs/monitor/Spring Actuator.md b/docs/monitor/Spring Actuator.md
new file mode 100644
index 0000000..a1ee5ef
--- /dev/null
+++ b/docs/monitor/Spring Actuator.md
@@ -0,0 +1,578 @@
+## ǰÑÔ
+
+ÔÚ΢·þÎñϵͳ¼Ü¹¹ÖУ¬·þÎñµÄ¼à¿ØÊDZز»¿ÉÉٵġ£Ä¿Ç°´ó¶àÊý΢·þÎñÓ¦ÓÃÓÖÊÇ»ùÓÚSpring CloudϵÁУ¬Ò²¿ÉÒÔ˵ÊÇ»ùÓÚSpring BootϵÁеġ£´ËʱʹÓÃSpring Boot ActuatorÀ´½øÐÐ΢·þÎñµÄ¼à¿Ø£¬²»½ö¹¦ÄÜÈ«Ãæ£¬¶øÇҷdz£·½±ã¡£
+
+ÔÚÉÏÆªÎÄÕ¡¶[Spring Boot Actuator¼¯³É£¬ÄѵÄÊÇÁé»îÔËÓã¡](https://link.juejin.cn?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FBaNQWygQb8UXxktrXetOcw "https://mp.weixin.qq.com/s/BaNQWygQb8UXxktrXetOcw")¡·ÖÐÎÒÃÇÒѾ½éÉÜÁËÈçºÎ½«Actuator¼¯³Éµ½Spring BootÏîÄ¿ÖУ¬²¢ÇÒ½éÉÜÁËÈçºÎ×Ô¶¨ÒåEndpoint£¨¶Ëµã£©¡£ÓÐÅóÓÑÁôÑÔ˵²»¹»ÉîÈ룬ÄÇô£¬±¾ÆªÎÄÕÂÄØ£¬ÎÒÃǽ«½éÉÜActuatorÔÉú¶ËµãµÄ¹¦Äܼ°»ù±¾Ê¹Óó¡¾°¡£
+
+## Endpoints ½éÉÜ
+
+ActuatorÖÐËùνµÄ Endpoints £¨·ÒëΪ¶Ëµã£©ÌṩÁËÍⲿÀ´ÓëÓ¦ÓóÌÐò½øÐзÃÎʺͽ»»¥µÄ¹¦ÄÜ¡£ ±ÈÈç˵/health¶ËµãÌṩÁËÓ¦Óý¡¿µÇé¿öµÄÐÅÏ¢£¬metrics ¶ËµãÌṩÁËÓ¦ÓóÌÐòµÄÖ¸±ê£¨JVM ÄÚ´æÊ¹Óá¢ÏµÍ³CPUʹÓõȣ©ÐÅÏ¢¡£
+
+ActuatorÔÉúµÄ¶Ëµã¿É·ÖΪÈý´óÀࣺ
+
+* Ó¦ÓÃÅäÖÃÀࣺ»ñȡӦÓóÌÐòÖмÓÔØµÄÓ¦ÓÃÅäÖᢻ·¾³±äÁ¿¡¢×Ô¶¯»¯ÅäÖñ¨¸æµÈÓëSpring BootÓ¦ÓÃÃÜÇÐÏà¹ØµÄÅäÖÃÀàÐÅÏ¢¡£
+* ¶ÈÁ¿Ö¸±êÀࣺ»ñȡӦÓóÌÐòÔËÐйý³ÌÖÐÓÃÓÚ¼à¿ØµÄ¶ÈÁ¿Ö¸±ê£¬±ÈÈ磺ÄÚ´æÐÅÏ¢¡¢Ï̳߳ØÐÅÏ¢¡¢HTTPÇëÇóͳ¼ÆµÈ¡£
+* ²Ù×÷¿ØÖÆÀࣺÌṩÁ˶ÔÓ¦ÓõĹرյȲÙ×÷À๦ÄÜ¡£
+
+²»Í¬°æ±¾µÄActuatorÌṩµÄÔÉú¶ËµãÓÐËù³öÈ룬ÔÚʹÓõĹý³ÌÖÐ×îºÃÒÔËùʹÓð汾µÄ¹Ù·½ÎĵµÎª×¼¡£Í¬Ê±£¬Ã¿¸öÔÉúµÄ¶Ëµã¶¼¿ÉÒÔͨ¹ýÅäÖÃÀ´µ¥¶ÀµÄ½ûÓûòÆôÓá£
+
+¶øÔÚActuator 2.x ÖÐĬÈ϶˵ãÔö¼ÓÁË/actuatorǰ׺£¬Í¬Ê±Ä¬ÈÏÖ»±©Â¶µÄÁ½¸ö¶ËµãΪ/actuator/healthºÍ /actuator/info¡£¹ØÓڶ˵㱩¶µÄÅäÖ㬿ɲο¼Ç°Ò»ÆªÎÄÕ¡£ÏÂÃæ»ùÓÚSpring Boot 2.2.2.RELEASE°æ±¾À´Öص㽲½âÿ¸ö¶ËµãµÄ¹¦ÄܺÍÓ¦Óó¡¾°¡£
+
+## actuator¶Ëµã
+
+Actuator 2.xÐÂÔöµÄĬÈ϶˵㣬ÓÃÓÚչʾĿǰӦÓÃÖб©Â¶³öÀ´µÄ¶Ëµã»ã×Ü£¬Äã¿ÉÒÔÀí½âΪ¿ÉÓö˵ãµÄĿ¼¡£
+
+·ÃÎÊURL£º[http://localhost:8080/actuator](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator "http://localhost:8080/actuator") £¬¶ÔӦչʾ½á¹ûÈçÏÂͼ£º
+
+
+
+ÉÏÊöֻչʾÁËÒ»²¿·ÖµÄ¶Ëµã£¬·µ»Ø½á¹ûΪ£¬ÕâÀï²ÉÓÃÁËä¯ÀÀÆ÷µÄ²å¼þ-Handler½øÐÐÁ˸ñʽÃÀ»¯¡£Í¨¹ýactuator¿ÉÒÔÖ±¹ÛµÄ¿´³öĿǰ¿ª·ÅÁËÄÄЩ¶Ëµã£¬ÒÔ¼°ÕâЩ¶ËµãµÄÃû³ÆºÍÇëÇó·¾¶¡£
+
+ÏÂÃæÎÒÃǾͰ´ÕÕÏÔʾactuator¶ËµãչʾµÄÁбíÖðÒ»½éÉÜ¡£
+
+## auditevents¶Ëµã
+
+auditevents¶ËµãÓÃÓÚÏÔʾӦÓñ©Â¶µÄÉó¼ÆÊ¼þ (±ÈÈçÈÏÖ¤½øÈë¡¢¶©µ¥Ê§°Ü)£¬¼´Ê¹ÎÒÃÇ´ò¿ªÁËËùÓж˵㣬ĬÈÏÇé¿öÏÂÒ²ÊÇ¿´²»µ½Õâ¸ö¶ËµãµÄ¡£ÒòΪʹÓÃËüµÄǰÌáÊÇÐèÒªÔÚSpringÈÝÆ÷ÖдæÔÚÒ»¸öÀàÐÍΪAuditEventRepositoryµÄBeanµÄ¡£
+
+²é¿´ÁËÍøÂçÉÏ´ó¶àÊý½Ì³Ì£¬»ù±¾É϶¼ÊǽéÉÜÁËauditevents¶Ëµã¹¦ÄÜ£¬¶øÎ´Õ¹Ê¾¾ßÌåʵÀý¡£±ÊÕß¾¹ý¶à·½³¢ÊÔ£¬ÖÕÓÚ¸ø´ó¼ÒдÁËÒ»¸ö°¸Àý³öÀ´¡£
+
+Ê×ÏÈÉæ¼°µ½È¨ÏÞÈÏÖ¤£¬ÐèÒªÏÈÒýÈëspring-boot-starter-securityÒÀÀµ£º
+
+````
+
+ org.springframework.boot
+ spring-boot-starter-security
+ `
+````
+
+µ¥´¿Ìí¼ÓÕâ¸öÒÀÀµ»¹ÊDz»¹»µÄ£¬»¹ÐèÒª¼ÓÈësecurityµÄÅäÖ㬲»È»AuthorizationAuditListener,AuthenticationAuditListener ¼àÌýʲôʼþÄØ? Òò´Ë,ÎÒÃǼÓÈëÈçÏ´úÂ룺
+
+
+````
+@Configuration
+public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+
+ auth.inMemoryAuthentication()
+ .withUser("admin")
+ .password(bcryptPasswordEncoder().encode("admin"))
+ .roles("admin");
+ }
+````
+
+````
+ @Bean
+ public PasswordEncoder bcryptPasswordEncoder() {
+ return new BCryptPasswordEncoder();
+ }
+}
+````
+
+ÕâÀï²ÉÓÃÁËsecurityĬÈϵĵǼ½çÃæºÍȨÏÞ¿ØÖÆ£¬Ò²¾ÍÊÇ˵ËùÓеķÃÎʶ¼ÐèÒª½øÐеǼ¡£¶øµÇ¼µÄÓû§ÃûºÍÃÜÂë¾ùΪadmin¡£
+
+ÁíÍâ£¬Ç°ÃæÌáµ½ÐèÒªÓõ½AuditEventRepositoryµÄBean£¬ÕâÀï³õʼ»¯Ò»¸ö¶ÔÓ¦µÄBean£º
+
+
+
+
+````
+@Configuration
+public class AuditEventConfig {
+
+ @Bean
+ public InMemoryAuditEventRepository repository(){
+ return new InMemoryAuditEventRepository();
+ }
+}
+````
+
+InMemoryAuditEventRepositoryÊÇAuditEventRepository½Ó¿ÚµÄΨһʵÏÖÀà¡£
+
+ÖØÆôÏîÄ¿£¬auditevents¶Ëµã±ã¿ÉÓÃÁË¡£·ÃÎÊ[http://localhost:8080/actuator](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator "http://localhost:8080/actuator") ,´Ëʱ»áÌø×ªµ½SecurityÌṩµÄµÇÂ¼Ò³Ãæ£º
+
+
+
+ÊäÈë´úÂëÖÐÖ¸¶¨µÄÓû§ÃûºÍÃÜÂ룬µÇ¼³É¹¦£¬Ìø×ªµ½/actuatorÒ³Ãæ£º
+
+
+
+¿ÉÒÔ¿´µ½auditevents¶ËµãÒѾ³É¹¦ÏÔʾ³öÀ´ÁË¡£Ð¿ªÒ³Ãæ·ÃÎÊ[http://localhost:8080/actuator/auditevents](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fauditevents "http://localhost:8080/actuator/auditevents") £¬Õ¹Ê¾ÄÚÈÝÈçÏ£º
+
+
+
+¿ÉÒÔ¿´µ½ÒѾ¼Ç¼ÏÂÁËȨÏÞÏà¹ØµÄʼþ£¬ÆäÖеÚÒ»´ÎʼþÊÇÎÒÃÇÖ±½Ó·ÃÎÊactuator¶Ëµãʱ£¬ÓÉÓÚ֮ǰΪ×öȨÏÞÈÏÕæ£¬ËùÒÔʼþÀàÐÍΪ"AUTHORIZATION_FAILURE"£¬Ò²¾ÍÊÇÈÏ֤ʧ°Ü¡£´ËÊ±Ìø×ªµ½µÇÂ¼Ò³Ãæ£¬È»ºóÔÚµÇÂ¼Ò³ÃæÊäÈëÓû§ÃûºÍÃÜÂ룬µÇ¼³É¹¦£¬¶ÔÓ¦µÄʼþΪ"AUTHENTICATION_SUCCESS"¡£
+
+Ò²¾ÍÊÇ˵auditevents¼Ç¼ÁËÓû§ÈÏÖ¤µÇ¼ϵͳÏà¹ØµÄʼþÐÅÏ¢£¬°üÀ¨Ê±¼ä´Á¡¢ÈÏÖ¤Óû§¡¢Ê¼þÀàÐÍ¡¢·ÃÎʵØÖ·¡¢sessionIdµÈ¡£
+
+ʾÀýÔ´ÂëµØÖ·£º[github.com/secbr/sprin¡](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fsecbr%2Fspringboot-all%2Ftree%2Fmaster%2Fspringboot-actuator-auditevents "https://github.com/secbr/springboot-all/tree/master/springboot-actuator-auditevents") ¡£
+
+## beans¶Ëµã
+
+/beans¶Ëµã»á·µ»ØSpringÈÝÆ÷ÖÐËùÓÐbeanµÄ±ðÃû¡¢ÀàÐÍ¡¢ÊÇ·ñµ¥Àý¡¢ÒÀÀµµÈÐÅÏ¢¡£
+
+·ÃÎÊ·¾¶Îª[http://localhost:8080/actuator/beans](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fbeans "http://localhost:8080/actuator/beans") £¬·¶Î§½á¹ûÈçÏ£º
+
+
+
+Õâ¸ö¶Ëµã»áչʾĿǰSpringÈÝÆ÷Öгõʼ»¯µÄËùÓÐBean£¬ÊÔÏëһϣ¬Èç¹ûÄãÅäÖÃÁËÒ»¸öBean£¬µ«²»È·¶¨ÊÇ·ñ³É¹¦ÊµÀý»¯£¬ÊDz»ÊǾͿÉÒÔͨ¹ýÕâ¸ö¶Ë¿Ú²éѯһÏÂÄØ£¿
+
+ÎÒÃÇÔÚÏîÄ¿Öж¨ÒåÒ»¸öTestController£¬²¢×¢ÈëÒ»¸öUserService£º
+
+
+````
+@Controller
+public class TestController {
+
+ @Resource
+ private UserService userService;
+}
+````
+
+ÖØÐÂÆô¶¯²¢·ÃÎʸö˵㣬»á¿´µ½ÈçÏÂÐÅÏ¢£º
+
+
+
+¿ÉÒÔ¿´µ½TestController±»ÊµÀý»¯ÁË£¬¶øÇÒÒÀÀµÓÚUserService¡£
+
+## caches¶Ëµã
+
+caches¶ËµãÖ÷ÒªÓÃÓÚ±©Â¶Ó¦ÓóÌÐòÖеĻº³å¡£ÕâÀïÒÔSpring BootÌṩµÄCache×é¼þÀ´Õ¹Ê¾Ò»ÏÂʵÀý¡£
+
+ÔÚÏîÄ¿Öм¯³Éspring-boot-starter-cache£¬ÒýÈëÒÀÀµ£º
+
+
+````
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+````
+
+È»ºóÔÚÆô¶¯ÀàÉÏÌí¼Ó@EnableCaching£¬¿ªÆô»º´æ¹¦ÄÜ¡£
+
+¶¨ÒåÒ»¸öCacheController£¬¶ÔÆä·½·¨queryAllʹÓûº´æ»úÖÆ£º
+
+
+````
+@RestController
+public class CacheController {
+
+ @RequestMapping("/queryAll")
+ @Cacheable(value = "queryAll")
+ public Map queryAll() {
+ Map map = new HashMap<>();
+ map.put("1", "Tom");
+ map.put("2", "Steven");
+ return map;
+ }
+}
+````
+
+ÕâÀïʹÓÃ@Cacheable×¢½âÀ´ÊµÏÖ»º´æ¹¦ÄÜ£¬»º´æµÄkeyΪqueryAll¡£´Ëʱ£¬·ÃÎÊ[http://localhost:8080/actuator/caches](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fcaches "http://localhost:8080/actuator/caches") £¬»áչʾ»º´æµÄ¸ùÄÚÈÝ£¬µ«ÀïÃæ²¢Ã»Óлº´æ¡£
+
+·ÃÎÊÒ»ÏÂ[http://localhost:8080/queryAll](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2FqueryAll "http://localhost:8080/queryAll") £¬Ò²¾ÍÊÇ´¥·¢Ò»Ï»º´æÄÚÈݵÄÉú³É¡£´ËʱÔÙ·ÃÎÊÉÏÃæµÄÁ´½Ó£¬±ã¿ÉÒÔ¿´µ½Ó¦ÓóÌÐòÖеĻº´æÐÅÏ¢ÁË£º
+
+
+
+¿ÉÒÔ¿´µ½£¬·µ»ØµÄÄÚÈݲ»½öչʾÁËÓ¦ÓóÌÐòµÄ»º´æ¹ÜÀíÆ÷£¬Í¬Ê±Ò²Õ¹Ê¾ÁË»º´æµÄKeyºÍ»º´æÊý¾Ý´æ´¢ÀàÐÍÐÅÏ¢¡£
+
+## caches-cache¶Ëµã
+
+caches-cache¶ËµãÊǶÔÉÏÃæcaches¶ËµãµÄÀ©Õ¹£¬caches¶ËµãչʾµÄËùÓеĻº´æÐÅÏ¢¡£Èç¹ûÏëÖ±½Ó¿´³ö¾ßÌåµÄÒ»¸ö»º´æÐÅÏ¢£¬Ôò¿ÉÒÔʹÓÃcaches-cache¶Ëµã¡£
+
+·ÃÎʵÄURLΪ£º[http://localhost:8080/actuator/caches/{cache}](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fcaches%2F%257Bcache%257D "http://localhost:8080/actuator/caches/%7Bcache%7D") £¬ÆäÖдóÀ¨ºÅÄÚµÄÖµ¿ÉÒÔÌæ»»Îª»º´æµÄkey¡£
+
+
+
+
+`http://localhost:8080/actuator/caches/queryAll`
+
+½«ÉÏÃæµÄռλ·û»»³ÉqueryAll£¨»º´æµÄkey£©£¬Ö´Ðнá¹ûÈçÏ£º
+
+
+
+¿ÉÒÔ¿´³ö£¬Ö»²éѯ³ýÁËÖ¸¶¨µÄ»º´æÐÅÏ¢£¬°üÀ¨»º´æ¹ÜÀíÆ÷¡¢»º´æÃû³Æ£¨key£©£¬»º´æµÄ´æ´¢ÀàÐÍ¡£
+
+## health¶Ëµã
+
+health¶ËµãÓÃÀ´¼ì²éÓ¦ÓõÄÔËÐÐ״̬£¬×î¸ßƵʹÓõÄÒ»¸ö¶Ëµã¡£¼ì²éÓ¦ÓÃʵÀýµÄÔËÐÐ״̬ÒÔ¼°Ó¦Óò»¡±½¡¿µ¡°µÄÔÒò£¬±ÈÈçÊý¾Ý¿âÁ¬½Ó¡¢´ÅÅ̿ռ䲻¹»µÈ¡£
+
+·ÃÎʵØÖ·£º[http://localhost:8080/actuator/health](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fhealth "http://localhost:8080/actuator/health")
+
+չʾ½á¹û£º
+
+`{
+"status": "UP"
+}`
+
+ÉÏÃæµÄʵÀý¹ýÓÚ¼òµ¥£¬ÔÚÏîÄ¿ÖаÑÊý¾Ý¿â¸ø¼¯³É½øÈ¥£º
+
+`
+
+````
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ mysql
+ mysql-connector-java
+ `
+````
+
+È»ºóÔÚapplicationÅäÖÃÎļþÖнøÐÐÅäÖãº
+
+
+
+```
+spring:
+ datasource:
+ url: jdbc:mysql://xxx:3333/xxx?characterEncoding=utf8&serverTimezone=Asia/Shanghai
+ username: root
+ password: root
+ driver-class-name: com.mysql.cj.jdbc.Driver
+```
+
+ͬʱ£¬ÎÒÃÇÒªÔÚapplicationÅäÖÃÎļþÖÐÅäÖÃÒ»ÏÂmanagement.endpoint.health.show-detailsµÄÖµ¡£¸ÃÊôÐÔÓÐÈý¸ö¿ÉÑ¡Ï
+
+* never £º²»Õ¹Ê¾ÏêϸÐÅÏ¢£¬up »òÕß down µÄ״̬£¬Ä¬ÈÏÅäÖã»
+* when-authorized£ºÏêϸÐÅÏ¢½«»áչʾ¸øÍ¨¹ýÈÏÖ¤µÄÓû§¡£ÊÚȨµÄ½ÇÉ«¿ÉÒÔͨ¹ýmanagement.endpoint.health.roles ÅäÖã»
+* always£º¶ÔËùÓÐÓû§±©Â¶ÏêϸÐÅÏ¢¡£
+
+ĬÈÏÖµÊÇnever£¬ËùÒÔÎÒÃÇÖ±½Ó·ÃÎÊ¿´µ½µÄÖ»ÓÐUP»òDOWN¡£ÏÖÔÚ¼¯³ÉÁËÊý¾Ý¿â£¬Í¬Ê±°Ñ¸ÃÏîÖµÅäÖÃΪalways£¬¿´Ò»ÏÂÏêÇ飺
+
+
+
+¿ÉÒÔ¿´µ½ÕûÌå״̬ΪUP£¬ÆäÖÐÏÂÃæµÄÈý¸ö×é¼þ¾ùΪUP£¬¶øÊý¾Ý¿âÊÇMYSQL£¬¼ì²éÊý¾Ý¿âµÄÓï¾äΪ¡°SELECT 1¡±¡£Í¬Ê±£¬»¹Õ¹Ê¾ÁË´ÅÅÌÐÅÏ¢ºÍpingµÄ״̬¡£
+
+ÏÖÔÚÎÒÃǰÑÊý¾Ý¿âµÄÓû§ÃûºÍÃÜÂë¹ÊÒâ¸Ä´í£¬ÖØÆô·ÃÎʿɵãº
+
+
+
+״̬ΪDOWN£¬×é¼þÖÐdb³öÏÖÁËÎÊÌ⣬״̬ΪDOWN¡£ÎÊÌâµÄÏêÇéÔÚerrorÖÐչʾ£¬¿ÉÒÔ¿´³öÊǽ¨Á¢Á¬½Óʱ³ö´íÁË¡£ÔÚʵ¼ùÖУ¬ÎÒÃÇ¿ÉÒÔͨ¹ýhealth¶Ë¿Ú¼à¿ØÊý¾Ý¿â¡¢Redis¡¢MongoDB¡¢´ÅÅ̵Ƚ¡¿µÇé¿ö¡£ActuatorÔ¤¶¨ÒåµÄ´¦ÀíÀàΪ£ºDataSourceHealthIndicator, DiskSpaceHealthIndicator, MongoHealthIndicator, RedisHealthIndicatorµÈ¡£
+
+¶øÇÒÿ¸öÖ¸±ê¶¼¿ÉÒÔµ¥¶ÀµÄ½øÐпªÆôºÍ¹Ø±Õ£¬ÒÔÊý¾Ý¿âµÄΪÀý£º
+
+
+````
+management:
+ health:
+ db:
+ enabled: true`
+````
+
+## info¶Ëµã
+
+/info ¶ËµãÓÃÀ´²é¿´ÅäÖÃÎļþ applicationÖÐÒÔinfo¿ªÍ·µÄÅäÖÃÐÅÏ¢£¬Ä¬ÈÏÇé¿öÏ applicationÖв¢Ã»ÓÐ info ½ÚµãÅäÖã¬ËùÒÔĬÈÏΪ¿Õ¡£
+
+applicationÖÐÌí¼ÓÈçÏÂÅäÖãº
+
+
+
+````
+info:
+ user:
+ type: ¹«ÖÚºÅ
+ name: ³ÌÐòÐÂÊÓ½ç
+ wechat: zhuan2quan
+````
+
+·ÃÎÊ[http://localhost:8080/actuator/info](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Finfo "http://localhost:8080/actuator/info") £¬Õ¹Ê¾½á¹ûÈçÏ£º
+
+
+
+## conditions¶Ëµã
+
+Spring BootÌṩÁË×Ô¶¯ÅäÖù¦ÄÜ£¬Ê¹ÓÃÆðÀ´·Ç³£·½±ã¡£µ«ÕâЩ×Ô¶¯ÅäÖÃÀàÊÇʲôÇé¿öÏÂÉúЧµÄ£¬ÊÇ·ñÉúЧÊDZȽÏÄÑÅŲéµÄ¡£´Ëʱ£¬¿ÉÒÔʹÓà conditions ÔÚÓ¦ÓÃÔËÐÐʱ²é¿´Ä³¸öÅäÖÃÀàÔÚʲôÌõ¼þÏÂÉúЧ£¬»òΪʲôûÓÐÉúЧ¡£
+
+·ÃÎÊURL£º[http://localhost:8080/actuator/conditions](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fconditions "http://localhost:8080/actuator/conditions") £¬²¿·Ö·µ»ØÐÅÏ¢ÈçÏ£º
+
+
+
+¿ÉÒÔ¿´µ½Ä³¸ö×Ô¶¯ÅäÖÃÀà¶ÔÓ¦µÄÉúЧÌõ¼þºÍÌáʾÐÅÏ¢¡£
+
+## shutdown¶Ëµã
+
+shutdown¶ËµãÊôÓÚ²Ù×÷¿ØÖÆÀà¶Ëµã£¬¿ÉÒÔÓÅÑÅ¹Ø±Õ Spring Boot Ó¦Óá£ÐèÒªÔÚÅäÖÃÎļþÖпªÆô£º
+
+
+````
+management:
+ endpoint:
+ shutdown:
+ enabled: true
+````
+
+¸Ã¶ËµãÖ»Ö§³ÖPOSTÇëÇó£¬Ö´ÐÐÃüÁî¼°·µ»Ø½á¹ûÈçÏ£º
+
+
+```
+curl -X POST "http://localhost:8080/actuator/shutdown"
+{
+ "message": "Shutting down, bye..."
+}
+```
+
+Ö´ÐÐÖ®ºó£¬»á·¢ÏÖÓ¦ÓóÌÐòÒѾ±»¹Ø±ÕÁË¡£ÓÉÓڸö˵ã»á¹Ø±ÕÓ¦ÓóÌÐò£¬Òò´ËʹÓÃÊÇÐèҪСÐÄ¡£
+
+## configprops¶Ëµã
+
+ÔÚSpring BootÏîÄ¿ÖУ¬ÎÒÃǾ³£»áÓõ½@ConfigurationProperties×¢½âÀ´ÅúÁ¿×¢ÈëһЩÊôÐÔ£¬¶øconfigprops¶Ëµã¾ÍÊÇÓÃÀ´ÏÔʾÕâЩ±»¸Ã×¢½â±ê×¢µÄÅäÖÃÀà¡£
+
+±ÈÈçÇ°ÃæµÄinfoÅäÖã¬ÎÒÃǾͿÉÒÔ¶¨ÒåÒ»¸öÀàInfoProperties£º
+
+
+````
+@Component
+@ConfigurationProperties(prefix = "info")
+public class InfoProperties {
+
+ private String type;
+
+ private String name;
+
+ private String wechat;
+
+ // Ê¡ÂÔgetter/setter
+}
+````
+
+·ÃÎÊURL£º[http://localhost:8080/actuator/configprops](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fconfigprops "http://localhost:8080/actuator/configprops") £¬²¿·ÖÐÅÏ¢ÈçÏ£º
+
+
+
+²»½ö¿ÉÒÔ¿´µ½ÏµÍ³ÖÐĬÈϼ¯³ÉµÄÅäÖÃÀàÐÅÏ¢£¬»¹¿ÉÒÔ¿´µ½ÎÒÃÇ×Ô¶¨ÒåµÄÅäÖÃÀàÐÅÏ¢¡£ÕâÀïÐèҪעÒâµÄÊǶÔÓ¦µÄÀàÐèÒª½øÐÐʵÀý»¯£¨@Component£©ÕâÀï²ÅÄܹ»¿´µ½¡£
+
+ÎÒÃÇ×Ô¶¨ÒåµÄÀàÖзµ»ØÁËBeanµÄÃû³Æ¡¢ÅäÖÃǰ׺¡£ÉÏÃæµÄProjectInfoProperties»¹·µ»ØÁËÊôÐÔÐÅÏ¢¡£
+
+## env¶Ëµã
+
+env¶ËµãÓÃÓÚ»ñȡȫ²¿»·¾³ÊôÐÔ£¬°üÀ¨applicationÅäÖÃÎļþÖеÄÄÚÈÝ¡¢ÏµÍ³±äÁ¿µÈ¡£
+
+·ÃÎÊURL£º[http://localhost:8080/actuator/env£¬·µ»Ø²¿·ÖÐÅÏ¢£º](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fenv%25EF%25BC%258C%25E8%25BF%2594%25E5%259B%259E%25E9%2583%25A8%25E5%2588%2586%25E4%25BF%25A1%25E6%2581%25AF%25EF%25BC%259A "http://localhost:8080/actuator/env%EF%BC%8C%E8%BF%94%E5%9B%9E%E9%83%A8%E5%88%86%E4%BF%A1%E6%81%AF%EF%BC%9A")
+
+
+
+## env-toMatch¶Ëµã
+
+env-toMatch¶ËµãÓëcachesºÍcaches-cacheÀàËÆ£¬Ò»¸öÊÇ»ñÈ¡ËùÓеģ¬Ò»¸öÊÇ»ñȡָ¶¨µÄ¡£ÕâÀïµÄenv-toMatch¶ËµãÊÇ»ñȡָ¶¨keyµÄ»·¾³±äÁ¿ÊôÐÔ¡£
+
+»ù±¾¸ñʽΪ£º[http://localhost:8080/actuator/env/{toMatch}¡£](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fenv%2F%257BtoMatch%257D%25E3%2580%2582 "http://localhost:8080/actuator/env/%7BtoMatch%7D%E3%80%82") ʵÀýURL£º[http://localhost:8080/actuator/env/info.user.name](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fenv%2Finfo.user.name "http://localhost:8080/actuator/env/info.user.name") £¬·µ»Ø½á¹ûÈçÏÂͼ£º
+
+
+
+·µ»ØÊý¾ÝÐÅÏ¢°üÀ¨¸ÃÊôÐÔµÄÀ´Ô´¡¢valueÖµµÈÐÅÏ¢¡£
+
+## loggers¶Ëµã
+
+/loggers ¶Ëµã±©Â¶Á˳ÌÐòÄÚ²¿ÅäÖõÄËùÓÐ logger µÄÐÅÏ¢£¬°üÀ¨²»Í¬µÄpackage¡¢²»Í¬µÄÀàµÄÈÕÖ¾¼¶±ðÐÅÏ¢¡£
+
+·ÃÎÊURL£º[http://localhost:8080/actuator/loggers](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Floggers "http://localhost:8080/actuator/loggers") £¬²¿·Ö·µ»Ø½á¹û£º
+
+
+
+## loggers-name¶Ëµã
+
+loggers-name¶ËµãÒ²ÊÇlogger¶ËµãµÄϸ·Ö£¬¿ÉÒÔͨ¹ýname·ÃÎÊijһ¸ölogger¡£
+
+»ù±¾ÇëÇó¸ñʽ£º[http://localhost:8080/actuator/loggers/{name}](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Floggers%2F%257Bname%257D "http://localhost:8080/actuator/loggers/%7Bname%7D") ʾÀýÇëÇóURL£º[http://localhost:8080/actuator/loggers/com.secbro2.SpringbootActuatorApplication](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Floggers%2Fcom.secbro2.SpringbootActuatorApplication "http://localhost:8080/actuator/loggers/com.secbro2.SpringbootActuatorApplication") £¬·µ»Ø½á¹ûÈçÏ£º
+
+
+
+`{
+"configuredLevel": null,
+"effectiveLevel": "INFO"
+}`
+
+¿ÉÒÔ¿´³ö£¬Æô¶¯ÀàµÄÈÕÖ¾¼¶±ðΪINFO¡£
+
+## heapdump¶Ëµã
+
+heapdump¶Ëµã»á·µ»ØÒ»¸öJVM ¶Ñdump£¬Í¨¹ýJVM×Ô´øµÄ¼à¿Ø¹¤¾ßVisualVM¿É´ò¿ª´ËÎļþ²é¿´ÄÚ´æ¿ìÕÕ¡£ÕâÊÇÄÚ´æÓÅ»¯£¬»ùÓÚ¶ÑÕ»²ãÃæ½øÐÐÅŲéµÄÀûÆ÷¡£
+
+·ÃÎÊURL£º[http://localhost:8080/actuator/heapdump](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fheapdump "http://localhost:8080/actuator/heapdump") ¡£Mac²Ù×÷ϵͳÏÂä¯ÀÀÆ÷·ÃÎÊ»áÏÂÔØÒ»¸öÃû×ÖΪheapdumpµÄÎļþ£¬ÎÞºó׺£¬30M¡£
+
+ÃüÁîÐÐÖ´ÐÐjvisualvmÃüÁ´ò¿ªVisualVM£¬ÒÀ´Îµã»÷¡°Îļþ¡±¡¢¡°×°È롱£¬¼ÇµÃÎļþÀàÐÍҪѡÔñ¡°¶ÑDump(_.hprof,_.*)¡±£¬È»ºóÑ¡Ôñheapdump¡£
+
+
+
+´Ëʱ±ã¿ÉÒÔͨ¹ý¹¤¾ßÀ´½øÐжÑÕ»ÐÅÏ¢µÄ·ÖÎöÁË¡£¶ÔÓÚÏßÉÏÎÊÌâµÄ·ÖÎöÌṩÁ˼«Îª±ãÀûµÄ·½Ê½¡£
+
+## threaddump¶Ëµã
+
+/threaddump ¶Ëµã»áÉú³Éµ±Ç°Ï̻߳µÄ¿ìÕÕ¡£ÔÚÈÕ³£¶¨Î»ÎÊÌâµÄʱºò²é¿´Ï̵߳ÄÇé¿ö·Ç³£ÓÐÓã¬Ö÷ҪչʾÁËÏß³ÌÃû¡¢Ïß³ÌID¡¢Ï̵߳Ä״̬¡¢ÊÇ·ñµÈ´ýËø×ÊÔ´µÈÐÅÏ¢¡£
+
+·ÃÎÊURL£º[http://localhost:8080/actuator/threaddump](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fthreaddump "http://localhost:8080/actuator/threaddump") £¬²¿·Ö·µ»Ø½á¹û£º
+
+
+
+ÎÒÃÇ¿Éͨ¹ýÏ߳̿ìÕÕÀ´ÅŲéÉú²ú»·¾³µÄÎÊÌâ¡£
+
+## metrics¶Ëµã
+
+/metrics ¶ËµãÓÃÀ´±©Â¶µ±Ç°Ó¦Óõĸ÷ÀàÖØÒª¶ÈÁ¿Ö¸±ê£¬±ÈÈ磺ÄÚ´æÐÅÏ¢¡¢Ïß³ÌÐÅÏ¢¡¢À¬»ø»ØÊÕÐÅÏ¢¡¢tomcat¡¢Êý¾Ý¿âÁ¬½Ó³ØµÈ¡£2.x°æ±¾ÕâÀïÖ»ÏÔʾÁËÒ»¸öÖ¸±êµÄÁÐ±í¡£
+
+·ÃÎÊURL£º[http://localhost:8080/actuator/metrics](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fmetrics "http://localhost:8080/actuator/metrics") ¡£
+
+````
+{
+ "names": [
+ "jvm.memory.max",
+ "jvm.threads.states",
+ "jvm.gc.pause",
+ "http.server.requests",
+ "process.files.max",
+ "jvm.gc.memory.promoted",
+ "system.load.average.1m",
+ "jvm.memory.used",
+ "jvm.gc.max.data.size",
+ "jvm.memory.committed",
+ "system.cpu.count",
+ "logback.events",
+ "jvm.buffer.memory.used",
+ "tomcat.sessions.created",
+ "jvm.threads.daemon",
+ "system.cpu.usage",
+ "jvm.gc.memory.allocated",
+ "tomcat.sessions.expired",
+ "jvm.threads.live",
+ "jvm.threads.peak",
+ "process.uptime",
+ "tomcat.sessions.rejected",
+ "process.cpu.usage",
+ "jvm.classes.loaded",
+ "jvm.classes.unloaded",
+ "tomcat.sessions.active.current",
+ "tomcat.sessions.alive.max",
+ "jvm.gc.live.data.size",
+ "process.files.open",
+ "jvm.buffer.count",
+ "jvm.buffer.total.capacity",
+ "tomcat.sessions.active.max",
+ "process.start.time"
+ ]
+}
+````
+
+/metrics¶Ëµã¿ÉÒÔÌṩӦÓÃÔËÐÐ״̬µÄÍêÕû¶ÈÁ¿Ö¸±ê±¨¸æ£¬ÕâÏÄܷdz£µÄʵÓ㬵«ÊǶÔÓÚ¼à¿ØÏµÍ³Öеĸ÷Ïî¼à¿Ø¹¦ÄÜ£¬ËüÃÇµÄ¼à¿ØÄÚÈÝ¡¢Êý¾ÝÊÕ¼¯ÆµÂʶ¼ÓÐËù²»Í¬£¬Èç¹ûÎÒÃÇÿ´Î¶¼Í¨¹ýÈ«Á¿»ñÈ¡±¨¸æµÄ·½Ê½À´ÊÕ¼¯£¬ÂÔÏÔ´Ö±©¡£¹Ù·½Ò²ÊÇ¿ÉÄÜÊÇ´¦ÓÚ´Ë·½ÃæµÄ¿¼ÂÇ£¬ÔÚSpring Boot 2.xÖ®ºó£¬/metrics¶ËµãÖ»ÏÔʾÁËÖ¸±êµÄÁÐ±í¡£
+
+Èç¹ûÐèÒª²é¿´¾ßÌåµÄijÏîÖ¸±ê£¬Ôò¿Éͨ¹ý/metrics-requiredMetricName¶ËµãÀ´ÊµÏÖ¡£
+
+## metrics-requiredMetricName¶Ëµã
+
+metrics-requiredMetricName¶Ëµã£¬ÓÃÓÚ·ÃÎÊÖ¸¶¨Ö¸±êµÄ±¨¸æ£¬Ò»°ã»áÅäºÏ/metrics¶ËµãÏȲé³öÖ¸±êÁÐ±í£¬È»ºóÔÙ²éѯ¾ßÌåµÄij¸öÖ¸±ê¡£
+
+»ù±¾¸ñʽ£º[http://localhost:8080/actuator/metrics/{requiredMetricName}¡£](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fmetrics%2F%257BrequiredMetricName%257D%25E3%2580%2582 "http://localhost:8080/actuator/metrics/%7BrequiredMetricName%7D%E3%80%82") ʵÀýURL£º[http://localhost:8080/actuator/metrics/jvm.memory.max](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fmetrics%2Fjvm.memory.max "http://localhost:8080/actuator/metrics/jvm.memory.max") £¬·µ»Ø½á¹ûÈçÏ£º
+
+
+````
+{
+ "name": "jvm.memory.max",
+ "description": "The maximum amount of memory in bytes that can be used for memory management",
+ "baseUnit": "bytes",
+ "measurements": [
+ {
+ "statistic": "VALUE",
+ "value": 5606211583
+ }
+ ],
+ "availableTags": [
+ {
+ "tag": "area",
+ "values": [
+ "heap",
+ "nonheap"
+ ]
+ },
+ {
+ "tag": "id",
+ "values": [
+ "Compressed Class Space",
+ "PS Survivor Space",
+ "PS Old Gen",
+ "Metaspace",
+ "PS Eden Space",
+ "Code Cache"
+ ]
+ }
+ ]
+}
+````
+
+ÉÏÊö½á¹ûչʾÁË×î´ó¿ÉÓÃÄÚ´æµÄÇé¿ö¡£ÆäËûÏà¹ØÖ¸±êµÄÕ¹Ê¾Ìæ»»¶ÔÓ¦µÄÃû×Ö½øÐв鿴¼´¿É¡£
+
+## scheduledtasks¶Ëµã
+
+/scheduledtasks¶ËµãÓÃÓÚչʾӦÓÃÖеĶ¨Ê±ÈÎÎñÐÅÏ¢¡£
+
+ÏÈÔÚÏîÄ¿Öй¹½¨Á½¸ö¶¨Ê±ÈÎÎñ£¬Ê×ÏÈÔÚÆô¶¯ÀàÉÏÌí¼Ó@EnableScheduling¿ªÆô¶¨Ê±ÈÎÎñ¹¦ÄÜ¡£È»ºó´´½¨¶¨Ê±ÈÎÎñÀࣺ
+
+````
+@Component
+public class MyTask {
+
+ @Scheduled(cron = "0/10 * * * * *")
+ public void work() {
+ System.out.println("I am a cron job.");
+ }
+
+ @Scheduled(fixedDelay = 10000)
+ public void work1() {
+ System.out.println("I am a fixedDelay job.");
+ }
+}
+````
+
+ÆäÖж¨ÒåÁËÁ½ÖÖÀàÐ͵Ķ¨Ê±ÈÎÎñ£¬workÊÇ»ùÓÚcronʵÏֵĶ¨Ê±ÈÎÎñ£¬work1ÊÇ»ùÓÚfixedDelayʵÏֵĶ¨Ê±ÈÎÎñ¡£
+
+·ÃÎÊURL£º[http://localhost:8080/actuator/scheduledtasks](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fscheduledtasks "http://localhost:8080/actuator/scheduledtasks") £¬·µ»Ø½á¹ûÐÅÏ¢ÈçÏ£º
+
+```
+{
+ "cron": [
+ {
+ "runnable": {
+ "target": "com.secbro2.job.MyTask.work"
+ },
+ "expression": "0/10 * * * * *"
+ }
+ ],
+ "fixedDelay": [
+ {
+ "runnable": {
+ "target": "com.secbro2.job.MyTask.work1"
+ },
+ "initialDelay": 0,
+ "interval": 10000
+ }
+ ],
+ "fixedRate": [],
+ "custom": []
+}
+```
+
+¿ÉÒÔ¿´µ½£¬Í¨¹ý¸Ã¶Ëµã¿ÉÒÔÃ÷È·µÄÖªµÀµ±Ç°Ó¦ÓÃÖж¨ÒåµÄ¶¨Ê±ÈÎÎñ£¬ÒÔ¼°Ö´ÐÐģʽºÍƵ´Î¡£
+
+## mappings¶Ëµã
+
+/mappings¶ËµãÓÃÓÚÃèÊöÈ«²¿µÄ URI ·¾¶£¬ÒÔ¼°ºÍ¿ØÖÆÆ÷µÄÓ³Éä¹ØÏµ¡£Õâ¸ö¹¦ÄÜËãÊDZȽϳ£ÓõÄÁË£¬Èç¹ûÏëϵͳµÄ²é¿´URL¶ÔÓ¦µÄController¼°·½·¨£¬¿ÉÒÔʹÓô˶˵㡣
+
+·ÃÎÊURL£º[http://localhost:8080/actuator/mappings](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fmappings "http://localhost:8080/actuator/mappings") £¬²¿·Ö·µ»Ø½á¹ûÈçÏ£º
+
+
+
+ÖÁ´Ë¹ØÓÚSpring Boot ActuatorÌṩµÄËùÓж˵ã½éÉÜÍê±Ï¡£
+
+## С½á
+
+±¾ÎÄͨ¹ý¶ÔSpring Boot ActuatorÌṩËùÓж˵㹹½¨ÊµÀý²¢ÑÝʾ½á¹û£¬±¾ÎÄ´ó¶àÊýÄÚÈݺÍʵÀý¶¼ÊÇÈ«ÍøµÚÒ»ÊÖ×ÊÁÏ¡£¸Ã¿ò¼Ü¶ÔÅŲéÏßÉÏÎÊÌ⣬ÐÔÄÜÓÅ»¯µÈ¶¼Óм«´óµÄ°ïÖú¡£¶øÔÚд±¾ÎĵĹý³ÌÖÐÒ²Ô½À´Ô½¾ªÌ¾ActuatorµÄ¹¦ÄÜ֮ǿ´ó£¬Ç¿ÁÒÍÆ¼öÓÃÆðÀ´¡£
+
+## ²Î¿¼Á´½Ó
+
+×÷Õߣº³ÌÐòÐÂÊÓ½ç
+Á´½Ó£ºhttps://juejin.cn/post/6984550846876876814
+À´Ô´£ºÏ¡ÍÁ¾ò½ð
+Öø×÷Ȩ¹é×÷ÕßËùÓС£ÉÌÒµ×ªÔØÇëÁªÏµ×÷Õß»ñµÃÊÚȨ£¬·ÇÉÌÒµ×ªÔØÇë×¢Ã÷³ö´¦¡£
+
diff --git a/docs/monitor/SpringBoot Admin.md b/docs/monitor/SpringBoot Admin.md
new file mode 100644
index 0000000..7b0c8ab
--- /dev/null
+++ b/docs/monitor/SpringBoot Admin.md
@@ -0,0 +1,495 @@
+## ÕªÒª
+
+Spring Boot Admin ¿ÉÒÔ¶ÔSpringBootÓ¦Óõĸ÷ÏîÖ¸±ê½øÐÐ¼à¿Ø£¬¿ÉÒÔ×÷Ϊ΢·þÎñ¼Ü¹¹ÖÐµÄ¼à¿ØÖÐÐÄÀ´Ê¹Ó㬱¾ÎĽ«¶ÔÆäÓ÷¨½øÐÐÏêϸ½éÉÜ¡£
+
+## Spring Boot Admin ¼ò½é
+
+SpringBootÓ¦ÓÿÉÒÔͨ¹ýActuatorÀ´±©Â¶Ó¦ÓÃÔËÐйý³ÌÖеĸ÷ÏîÖ¸±ê£¬Spring Boot Adminͨ¹ýÕâЩָ±êÀ´¼à¿ØSpringBootÓ¦Óã¬È»ºóͨ¹ýͼÐλ¯½çÃæ³ÊÏÖ³öÀ´¡£Spring Boot Admin²»½ö¿ÉÒÔ¼à¿Øµ¥ÌåÓ¦Ó㬻¹¿ÉÒÔºÍSpring CloudµÄ×¢²áÖÐÐÄÏà½áºÏÀ´¼à¿ØÎ¢·þÎñÓ¦Óá£
+
+Spring Boot Admin ¿ÉÒÔÌṩӦÓõÄÒÔÏÂ¼à¿ØÐÅÏ¢£º
+
+* ¼à¿ØÓ¦ÓÃÔËÐйý³ÌÖеĸÅÀÀÐÅÏ¢£»
+* ¶ÈÁ¿Ö¸±êÐÅÏ¢£¬±ÈÈçJVM¡¢Tomcat¼°½ø³ÌÐÅÏ¢£»
+* »·¾³±äÁ¿ÐÅÏ¢£¬±ÈÈçϵͳÊôÐÔ¡¢ÏµÍ³»·¾³±äÁ¿ÒÔ¼°Ó¦ÓÃÅäÖÃÐÅÏ¢£»
+* ²é¿´ËùÓд´½¨µÄBeanÐÅÏ¢£»
+* ²é¿´Ó¦ÓÃÖеÄËùÓÐÅäÖÃÐÅÏ¢£»
+* ²é¿´Ó¦ÓÃÔËÐÐÈÕÖ¾ÐÅÏ¢£»
+* ²é¿´JVMÐÅÏ¢£»
+* ²é¿´¿ÉÒÔ·ÃÎʵÄWeb¶Ëµã£»
+* ²é¿´HTTP¸ú×ÙÐÅÏ¢¡£
+
+## ´´½¨admin-serverÄ£¿é
+
+> ÕâÀïÎÒÃÇ´´½¨Ò»¸öadmin-serverÄ£¿éÀ´×÷Ϊ¼à¿ØÖÐÐÄÑÝʾÆä¹¦ÄÜ¡£
+
+* ÔÚpom.xmlÖÐÌí¼ÓÏà¹ØÒÀÀµ£º
+
+
+
+
+
+````
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ de.codecentric
+ spring-boot-admin-starter-server
+
+
+````
+
+* ÔÚapplication.ymlÖнøÐÐÅäÖãº
+
+
+
+
+
+````spring:
+ application:
+ name: admin-server
+server:
+ port: 9301
+````
+
+* ÔÚÆô¶¯ÀàÉÏÌí¼Ó@EnableAdminServerÀ´ÆôÓÃadmin-server¹¦ÄÜ£º
+
+
+
+
+````
+@EnableAdminServer
+@SpringBootApplication
+public class AdminServerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AdminServerApplication.class, args);
+ }
+
+}
+````
+
+## ´´½¨admin-clientÄ£¿é
+
+> ÕâÀïÎÒÃÇ´´½¨Ò»¸öadmin-clientÄ£¿é×÷Ϊ¿Í»§¶Ë×¢²áµ½admin-server¡£
+
+* ÔÚpom.xmlÖÐÌí¼ÓÏà¹ØÒÀÀµ£º
+
+
+
+````
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ de.codecentric
+ spring-boot-admin-starter-client
+
+````
+
+* ÔÚapplication.ymlÖнøÐÐÅäÖãº
+
+
+
+
+
+
+
+
+```
+spring:
+ application:
+ name: admin-client
+ boot:
+ admin:
+ client:
+ url: http://localhost:9301 #ÅäÖÃadmin-serverµØÖ·
+server:
+ port: 9305
+management:
+ endpoints:
+ web:
+ exposure:
+ include: '*'
+ endpoint:
+ health:
+ show-details: always
+logging:
+ file: admin-client.log #Ìí¼Ó¿ªÆôadminµÄÈÕÖ¾¼à¿Ø
+```
+
+* Æô¶¯admin-serverºÍadmin-client·þÎñ¡£
+
+## ¼à¿ØÐÅÏ¢ÑÝʾ
+
+* ·ÃÎÊÈçϵØÖ·´ò¿ªSpring Boot AdminµÄÖ÷Ò³£º[http://localhost:9301](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A9301 "http://localhost:9301")
+
+
+
+
+
+
+
+* µã»÷wallboard°´Å¥£¬Ñ¡Ôñadmin-client²é¿´¼à¿ØÐÅÏ¢£»
+
+* ¼à¿ØÐÅÏ¢¸ÅÀÀ£»
+
+
+
+
+
+
+
+* ¶ÈÁ¿Ö¸±êÐÅÏ¢£¬±ÈÈçJVM¡¢Tomcat¼°½ø³ÌÐÅÏ¢£»
+
+
+
+
+
+
+
+* »·¾³±äÁ¿ÐÅÏ¢£¬±ÈÈçϵͳÊôÐÔ¡¢ÏµÍ³»·¾³±äÁ¿ÒÔ¼°Ó¦ÓÃÅäÖÃÐÅÏ¢£»
+
+
+
+
+
+
+
+* ²é¿´ËùÓд´½¨µÄBeanÐÅÏ¢£»
+
+
+
+
+
+
+
+* ²é¿´Ó¦ÓÃÖеÄËùÓÐÅäÖÃÐÅÏ¢£»
+
+
+
+
+
+
+
+* ²é¿´ÈÕÖ¾ÐÅÏ¢£¬ÐèÒªÌí¼ÓÒÔÏÂÅäÖòÅÄÜ¿ªÆô£»
+
+
+
+`logging:
+file: admin-client.log #Ìí¼Ó¿ªÆôadminµÄÈÕÖ¾¼à¿Ø`
+
+
+
+
+
+
+* ²é¿´JVMÐÅÏ¢£»
+
+
+
+
+
+
+
+* ²é¿´¿ÉÒÔ·ÃÎʵÄWeb¶Ëµã£»
+
+
+
+
+
+
+
+* ²é¿´HTTP¸ú×ÙÐÅÏ¢£»
+
+
+
+
+
+
+
+## ½áºÏ×¢²áÖÐÐÄʹÓÃ
+
+> Spring Boot Admin½áºÏSpring Cloud ×¢²áÖÐÐÄʹÓã¬Ö»Ð轫admin-serverºÍ×¢²áÖÐÐÄÕûºÏ¼´¿É£¬admin-server »á×Ô¶¯´Ó×¢²áÖÐÐÄ»ñÈ¡·þÎñÁÐ±í£¬È»ºó°¤¸ö»ñÈ¡¼à¿ØÐÅÏ¢¡£ÕâÀïÒÔEureka×¢²áÖÐÐÄΪÀýÀ´½éÉÜϸù¦ÄÜ¡£
+
+### ÐÞ¸Äadmin-server
+
+* ÔÚpom.xmlÖÐÌí¼ÓÏà¹ØÒÀÀµ£º
+
+
+
+
+````
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-client
+
+````
+
+* ÔÚapplication-eureka.ymlÖнøÐÐÅäÖã¬Ö»ÐèÌí¼Ó×¢²áÖÐÐÄÅäÖü´¿É£º
+
+
+
+
+````
+spring:
+ application:
+ name: admin-server
+server:
+ port: 9301
+eureka:
+ client:
+ register-with-eureka: true
+ fetch-registry: true
+ service-url:
+ defaultZone: http://localhost:8001/eureka/
+````
+
+* ÔÚÆô¶¯ÀàÉÏÌí¼Ó@EnableDiscoveryClientÀ´ÆôÓ÷þÎñ×¢²á¹¦ÄÜ£º
+
+
+
+
+
+````
+`@EnableDiscoveryClient
+@EnableAdminServer
+@SpringBootApplication
+public class AdminServerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AdminServerApplication.class, args);
+ }
+
+}
+````
+
+### ÐÞ¸Äadmin-client
+
+* ÔÚpom.xmlÖÐÌí¼ÓÏà¹ØÒÀÀµ£º
+
+
+
+````
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-client
+
+````
+
+* ÔÚapplication-eureka.ymlÖнøÐÐÅäÖã¬É¾³ýÔÀ´µÄadmin-serverµØÖ·ÅäÖã¬Ìí¼Ó×¢²áÖÐÐÄÅäÖü´¿É£º
+
+
+
+
+
+```
+spring:
+ application:
+ name: admin-client
+server:
+ port: 9305
+management:
+ endpoints:
+ web:
+ exposure:
+ include: '*'
+ endpoint:
+ health:
+ show-details: always
+logging:
+ file: admin-client.log #Ìí¼Ó¿ªÆôadminµÄÈÕÖ¾¼à¿Ø
+eureka:
+ client:
+ register-with-eureka: true
+ fetch-registry: true
+ service-url:
+ defaultZone: http://localhost:8001/eureka/
+```
+
+* ÔÚÆô¶¯ÀàÉÏÌí¼Ó@EnableDiscoveryClientÀ´ÆôÓ÷þÎñ×¢²á¹¦ÄÜ£º
+
+
+
+
+
+```
+@EnableDiscoveryClient
+@SpringBootApplication
+public class AdminClientApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AdminClientApplication.class, args);
+ }
+
+}
+```
+
+### ¹¦ÄÜÑÝʾ
+
+* Æô¶¯eureka-server£¬Ê¹ÓÃapplication-eureka.ymlÅäÖÃÆô¶¯admin-server£¬admin-client£»
+
+* ²é¿´×¢²áÖÐÐÄ·¢ÏÖ·þÎñ¾ùÒÑ×¢²á£º[http://localhost:8001/](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8001%2F "http://localhost:8001/")
+
+
+
+
+* ²é¿´Spring Boot Admin Ö÷Ò³·¢ÏÖ¿ÉÒÔ¿´µ½·þÎñÐÅÏ¢£º[http://localhost:9301](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A9301 "http://localhost:9301")
+
+
+
+
+## Ìí¼ÓµÇ¼ÈÏÖ¤
+
+> ÎÒÃÇ¿ÉÒÔͨ¹ý¸øadmin-serverÌí¼ÓSpring SecurityÖ§³ÖÀ´»ñµÃµÇ¼ÈÏÖ¤¹¦ÄÜ¡£
+
+### ´´½¨admin-security-serverÄ£¿é
+
+* ÔÚpom.xmlÖÐÌí¼ÓÏà¹ØÒÀÀµ£º
+
+
+
+```
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-client
+
+
+ de.codecentric
+ spring-boot-admin-starter-server
+ 2.1.5
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+```
+
+* ÔÚapplication.ymlÖнøÐÐÅäÖã¬ÅäÖõǼÓû§ÃûºÍÃÜÂ룬ºöÂÔadmin-security-serverµÄ¼à¿ØÐÅÏ¢£º
+
+
+
+
+
+```
+spring:
+ application:
+ name: admin-security-server
+ security: # ÅäÖõǼÓû§ÃûºÍÃÜÂë
+ user:
+ name: macro
+ password: 123456
+ boot: # ²»ÏÔʾadmin-security-serverµÄ¼à¿ØÐÅÏ¢
+ admin:
+ discovery:
+ ignored-services: ${spring.application.name}
+server:
+ port: 9301
+eureka:
+ client:
+ register-with-eureka: true
+ fetch-registry: true
+ service-url:
+ defaultZone: http://localhost:8001/eureka/
+```
+
+* ¶ÔSpringSecurity½øÐÐÅäÖã¬ÒÔ±ãadmin-client¿ÉÒÔ×¢²á£º
+
+
+
+
+
+scss
+
+¸´ÖÆ´úÂë
+
+
+
+
+
+```
+/**
+ * Created by macro on 2019/9/30.
+ */
+@Configuration
+public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
+ private final String adminContextPath;
+
+ public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
+ this.adminContextPath = adminServerProperties.getContextPath();
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
+ successHandler.setTargetUrlParameter("redirectTo");
+ successHandler.setDefaultTargetUrl(adminContextPath + "/");
+
+ http.authorizeRequests()
+ //1.ÅäÖÃËùÓо²Ì¬×ÊÔ´ºÍµÇ¼ҳ¿ÉÒÔ¹«¿ª·ÃÎÊ
+ .antMatchers(adminContextPath + "/assets/**").permitAll()
+ .antMatchers(adminContextPath + "/login").permitAll()
+ .anyRequest().authenticated()
+ .and()
+ //2.ÅäÖõǼºÍµÇ³ö·¾¶
+ .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
+ .logout().logoutUrl(adminContextPath + "/logout").and()
+ //3.¿ªÆôhttp basicÖ§³Ö£¬admin-client×¢²áʱÐèҪʹÓÃ
+ .httpBasic().and()
+ .csrf()
+ //4.¿ªÆô»ùÓÚcookieµÄcsrf±£»¤
+ .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
+ //5.ºöÂÔÕâЩ·¾¶µÄcsrf±£»¤ÒÔ±ãadmin-client×¢²á
+ .ignoringAntMatchers(
+ adminContextPath + "/instances",
+ adminContextPath + "/actuator/**"
+ );
+ }
+}
+```
+
+* ÐÞ¸ÄÆô¶¯À࣬¿ªÆôAdminServer¼°×¢²á·¢ÏÖ¹¦ÄÜ£º
+
+
+
+
+
+```
+@EnableDiscoveryClient
+@EnableAdminServer
+@SpringBootApplication
+public class AdminSecurityServerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AdminSecurityServerApplication.class, args);
+ }
+}
+```
+
+* Æô¶¯eureka-server£¬admin-security-server£¬·ÃÎÊSpring Boot Admin Ö÷Ò³·¢ÏÖÐèÒªµÇ¼²ÅÄÜ·ÃÎÊ£º[http://localhost:9301](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A9301 "http://localhost:9301")
+
+
+
+
+
+
+
+## ʹÓõ½µÄÄ£¿é
+
+
+
+
+
+```
+springcloud-learning
+©À©¤©¤ eureka-server -- eureka×¢²áÖÐÐÄ
+©À©¤©¤ admin-server -- admin¼à¿ØÖÐÐÄ·þÎñ
+©À©¤©¤ admin-client -- admin¼à¿ØÖÐÐÄ¼à¿ØµÄÓ¦Ó÷þÎñ
+©¸©¤©¤ admin-security-server -- ´øµÇ¼ÈÏÖ¤µÄadmin¼à¿ØÖÐÐÄ·þÎñ`
+```
\ No newline at end of file
diff --git "a/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\344\272\213\345\212\241\346\266\210\346\201\257\357\274\210\346\234\200\347\273\210\344\270\200\350\207\264\346\200\247\357\274\211.md" "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\344\272\213\345\212\241\346\266\210\346\201\257\357\274\210\346\234\200\347\273\210\344\270\200\350\207\264\346\200\247\357\274\211.md"
new file mode 100644
index 0000000..7b22bce
--- /dev/null
+++ "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\344\272\213\345\212\241\346\266\210\346\201\257\357\274\210\346\234\200\347\273\210\344\270\200\350\207\264\346\200\247\357\274\211.md"
@@ -0,0 +1,62 @@
+# [RocketMQϵÁУ¨Ò»£©»ù±¾¸ÅÄî](https://www.cnblogs.com/boboooo/p/13038950.html)
+
+
+
+
+
+RocketMQÊǰ¢Àï³öÆ·µÄÒ»¿î¿ªÔ´µÄÏûÏ¢Öмä¼þ£¬ÈÃÆäÉùÃû´óÔëµÄ¾ÍÊÇËüµÄÊÂÎñÏûÏ¢µÄ¹¦ÄÜ¡£ÔÚÆóÒµÖУ¬ÏûÏ¢Öмä¼þÑ¡ÔñʹÓÃRocketMQµÄ»¹ÊÇͦ¶àµÄ£¬ÕâһϵÁеÄÎÄÕ¶¼ÊÇÕë¶ÔRocketMQµÄ£¬ÔÛÃÇÏÈ´ÓRocketMQµÄһЩ»ù±¾¸ÅÄîºÍ»·¾³µÄ´î½¨¿ªÊ¼ÁÄÆð¡£
+
+RocketMQÓÉ4²¿·Ö×é³É£¬·Ö±ðÊÇ£ºÃû³Æ·þÎñ£¨Name Server£©¡¢ÏûÏ¢¶ÓÁУ¨Brokers£©¡¢Éú²úÕߣ¨producer£©ºÍÏû·ÑÕߣ¨consumer£©¡£Õâ4²¿·Ö¶¼¿ÉÒÔ½øÐÐˮƽÀ©Õ¹£¬´Ó¶ø±ÜÃâµ¥µã¹ÊÕÏ£¬ÈçÏÂͼ£¬
+
+
+
+ÕâÊÇRocketMQ¹ÙÍøÉϵÄÒ»ÕÅͼ£¬·Ç³£ÇåÎúµÄÁгöÁË4¸ö²¿·Ö£¬²¢ÇÒ¶¼ÊǼ¯ÈºÄ£Ê½¡£ÏÂÃæÎÒÃǾͷֱð˵һ˵Õâ4²¿·Ö¡£
+
+## Ãû³Æ·þÎñ£¨NameServer£©
+
+Name Server°çÑݵĽÇÉ«ÊÇÒ»¸ö×¢²áÖÐÐÄ£¬ºÍZookeeperµÄ×÷Óò¶à¡£ËüµÄÖ÷Òª¹¦ÄÜÓÐÁ½¸ö£¬ÈçÏ£º
+
+* brokerµÄ¹ÜÀí£ºbroker¼¯Èº½«×Ô¼ºµÄÐÅÏ¢×¢²áµ½NameServer£¬NameServerÌṩÐÄÌø»úÖÆ¼ì²âÿһ¸öbrokerÊÇ·ñÕý³£¡£
+* ·ÓɹÜÀí£ºÃ¿Ò»¸öNameServer¶¼ÓÐÕû¸öbroker¼¯ÈººÍ¶ÓÁеÄÐÅÏ¢£¬ÒÔ±ã¿Í»§¶Ë£¨Éú²úÕߺÍÏû·ÑÕߣ©²éѯ¡£
+
+NameServerе÷×Å·Ö²¼Ê½ÏµÍ³ÖеÄÿһ¸ö×é¼þ£¬²¢ÇÒ¹ÜÀí×Åÿһ¸öTopicµÄ·ÓÉÐÅÏ¢¡£
+
+## Broker
+
+BrokerÖ÷ÒªÊÇ´æ´¢ÏûÏ¢£¬²¢ÇÒÌṩTopicµÄ»úÖÆ¡£ËüÌá¹©ÍÆºÍÀÁ½ÖÖģʽ£¬»¹ÓÐһЩÈÝÔֵĴëÊ©£¬±ÈÈç¿ÉÒÔÅäÖÃÏûÏ¢¸±±¾¡£ÏÂÃæÎÒÃÇ¿´Ò»¿´BrokcerµÄÖ÷´Ó»úÖÆ¡£
+
+BrokerµÄ½ÇÉ«·ÖΪ¡°Òì²½Ö÷¡±¡¢¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Èý¸ö½ÇÉ«¡£Èç¹ûÄã²»ÄÜÈÝÈÌÏûÏ¢µÄ¶ªÊ§£¬Äã¿ÉÒÔÅäÖÃÒ»¸ö¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öBroker£¬Èç¹ûÄã¾õµÃÏûÏ¢¶ªÊ§Ò²ÎÞËùν£¬Ö»Òª¶ÓÁпÉÓþÍokµÄ»°£¬Äã¿ÉÒÔÅäÖá°Òì²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öbroker¡£Èç¹ûÄãÖ»ÊÇÏë¼òµ¥µÄ´î½¨£¬Ö»ÅäÖÃÒ»¸ö¡°Òì²½Ö÷¡±£¬²»ÅäÖá°´Ó¡±Ò²ÊÇ¿ÉÒԵġ£
+
+ÉÏÃæÌáµ½µÄÊÇbrokerÖ®¼äµÄ±¸·Ý£¬brokerÀïµÄÐÅÏ¢Ò²ÊÇ¿ÉÒÔ±£´æµ½´ÅÅ̵쬱£´æµ½´ÅÅ̵ķ½Ê½Ò²ÓÐÁ½ÖÖ£¬ÍƼöµÄ·½Ê½ÊÇÒì²½±£´æ´ÅÅÌ£¬Í¬²½±£´æ´ÅÅÌÊǷdz£ËðºÄÐÔÄܵġ£
+
+## Éú²úÕß
+
+Éú²úÕßÖ§³Ö¼¯Èº²¿Êð£¬ËüÃÇÏòbroker¼¯Èº·¢ËÍÏûÏ¢£¬¶øÇÒÖ§³Ö¶àÖÖ¸ºÔؾùºâµÄ·½Ê½¡£
+
+µ±Éú²úÕßÏòbroker·¢ËÍÏûϢʱ£¬»áµÃµ½·¢Ëͽá¹û£¬·¢Ëͽá¹ûÖÐÓÐÒ»¸ö·¢ËÍ״̬¡£¼ÙÉèÎÒÃǵÄÅäÖÃÖУ¬ÏûÏ¢µÄÅäÖÃ`isWaitStoreMsgOK = true`£¬Õâ¸öÅäÖÃĬÈÏÒ²ÊÇ`true`£¬Èç¹ûÄãÅäÖÃΪ`false`£¬ÔÚ·¢ËÍÏûÏ¢µÄ¹ý³ÌÖУ¬Ö»Òª²»·¢ÉúÒì³££¬·¢Ëͽá¹û¶¼ÊÇ`SEND_OK`¡£µ±`isWaitStoreMsgOK = true`£¬·¢Ëͽá¹ûÓÐÒÔϼ¸ÖÖ£¬
+
+* `FLUSH_DISK_TIMEOUT`£º±£´æ´ÅÅ̳¬Ê±£¬µ±±£´æ´ÅÅ̵ķ½Ê½ÉèÖÃΪSYNC_FLUSH£¨Í¬²½£©£¬²¢ÇÒÔÚsyncFlushTimeoutÅäÖõÄʱ¼äÄÚ£¨Ä¬ÈÏ5s£©£¬Ã»ÓÐÍê³É±£´æ´ÅÅ̵͝×÷£¬½«»áµÃµ½Õâ¸ö״̬¡£
+* `FLUSH_SLAVE_TIMEOUT`£ºÍ¬²½¡°´Ó¡±³¬Ê±£¬µ±brokerµÄ½ÇÉ«ÉèÖÃΪ¡°Í¬²½Ö÷¡±Ê±£¬µ«ÊÇÔÚÉèÖõÄͬ²½Ê±¼äÄÚ£¬Ä¬ÈÏΪ5s£¬Ã»ÓÐÍê³ÉÖ÷´ÓÖ®¼äµÄͬ²½£¬¾Í»áµÃµ½Õâ¸ö״̬¡£
+* `SLAVE_NOT_AVAILABLE`£º¡°´Ó¡±²»¿ÉÓ㬵±ÎÒÃÇÉèÖá°Í¬²½Ö÷¡±£¬µ«ÊÇûÓÐÅäÖá°´Ó¡±brokerʱ£¬»á·µ»ØÕâ¸ö״̬¡£
+* `SEND_OK`£ºÏûÏ¢·¢Ëͳɹ¦¡£
+
+ÔÙÀ´¿´¿´ÏûÏ¢ÖØ¸´ÓëÏûÏ¢¶ªÊ§£¬µ±Äã·¢ÏÖÄãµÄÏûÏ¢¶ªÊ§Ê±£¬Í¨³£ÓÐÁ½¸öÑ¡Ôñ£¬Ò»¸öÊǶª¾Í¶ª°É£¬ÕâÑùÏûÏ¢¾ÍÕæµÄ¶ªÁË£»ÁíÒ»¸öÑ¡ÔñÊÇÏûÏ¢ÖØÐ·¢ËÍ£¬ÕâÑùÓпÉÄÜÒýÆðÏûÏ¢ÖØ¸´¡£Í¨³£Çé¿öÏ£¬»¹ÊÇÍÆ¼öÖØÐ·¢Ë͵ģ¬ÎÒÃÇÔÚÏû·ÑÏûÏ¢µÄʱºòҪȥ³ýµôÖØ¸´µÄÏûÏ¢¡£
+
+·¢ËÍmessageµÄ´óСһ°ã²»³¬¹ý512k£¬Ä¬Èϵķ¢ËÍÏûÏ¢µÄ·½Ê½ÊÇͬ²½µÄ£¬·¢ËÍ·½·¨»áÒ»Ö±×èÈû£¬Ö±µ½µÈµ½·µ»ØµÄÏìÓ¦¡£Èç¹ûÄã±È½ÏÔÚÒâÐÔÄÜ£¬Ò²¿ÉÒÔÓÃ`send(msg, callback)`Òì²½µÄ·½Ê½·¢ËÍÏûÏ¢¡£
+
+## Ïû·ÑÕß
+
+¶à¸öÏû·ÑÕß¿ÉÒÔ×é³É**Ïû·ÑÕß×飨consumer group£©**£¬²»Í¬µÄ**Ïû·ÑÕß×é**¿ÉÒÔ¶©ÔÄÏàͬµÄTopic£¬Ò²¿ÉÒÔ¶ÀÁ¢µÄÏû·ÑTopic£¬Ã¿Ò»¸öÏû·ÑÕß×é¶¼ÓÐ×Ô¼ºµÄÏû·ÑÆ«ÒÆÁ¿¡£
+
+ÏûÏ¢µÄÏû·Ñ·½Ê½Ò»°ãÓÐÁ½ÖÖ£¬Ë³ÐòÏû·ÑºÍ²¢·¢Ïû·Ñ¡£
+
+* ˳ÐòÏû·Ñ£ºÏû·ÑÕß½«Ëø×¡ÏûÏ¢¶ÓÁУ¬È·±£ÏûÏ¢°´ÕÕ˳ÐòÒ»¸öÒ»¸öµÄ±»Ïû·Ñµô£¬Ë³ÐòÏû·Ñ»áÒýÆðÒ»²¿·ÖÐÔÄÜËðʧ¡£ÔÚÏû·ÑÏûÏ¢µÄʱºò£¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇÓ¦¸Ã·µ»Ø`SUSPEND_CURRENT_QUEUE_A_MOMENT`Õâ¸ö״̬£¬Ëü½«¸æËßÏû·ÑÕß¹ýÒ»¶Îʱ¼äºó£¬»áÖØÐÂÏû·ÑÕâ¸öÏûÏ¢¡£
+* ²¢·¢Ïû·Ñ£ºÏû·ÑÕß½«²¢·¢µÄÏû·ÑÏûÏ¢£¬ÕâÖÖ·½Ê½µÄÐÔÄܷdz£ºÃ£¬Ò²ÊÇÍÆ¼öµÄÏû·Ñ·½Ê½¡£ÔÚÏû·ÑµÄ¹ý³ÌÖУ¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇ·µ»Ø`RECONSUME_LATER`״̬£¬Ëü¸æËßÏû·ÑÕßÏÖÔÚ²»ÄÜÕýÈ·µÄÏû·ÑËü£¬¹ýÒ»¶Îʱ¼äºó£¬»áÔÙ´ÎÏû·ÑËü¡£
+
+ÔÚÏû·ÑÕßÄÚ²¿£¬ÊÇʹÓÃ`ThreadPoolExecutor`×÷ΪÏ̳߳صģ¬ÎÒÃÇ¿ÉÒÔͨ¹ý`setConsumeThreadMin`ºÍ`setConsumeThreadMax`ÉèÖÃ×îСÏû·ÑÏ̺߳Í×î´óÏû·ÑÏ̡߳£
+
+µ±Ò»¸öеÄÏû·ÑÕß×齨Á¢ÒÔºó£¬ËüÒª¾ö¶¨ÊÇ·ñÏû·Ñ֮ǰµÄÀúÊ·ÏûÏ¢£¬`CONSUME_FROM_LAST_OFFSET`½«ºöÂÔÀúÊ·ÏûÏ¢£¬Ïû·ÑеÄÏûÏ¢¡£`CONSUME_FROM_FIRST_OFFSET`½«Ïû·Ñ¶ÓÁÐÖеÄÿһ¸öÏûÏ¢£¬Ö®Ç°µÄÀúÊ·ÏûÏ¢Ò²»áÔÙÏû·ÑÒ»±é¡£`CONSUME_FROM_TIMESTAMP`¿ÉÒÔÖ¸¶¨Ïû·ÑÏûÏ¢µÄʱ¼ä£¬Ö¸¶¨Ê±¼äÒÔºóµÄÏûÏ¢»á±»Ïû·Ñ¡£
+
+Èç¹ûÄãµÄÓ¦Óò»ÄÜÈÝÈÌÖØ¸´Ïû·Ñ£¬ÄÇôÔÚÏû·ÑÏûÏ¢µÄ¹ý³ÌÖУ¬Òª×öºÃÏûÏ¢µÄУÑé¡£
+
+ºÃÁË£¬½ñÌì¾Íµ½ÕâÀï°É£¬ÏÂһƪÎÒÃǽ«½éÉÜRocketMQµÄ»·¾³´î½¨¡£
\ No newline at end of file
diff --git "a/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\345\237\272\346\234\254\346\246\202\345\277\265.md" "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\345\237\272\346\234\254\346\246\202\345\277\265.md"
new file mode 100644
index 0000000..7b22bce
--- /dev/null
+++ "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\345\237\272\346\234\254\346\246\202\345\277\265.md"
@@ -0,0 +1,62 @@
+# [RocketMQϵÁУ¨Ò»£©»ù±¾¸ÅÄî](https://www.cnblogs.com/boboooo/p/13038950.html)
+
+
+
+
+
+RocketMQÊǰ¢Àï³öÆ·µÄÒ»¿î¿ªÔ´µÄÏûÏ¢Öмä¼þ£¬ÈÃÆäÉùÃû´óÔëµÄ¾ÍÊÇËüµÄÊÂÎñÏûÏ¢µÄ¹¦ÄÜ¡£ÔÚÆóÒµÖУ¬ÏûÏ¢Öмä¼þÑ¡ÔñʹÓÃRocketMQµÄ»¹ÊÇͦ¶àµÄ£¬ÕâһϵÁеÄÎÄÕ¶¼ÊÇÕë¶ÔRocketMQµÄ£¬ÔÛÃÇÏÈ´ÓRocketMQµÄһЩ»ù±¾¸ÅÄîºÍ»·¾³µÄ´î½¨¿ªÊ¼ÁÄÆð¡£
+
+RocketMQÓÉ4²¿·Ö×é³É£¬·Ö±ðÊÇ£ºÃû³Æ·þÎñ£¨Name Server£©¡¢ÏûÏ¢¶ÓÁУ¨Brokers£©¡¢Éú²úÕߣ¨producer£©ºÍÏû·ÑÕߣ¨consumer£©¡£Õâ4²¿·Ö¶¼¿ÉÒÔ½øÐÐˮƽÀ©Õ¹£¬´Ó¶ø±ÜÃâµ¥µã¹ÊÕÏ£¬ÈçÏÂͼ£¬
+
+
+
+ÕâÊÇRocketMQ¹ÙÍøÉϵÄÒ»ÕÅͼ£¬·Ç³£ÇåÎúµÄÁгöÁË4¸ö²¿·Ö£¬²¢ÇÒ¶¼ÊǼ¯ÈºÄ£Ê½¡£ÏÂÃæÎÒÃǾͷֱð˵һ˵Õâ4²¿·Ö¡£
+
+## Ãû³Æ·þÎñ£¨NameServer£©
+
+Name Server°çÑݵĽÇÉ«ÊÇÒ»¸ö×¢²áÖÐÐÄ£¬ºÍZookeeperµÄ×÷Óò¶à¡£ËüµÄÖ÷Òª¹¦ÄÜÓÐÁ½¸ö£¬ÈçÏ£º
+
+* brokerµÄ¹ÜÀí£ºbroker¼¯Èº½«×Ô¼ºµÄÐÅÏ¢×¢²áµ½NameServer£¬NameServerÌṩÐÄÌø»úÖÆ¼ì²âÿһ¸öbrokerÊÇ·ñÕý³£¡£
+* ·ÓɹÜÀí£ºÃ¿Ò»¸öNameServer¶¼ÓÐÕû¸öbroker¼¯ÈººÍ¶ÓÁеÄÐÅÏ¢£¬ÒÔ±ã¿Í»§¶Ë£¨Éú²úÕߺÍÏû·ÑÕߣ©²éѯ¡£
+
+NameServerе÷×Å·Ö²¼Ê½ÏµÍ³ÖеÄÿһ¸ö×é¼þ£¬²¢ÇÒ¹ÜÀí×Åÿһ¸öTopicµÄ·ÓÉÐÅÏ¢¡£
+
+## Broker
+
+BrokerÖ÷ÒªÊÇ´æ´¢ÏûÏ¢£¬²¢ÇÒÌṩTopicµÄ»úÖÆ¡£ËüÌá¹©ÍÆºÍÀÁ½ÖÖģʽ£¬»¹ÓÐһЩÈÝÔֵĴëÊ©£¬±ÈÈç¿ÉÒÔÅäÖÃÏûÏ¢¸±±¾¡£ÏÂÃæÎÒÃÇ¿´Ò»¿´BrokcerµÄÖ÷´Ó»úÖÆ¡£
+
+BrokerµÄ½ÇÉ«·ÖΪ¡°Òì²½Ö÷¡±¡¢¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Èý¸ö½ÇÉ«¡£Èç¹ûÄã²»ÄÜÈÝÈÌÏûÏ¢µÄ¶ªÊ§£¬Äã¿ÉÒÔÅäÖÃÒ»¸ö¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öBroker£¬Èç¹ûÄã¾õµÃÏûÏ¢¶ªÊ§Ò²ÎÞËùν£¬Ö»Òª¶ÓÁпÉÓþÍokµÄ»°£¬Äã¿ÉÒÔÅäÖá°Òì²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öbroker¡£Èç¹ûÄãÖ»ÊÇÏë¼òµ¥µÄ´î½¨£¬Ö»ÅäÖÃÒ»¸ö¡°Òì²½Ö÷¡±£¬²»ÅäÖá°´Ó¡±Ò²ÊÇ¿ÉÒԵġ£
+
+ÉÏÃæÌáµ½µÄÊÇbrokerÖ®¼äµÄ±¸·Ý£¬brokerÀïµÄÐÅÏ¢Ò²ÊÇ¿ÉÒÔ±£´æµ½´ÅÅ̵쬱£´æµ½´ÅÅ̵ķ½Ê½Ò²ÓÐÁ½ÖÖ£¬ÍƼöµÄ·½Ê½ÊÇÒì²½±£´æ´ÅÅÌ£¬Í¬²½±£´æ´ÅÅÌÊǷdz£ËðºÄÐÔÄܵġ£
+
+## Éú²úÕß
+
+Éú²úÕßÖ§³Ö¼¯Èº²¿Êð£¬ËüÃÇÏòbroker¼¯Èº·¢ËÍÏûÏ¢£¬¶øÇÒÖ§³Ö¶àÖÖ¸ºÔؾùºâµÄ·½Ê½¡£
+
+µ±Éú²úÕßÏòbroker·¢ËÍÏûϢʱ£¬»áµÃµ½·¢Ëͽá¹û£¬·¢Ëͽá¹ûÖÐÓÐÒ»¸ö·¢ËÍ״̬¡£¼ÙÉèÎÒÃǵÄÅäÖÃÖУ¬ÏûÏ¢µÄÅäÖÃ`isWaitStoreMsgOK = true`£¬Õâ¸öÅäÖÃĬÈÏÒ²ÊÇ`true`£¬Èç¹ûÄãÅäÖÃΪ`false`£¬ÔÚ·¢ËÍÏûÏ¢µÄ¹ý³ÌÖУ¬Ö»Òª²»·¢ÉúÒì³££¬·¢Ëͽá¹û¶¼ÊÇ`SEND_OK`¡£µ±`isWaitStoreMsgOK = true`£¬·¢Ëͽá¹ûÓÐÒÔϼ¸ÖÖ£¬
+
+* `FLUSH_DISK_TIMEOUT`£º±£´æ´ÅÅ̳¬Ê±£¬µ±±£´æ´ÅÅ̵ķ½Ê½ÉèÖÃΪSYNC_FLUSH£¨Í¬²½£©£¬²¢ÇÒÔÚsyncFlushTimeoutÅäÖõÄʱ¼äÄÚ£¨Ä¬ÈÏ5s£©£¬Ã»ÓÐÍê³É±£´æ´ÅÅ̵͝×÷£¬½«»áµÃµ½Õâ¸ö״̬¡£
+* `FLUSH_SLAVE_TIMEOUT`£ºÍ¬²½¡°´Ó¡±³¬Ê±£¬µ±brokerµÄ½ÇÉ«ÉèÖÃΪ¡°Í¬²½Ö÷¡±Ê±£¬µ«ÊÇÔÚÉèÖõÄͬ²½Ê±¼äÄÚ£¬Ä¬ÈÏΪ5s£¬Ã»ÓÐÍê³ÉÖ÷´ÓÖ®¼äµÄͬ²½£¬¾Í»áµÃµ½Õâ¸ö״̬¡£
+* `SLAVE_NOT_AVAILABLE`£º¡°´Ó¡±²»¿ÉÓ㬵±ÎÒÃÇÉèÖá°Í¬²½Ö÷¡±£¬µ«ÊÇûÓÐÅäÖá°´Ó¡±brokerʱ£¬»á·µ»ØÕâ¸ö״̬¡£
+* `SEND_OK`£ºÏûÏ¢·¢Ëͳɹ¦¡£
+
+ÔÙÀ´¿´¿´ÏûÏ¢ÖØ¸´ÓëÏûÏ¢¶ªÊ§£¬µ±Äã·¢ÏÖÄãµÄÏûÏ¢¶ªÊ§Ê±£¬Í¨³£ÓÐÁ½¸öÑ¡Ôñ£¬Ò»¸öÊǶª¾Í¶ª°É£¬ÕâÑùÏûÏ¢¾ÍÕæµÄ¶ªÁË£»ÁíÒ»¸öÑ¡ÔñÊÇÏûÏ¢ÖØÐ·¢ËÍ£¬ÕâÑùÓпÉÄÜÒýÆðÏûÏ¢ÖØ¸´¡£Í¨³£Çé¿öÏ£¬»¹ÊÇÍÆ¼öÖØÐ·¢Ë͵ģ¬ÎÒÃÇÔÚÏû·ÑÏûÏ¢µÄʱºòҪȥ³ýµôÖØ¸´µÄÏûÏ¢¡£
+
+·¢ËÍmessageµÄ´óСһ°ã²»³¬¹ý512k£¬Ä¬Èϵķ¢ËÍÏûÏ¢µÄ·½Ê½ÊÇͬ²½µÄ£¬·¢ËÍ·½·¨»áÒ»Ö±×èÈû£¬Ö±µ½µÈµ½·µ»ØµÄÏìÓ¦¡£Èç¹ûÄã±È½ÏÔÚÒâÐÔÄÜ£¬Ò²¿ÉÒÔÓÃ`send(msg, callback)`Òì²½µÄ·½Ê½·¢ËÍÏûÏ¢¡£
+
+## Ïû·ÑÕß
+
+¶à¸öÏû·ÑÕß¿ÉÒÔ×é³É**Ïû·ÑÕß×飨consumer group£©**£¬²»Í¬µÄ**Ïû·ÑÕß×é**¿ÉÒÔ¶©ÔÄÏàͬµÄTopic£¬Ò²¿ÉÒÔ¶ÀÁ¢µÄÏû·ÑTopic£¬Ã¿Ò»¸öÏû·ÑÕß×é¶¼ÓÐ×Ô¼ºµÄÏû·ÑÆ«ÒÆÁ¿¡£
+
+ÏûÏ¢µÄÏû·Ñ·½Ê½Ò»°ãÓÐÁ½ÖÖ£¬Ë³ÐòÏû·ÑºÍ²¢·¢Ïû·Ñ¡£
+
+* ˳ÐòÏû·Ñ£ºÏû·ÑÕß½«Ëø×¡ÏûÏ¢¶ÓÁУ¬È·±£ÏûÏ¢°´ÕÕ˳ÐòÒ»¸öÒ»¸öµÄ±»Ïû·Ñµô£¬Ë³ÐòÏû·Ñ»áÒýÆðÒ»²¿·ÖÐÔÄÜËðʧ¡£ÔÚÏû·ÑÏûÏ¢µÄʱºò£¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇÓ¦¸Ã·µ»Ø`SUSPEND_CURRENT_QUEUE_A_MOMENT`Õâ¸ö״̬£¬Ëü½«¸æËßÏû·ÑÕß¹ýÒ»¶Îʱ¼äºó£¬»áÖØÐÂÏû·ÑÕâ¸öÏûÏ¢¡£
+* ²¢·¢Ïû·Ñ£ºÏû·ÑÕß½«²¢·¢µÄÏû·ÑÏûÏ¢£¬ÕâÖÖ·½Ê½µÄÐÔÄܷdz£ºÃ£¬Ò²ÊÇÍÆ¼öµÄÏû·Ñ·½Ê½¡£ÔÚÏû·ÑµÄ¹ý³ÌÖУ¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇ·µ»Ø`RECONSUME_LATER`״̬£¬Ëü¸æËßÏû·ÑÕßÏÖÔÚ²»ÄÜÕýÈ·µÄÏû·ÑËü£¬¹ýÒ»¶Îʱ¼äºó£¬»áÔÙ´ÎÏû·ÑËü¡£
+
+ÔÚÏû·ÑÕßÄÚ²¿£¬ÊÇʹÓÃ`ThreadPoolExecutor`×÷ΪÏ̳߳صģ¬ÎÒÃÇ¿ÉÒÔͨ¹ý`setConsumeThreadMin`ºÍ`setConsumeThreadMax`ÉèÖÃ×îСÏû·ÑÏ̺߳Í×î´óÏû·ÑÏ̡߳£
+
+µ±Ò»¸öеÄÏû·ÑÕß×齨Á¢ÒÔºó£¬ËüÒª¾ö¶¨ÊÇ·ñÏû·Ñ֮ǰµÄÀúÊ·ÏûÏ¢£¬`CONSUME_FROM_LAST_OFFSET`½«ºöÂÔÀúÊ·ÏûÏ¢£¬Ïû·ÑеÄÏûÏ¢¡£`CONSUME_FROM_FIRST_OFFSET`½«Ïû·Ñ¶ÓÁÐÖеÄÿһ¸öÏûÏ¢£¬Ö®Ç°µÄÀúÊ·ÏûÏ¢Ò²»áÔÙÏû·ÑÒ»±é¡£`CONSUME_FROM_TIMESTAMP`¿ÉÒÔÖ¸¶¨Ïû·ÑÏûÏ¢µÄʱ¼ä£¬Ö¸¶¨Ê±¼äÒÔºóµÄÏûÏ¢»á±»Ïû·Ñ¡£
+
+Èç¹ûÄãµÄÓ¦Óò»ÄÜÈÝÈÌÖØ¸´Ïû·Ñ£¬ÄÇôÔÚÏû·ÑÏûÏ¢µÄ¹ý³ÌÖУ¬Òª×öºÃÏûÏ¢µÄУÑé¡£
+
+ºÃÁË£¬½ñÌì¾Íµ½ÕâÀï°É£¬ÏÂһƪÎÒÃǽ«½éÉÜRocketMQµÄ»·¾³´î½¨¡£
\ No newline at end of file
diff --git "a/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\345\271\277\346\222\255\344\270\216\345\273\266\350\277\237\346\266\210\346\201\257.md" "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\345\271\277\346\222\255\344\270\216\345\273\266\350\277\237\346\266\210\346\201\257.md"
new file mode 100644
index 0000000..7b22bce
--- /dev/null
+++ "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\345\271\277\346\222\255\344\270\216\345\273\266\350\277\237\346\266\210\346\201\257.md"
@@ -0,0 +1,62 @@
+# [RocketMQϵÁУ¨Ò»£©»ù±¾¸ÅÄî](https://www.cnblogs.com/boboooo/p/13038950.html)
+
+
+
+
+
+RocketMQÊǰ¢Àï³öÆ·µÄÒ»¿î¿ªÔ´µÄÏûÏ¢Öмä¼þ£¬ÈÃÆäÉùÃû´óÔëµÄ¾ÍÊÇËüµÄÊÂÎñÏûÏ¢µÄ¹¦ÄÜ¡£ÔÚÆóÒµÖУ¬ÏûÏ¢Öмä¼þÑ¡ÔñʹÓÃRocketMQµÄ»¹ÊÇͦ¶àµÄ£¬ÕâһϵÁеÄÎÄÕ¶¼ÊÇÕë¶ÔRocketMQµÄ£¬ÔÛÃÇÏÈ´ÓRocketMQµÄһЩ»ù±¾¸ÅÄîºÍ»·¾³µÄ´î½¨¿ªÊ¼ÁÄÆð¡£
+
+RocketMQÓÉ4²¿·Ö×é³É£¬·Ö±ðÊÇ£ºÃû³Æ·þÎñ£¨Name Server£©¡¢ÏûÏ¢¶ÓÁУ¨Brokers£©¡¢Éú²úÕߣ¨producer£©ºÍÏû·ÑÕߣ¨consumer£©¡£Õâ4²¿·Ö¶¼¿ÉÒÔ½øÐÐˮƽÀ©Õ¹£¬´Ó¶ø±ÜÃâµ¥µã¹ÊÕÏ£¬ÈçÏÂͼ£¬
+
+
+
+ÕâÊÇRocketMQ¹ÙÍøÉϵÄÒ»ÕÅͼ£¬·Ç³£ÇåÎúµÄÁгöÁË4¸ö²¿·Ö£¬²¢ÇÒ¶¼ÊǼ¯ÈºÄ£Ê½¡£ÏÂÃæÎÒÃǾͷֱð˵һ˵Õâ4²¿·Ö¡£
+
+## Ãû³Æ·þÎñ£¨NameServer£©
+
+Name Server°çÑݵĽÇÉ«ÊÇÒ»¸ö×¢²áÖÐÐÄ£¬ºÍZookeeperµÄ×÷Óò¶à¡£ËüµÄÖ÷Òª¹¦ÄÜÓÐÁ½¸ö£¬ÈçÏ£º
+
+* brokerµÄ¹ÜÀí£ºbroker¼¯Èº½«×Ô¼ºµÄÐÅÏ¢×¢²áµ½NameServer£¬NameServerÌṩÐÄÌø»úÖÆ¼ì²âÿһ¸öbrokerÊÇ·ñÕý³£¡£
+* ·ÓɹÜÀí£ºÃ¿Ò»¸öNameServer¶¼ÓÐÕû¸öbroker¼¯ÈººÍ¶ÓÁеÄÐÅÏ¢£¬ÒÔ±ã¿Í»§¶Ë£¨Éú²úÕߺÍÏû·ÑÕߣ©²éѯ¡£
+
+NameServerе÷×Å·Ö²¼Ê½ÏµÍ³ÖеÄÿһ¸ö×é¼þ£¬²¢ÇÒ¹ÜÀí×Åÿһ¸öTopicµÄ·ÓÉÐÅÏ¢¡£
+
+## Broker
+
+BrokerÖ÷ÒªÊÇ´æ´¢ÏûÏ¢£¬²¢ÇÒÌṩTopicµÄ»úÖÆ¡£ËüÌá¹©ÍÆºÍÀÁ½ÖÖģʽ£¬»¹ÓÐһЩÈÝÔֵĴëÊ©£¬±ÈÈç¿ÉÒÔÅäÖÃÏûÏ¢¸±±¾¡£ÏÂÃæÎÒÃÇ¿´Ò»¿´BrokcerµÄÖ÷´Ó»úÖÆ¡£
+
+BrokerµÄ½ÇÉ«·ÖΪ¡°Òì²½Ö÷¡±¡¢¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Èý¸ö½ÇÉ«¡£Èç¹ûÄã²»ÄÜÈÝÈÌÏûÏ¢µÄ¶ªÊ§£¬Äã¿ÉÒÔÅäÖÃÒ»¸ö¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öBroker£¬Èç¹ûÄã¾õµÃÏûÏ¢¶ªÊ§Ò²ÎÞËùν£¬Ö»Òª¶ÓÁпÉÓþÍokµÄ»°£¬Äã¿ÉÒÔÅäÖá°Òì²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öbroker¡£Èç¹ûÄãÖ»ÊÇÏë¼òµ¥µÄ´î½¨£¬Ö»ÅäÖÃÒ»¸ö¡°Òì²½Ö÷¡±£¬²»ÅäÖá°´Ó¡±Ò²ÊÇ¿ÉÒԵġ£
+
+ÉÏÃæÌáµ½µÄÊÇbrokerÖ®¼äµÄ±¸·Ý£¬brokerÀïµÄÐÅÏ¢Ò²ÊÇ¿ÉÒÔ±£´æµ½´ÅÅ̵쬱£´æµ½´ÅÅ̵ķ½Ê½Ò²ÓÐÁ½ÖÖ£¬ÍƼöµÄ·½Ê½ÊÇÒì²½±£´æ´ÅÅÌ£¬Í¬²½±£´æ´ÅÅÌÊǷdz£ËðºÄÐÔÄܵġ£
+
+## Éú²úÕß
+
+Éú²úÕßÖ§³Ö¼¯Èº²¿Êð£¬ËüÃÇÏòbroker¼¯Èº·¢ËÍÏûÏ¢£¬¶øÇÒÖ§³Ö¶àÖÖ¸ºÔؾùºâµÄ·½Ê½¡£
+
+µ±Éú²úÕßÏòbroker·¢ËÍÏûϢʱ£¬»áµÃµ½·¢Ëͽá¹û£¬·¢Ëͽá¹ûÖÐÓÐÒ»¸ö·¢ËÍ״̬¡£¼ÙÉèÎÒÃǵÄÅäÖÃÖУ¬ÏûÏ¢µÄÅäÖÃ`isWaitStoreMsgOK = true`£¬Õâ¸öÅäÖÃĬÈÏÒ²ÊÇ`true`£¬Èç¹ûÄãÅäÖÃΪ`false`£¬ÔÚ·¢ËÍÏûÏ¢µÄ¹ý³ÌÖУ¬Ö»Òª²»·¢ÉúÒì³££¬·¢Ëͽá¹û¶¼ÊÇ`SEND_OK`¡£µ±`isWaitStoreMsgOK = true`£¬·¢Ëͽá¹ûÓÐÒÔϼ¸ÖÖ£¬
+
+* `FLUSH_DISK_TIMEOUT`£º±£´æ´ÅÅ̳¬Ê±£¬µ±±£´æ´ÅÅ̵ķ½Ê½ÉèÖÃΪSYNC_FLUSH£¨Í¬²½£©£¬²¢ÇÒÔÚsyncFlushTimeoutÅäÖõÄʱ¼äÄÚ£¨Ä¬ÈÏ5s£©£¬Ã»ÓÐÍê³É±£´æ´ÅÅ̵͝×÷£¬½«»áµÃµ½Õâ¸ö״̬¡£
+* `FLUSH_SLAVE_TIMEOUT`£ºÍ¬²½¡°´Ó¡±³¬Ê±£¬µ±brokerµÄ½ÇÉ«ÉèÖÃΪ¡°Í¬²½Ö÷¡±Ê±£¬µ«ÊÇÔÚÉèÖõÄͬ²½Ê±¼äÄÚ£¬Ä¬ÈÏΪ5s£¬Ã»ÓÐÍê³ÉÖ÷´ÓÖ®¼äµÄͬ²½£¬¾Í»áµÃµ½Õâ¸ö״̬¡£
+* `SLAVE_NOT_AVAILABLE`£º¡°´Ó¡±²»¿ÉÓ㬵±ÎÒÃÇÉèÖá°Í¬²½Ö÷¡±£¬µ«ÊÇûÓÐÅäÖá°´Ó¡±brokerʱ£¬»á·µ»ØÕâ¸ö״̬¡£
+* `SEND_OK`£ºÏûÏ¢·¢Ëͳɹ¦¡£
+
+ÔÙÀ´¿´¿´ÏûÏ¢ÖØ¸´ÓëÏûÏ¢¶ªÊ§£¬µ±Äã·¢ÏÖÄãµÄÏûÏ¢¶ªÊ§Ê±£¬Í¨³£ÓÐÁ½¸öÑ¡Ôñ£¬Ò»¸öÊǶª¾Í¶ª°É£¬ÕâÑùÏûÏ¢¾ÍÕæµÄ¶ªÁË£»ÁíÒ»¸öÑ¡ÔñÊÇÏûÏ¢ÖØÐ·¢ËÍ£¬ÕâÑùÓпÉÄÜÒýÆðÏûÏ¢ÖØ¸´¡£Í¨³£Çé¿öÏ£¬»¹ÊÇÍÆ¼öÖØÐ·¢Ë͵ģ¬ÎÒÃÇÔÚÏû·ÑÏûÏ¢µÄʱºòҪȥ³ýµôÖØ¸´µÄÏûÏ¢¡£
+
+·¢ËÍmessageµÄ´óСһ°ã²»³¬¹ý512k£¬Ä¬Èϵķ¢ËÍÏûÏ¢µÄ·½Ê½ÊÇͬ²½µÄ£¬·¢ËÍ·½·¨»áÒ»Ö±×èÈû£¬Ö±µ½µÈµ½·µ»ØµÄÏìÓ¦¡£Èç¹ûÄã±È½ÏÔÚÒâÐÔÄÜ£¬Ò²¿ÉÒÔÓÃ`send(msg, callback)`Òì²½µÄ·½Ê½·¢ËÍÏûÏ¢¡£
+
+## Ïû·ÑÕß
+
+¶à¸öÏû·ÑÕß¿ÉÒÔ×é³É**Ïû·ÑÕß×飨consumer group£©**£¬²»Í¬µÄ**Ïû·ÑÕß×é**¿ÉÒÔ¶©ÔÄÏàͬµÄTopic£¬Ò²¿ÉÒÔ¶ÀÁ¢µÄÏû·ÑTopic£¬Ã¿Ò»¸öÏû·ÑÕß×é¶¼ÓÐ×Ô¼ºµÄÏû·ÑÆ«ÒÆÁ¿¡£
+
+ÏûÏ¢µÄÏû·Ñ·½Ê½Ò»°ãÓÐÁ½ÖÖ£¬Ë³ÐòÏû·ÑºÍ²¢·¢Ïû·Ñ¡£
+
+* ˳ÐòÏû·Ñ£ºÏû·ÑÕß½«Ëø×¡ÏûÏ¢¶ÓÁУ¬È·±£ÏûÏ¢°´ÕÕ˳ÐòÒ»¸öÒ»¸öµÄ±»Ïû·Ñµô£¬Ë³ÐòÏû·Ñ»áÒýÆðÒ»²¿·ÖÐÔÄÜËðʧ¡£ÔÚÏû·ÑÏûÏ¢µÄʱºò£¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇÓ¦¸Ã·µ»Ø`SUSPEND_CURRENT_QUEUE_A_MOMENT`Õâ¸ö״̬£¬Ëü½«¸æËßÏû·ÑÕß¹ýÒ»¶Îʱ¼äºó£¬»áÖØÐÂÏû·ÑÕâ¸öÏûÏ¢¡£
+* ²¢·¢Ïû·Ñ£ºÏû·ÑÕß½«²¢·¢µÄÏû·ÑÏûÏ¢£¬ÕâÖÖ·½Ê½µÄÐÔÄܷdz£ºÃ£¬Ò²ÊÇÍÆ¼öµÄÏû·Ñ·½Ê½¡£ÔÚÏû·ÑµÄ¹ý³ÌÖУ¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇ·µ»Ø`RECONSUME_LATER`״̬£¬Ëü¸æËßÏû·ÑÕßÏÖÔÚ²»ÄÜÕýÈ·µÄÏû·ÑËü£¬¹ýÒ»¶Îʱ¼äºó£¬»áÔÙ´ÎÏû·ÑËü¡£
+
+ÔÚÏû·ÑÕßÄÚ²¿£¬ÊÇʹÓÃ`ThreadPoolExecutor`×÷ΪÏ̳߳صģ¬ÎÒÃÇ¿ÉÒÔͨ¹ý`setConsumeThreadMin`ºÍ`setConsumeThreadMax`ÉèÖÃ×îСÏû·ÑÏ̺߳Í×î´óÏû·ÑÏ̡߳£
+
+µ±Ò»¸öеÄÏû·ÑÕß×齨Á¢ÒÔºó£¬ËüÒª¾ö¶¨ÊÇ·ñÏû·Ñ֮ǰµÄÀúÊ·ÏûÏ¢£¬`CONSUME_FROM_LAST_OFFSET`½«ºöÂÔÀúÊ·ÏûÏ¢£¬Ïû·ÑеÄÏûÏ¢¡£`CONSUME_FROM_FIRST_OFFSET`½«Ïû·Ñ¶ÓÁÐÖеÄÿһ¸öÏûÏ¢£¬Ö®Ç°µÄÀúÊ·ÏûÏ¢Ò²»áÔÙÏû·ÑÒ»±é¡£`CONSUME_FROM_TIMESTAMP`¿ÉÒÔÖ¸¶¨Ïû·ÑÏûÏ¢µÄʱ¼ä£¬Ö¸¶¨Ê±¼äÒÔºóµÄÏûÏ¢»á±»Ïû·Ñ¡£
+
+Èç¹ûÄãµÄÓ¦Óò»ÄÜÈÝÈÌÖØ¸´Ïû·Ñ£¬ÄÇôÔÚÏû·ÑÏûÏ¢µÄ¹ý³ÌÖУ¬Òª×öºÃÏûÏ¢µÄУÑé¡£
+
+ºÃÁË£¬½ñÌì¾Íµ½ÕâÀï°É£¬ÏÂһƪÎÒÃǽ«½éÉÜRocketMQµÄ»·¾³´î½¨¡£
\ No newline at end of file
diff --git "a/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\346\211\271\351\207\217\345\217\221\351\200\201\344\270\216\350\277\207\346\273\244.md" "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\346\211\271\351\207\217\345\217\221\351\200\201\344\270\216\350\277\207\346\273\244.md"
new file mode 100644
index 0000000..7b22bce
--- /dev/null
+++ "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\346\211\271\351\207\217\345\217\221\351\200\201\344\270\216\350\277\207\346\273\244.md"
@@ -0,0 +1,62 @@
+# [RocketMQϵÁУ¨Ò»£©»ù±¾¸ÅÄî](https://www.cnblogs.com/boboooo/p/13038950.html)
+
+
+
+
+
+RocketMQÊǰ¢Àï³öÆ·µÄÒ»¿î¿ªÔ´µÄÏûÏ¢Öмä¼þ£¬ÈÃÆäÉùÃû´óÔëµÄ¾ÍÊÇËüµÄÊÂÎñÏûÏ¢µÄ¹¦ÄÜ¡£ÔÚÆóÒµÖУ¬ÏûÏ¢Öмä¼þÑ¡ÔñʹÓÃRocketMQµÄ»¹ÊÇͦ¶àµÄ£¬ÕâһϵÁеÄÎÄÕ¶¼ÊÇÕë¶ÔRocketMQµÄ£¬ÔÛÃÇÏÈ´ÓRocketMQµÄһЩ»ù±¾¸ÅÄîºÍ»·¾³µÄ´î½¨¿ªÊ¼ÁÄÆð¡£
+
+RocketMQÓÉ4²¿·Ö×é³É£¬·Ö±ðÊÇ£ºÃû³Æ·þÎñ£¨Name Server£©¡¢ÏûÏ¢¶ÓÁУ¨Brokers£©¡¢Éú²úÕߣ¨producer£©ºÍÏû·ÑÕߣ¨consumer£©¡£Õâ4²¿·Ö¶¼¿ÉÒÔ½øÐÐˮƽÀ©Õ¹£¬´Ó¶ø±ÜÃâµ¥µã¹ÊÕÏ£¬ÈçÏÂͼ£¬
+
+
+
+ÕâÊÇRocketMQ¹ÙÍøÉϵÄÒ»ÕÅͼ£¬·Ç³£ÇåÎúµÄÁгöÁË4¸ö²¿·Ö£¬²¢ÇÒ¶¼ÊǼ¯ÈºÄ£Ê½¡£ÏÂÃæÎÒÃǾͷֱð˵һ˵Õâ4²¿·Ö¡£
+
+## Ãû³Æ·þÎñ£¨NameServer£©
+
+Name Server°çÑݵĽÇÉ«ÊÇÒ»¸ö×¢²áÖÐÐÄ£¬ºÍZookeeperµÄ×÷Óò¶à¡£ËüµÄÖ÷Òª¹¦ÄÜÓÐÁ½¸ö£¬ÈçÏ£º
+
+* brokerµÄ¹ÜÀí£ºbroker¼¯Èº½«×Ô¼ºµÄÐÅÏ¢×¢²áµ½NameServer£¬NameServerÌṩÐÄÌø»úÖÆ¼ì²âÿһ¸öbrokerÊÇ·ñÕý³£¡£
+* ·ÓɹÜÀí£ºÃ¿Ò»¸öNameServer¶¼ÓÐÕû¸öbroker¼¯ÈººÍ¶ÓÁеÄÐÅÏ¢£¬ÒÔ±ã¿Í»§¶Ë£¨Éú²úÕߺÍÏû·ÑÕߣ©²éѯ¡£
+
+NameServerе÷×Å·Ö²¼Ê½ÏµÍ³ÖеÄÿһ¸ö×é¼þ£¬²¢ÇÒ¹ÜÀí×Åÿһ¸öTopicµÄ·ÓÉÐÅÏ¢¡£
+
+## Broker
+
+BrokerÖ÷ÒªÊÇ´æ´¢ÏûÏ¢£¬²¢ÇÒÌṩTopicµÄ»úÖÆ¡£ËüÌá¹©ÍÆºÍÀÁ½ÖÖģʽ£¬»¹ÓÐһЩÈÝÔֵĴëÊ©£¬±ÈÈç¿ÉÒÔÅäÖÃÏûÏ¢¸±±¾¡£ÏÂÃæÎÒÃÇ¿´Ò»¿´BrokcerµÄÖ÷´Ó»úÖÆ¡£
+
+BrokerµÄ½ÇÉ«·ÖΪ¡°Òì²½Ö÷¡±¡¢¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Èý¸ö½ÇÉ«¡£Èç¹ûÄã²»ÄÜÈÝÈÌÏûÏ¢µÄ¶ªÊ§£¬Äã¿ÉÒÔÅäÖÃÒ»¸ö¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öBroker£¬Èç¹ûÄã¾õµÃÏûÏ¢¶ªÊ§Ò²ÎÞËùν£¬Ö»Òª¶ÓÁпÉÓþÍokµÄ»°£¬Äã¿ÉÒÔÅäÖá°Òì²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öbroker¡£Èç¹ûÄãÖ»ÊÇÏë¼òµ¥µÄ´î½¨£¬Ö»ÅäÖÃÒ»¸ö¡°Òì²½Ö÷¡±£¬²»ÅäÖá°´Ó¡±Ò²ÊÇ¿ÉÒԵġ£
+
+ÉÏÃæÌáµ½µÄÊÇbrokerÖ®¼äµÄ±¸·Ý£¬brokerÀïµÄÐÅÏ¢Ò²ÊÇ¿ÉÒÔ±£´æµ½´ÅÅ̵쬱£´æµ½´ÅÅ̵ķ½Ê½Ò²ÓÐÁ½ÖÖ£¬ÍƼöµÄ·½Ê½ÊÇÒì²½±£´æ´ÅÅÌ£¬Í¬²½±£´æ´ÅÅÌÊǷdz£ËðºÄÐÔÄܵġ£
+
+## Éú²úÕß
+
+Éú²úÕßÖ§³Ö¼¯Èº²¿Êð£¬ËüÃÇÏòbroker¼¯Èº·¢ËÍÏûÏ¢£¬¶øÇÒÖ§³Ö¶àÖÖ¸ºÔؾùºâµÄ·½Ê½¡£
+
+µ±Éú²úÕßÏòbroker·¢ËÍÏûϢʱ£¬»áµÃµ½·¢Ëͽá¹û£¬·¢Ëͽá¹ûÖÐÓÐÒ»¸ö·¢ËÍ״̬¡£¼ÙÉèÎÒÃǵÄÅäÖÃÖУ¬ÏûÏ¢µÄÅäÖÃ`isWaitStoreMsgOK = true`£¬Õâ¸öÅäÖÃĬÈÏÒ²ÊÇ`true`£¬Èç¹ûÄãÅäÖÃΪ`false`£¬ÔÚ·¢ËÍÏûÏ¢µÄ¹ý³ÌÖУ¬Ö»Òª²»·¢ÉúÒì³££¬·¢Ëͽá¹û¶¼ÊÇ`SEND_OK`¡£µ±`isWaitStoreMsgOK = true`£¬·¢Ëͽá¹ûÓÐÒÔϼ¸ÖÖ£¬
+
+* `FLUSH_DISK_TIMEOUT`£º±£´æ´ÅÅ̳¬Ê±£¬µ±±£´æ´ÅÅ̵ķ½Ê½ÉèÖÃΪSYNC_FLUSH£¨Í¬²½£©£¬²¢ÇÒÔÚsyncFlushTimeoutÅäÖõÄʱ¼äÄÚ£¨Ä¬ÈÏ5s£©£¬Ã»ÓÐÍê³É±£´æ´ÅÅ̵͝×÷£¬½«»áµÃµ½Õâ¸ö״̬¡£
+* `FLUSH_SLAVE_TIMEOUT`£ºÍ¬²½¡°´Ó¡±³¬Ê±£¬µ±brokerµÄ½ÇÉ«ÉèÖÃΪ¡°Í¬²½Ö÷¡±Ê±£¬µ«ÊÇÔÚÉèÖõÄͬ²½Ê±¼äÄÚ£¬Ä¬ÈÏΪ5s£¬Ã»ÓÐÍê³ÉÖ÷´ÓÖ®¼äµÄͬ²½£¬¾Í»áµÃµ½Õâ¸ö״̬¡£
+* `SLAVE_NOT_AVAILABLE`£º¡°´Ó¡±²»¿ÉÓ㬵±ÎÒÃÇÉèÖá°Í¬²½Ö÷¡±£¬µ«ÊÇûÓÐÅäÖá°´Ó¡±brokerʱ£¬»á·µ»ØÕâ¸ö״̬¡£
+* `SEND_OK`£ºÏûÏ¢·¢Ëͳɹ¦¡£
+
+ÔÙÀ´¿´¿´ÏûÏ¢ÖØ¸´ÓëÏûÏ¢¶ªÊ§£¬µ±Äã·¢ÏÖÄãµÄÏûÏ¢¶ªÊ§Ê±£¬Í¨³£ÓÐÁ½¸öÑ¡Ôñ£¬Ò»¸öÊǶª¾Í¶ª°É£¬ÕâÑùÏûÏ¢¾ÍÕæµÄ¶ªÁË£»ÁíÒ»¸öÑ¡ÔñÊÇÏûÏ¢ÖØÐ·¢ËÍ£¬ÕâÑùÓпÉÄÜÒýÆðÏûÏ¢ÖØ¸´¡£Í¨³£Çé¿öÏ£¬»¹ÊÇÍÆ¼öÖØÐ·¢Ë͵ģ¬ÎÒÃÇÔÚÏû·ÑÏûÏ¢µÄʱºòҪȥ³ýµôÖØ¸´µÄÏûÏ¢¡£
+
+·¢ËÍmessageµÄ´óСһ°ã²»³¬¹ý512k£¬Ä¬Èϵķ¢ËÍÏûÏ¢µÄ·½Ê½ÊÇͬ²½µÄ£¬·¢ËÍ·½·¨»áÒ»Ö±×èÈû£¬Ö±µ½µÈµ½·µ»ØµÄÏìÓ¦¡£Èç¹ûÄã±È½ÏÔÚÒâÐÔÄÜ£¬Ò²¿ÉÒÔÓÃ`send(msg, callback)`Òì²½µÄ·½Ê½·¢ËÍÏûÏ¢¡£
+
+## Ïû·ÑÕß
+
+¶à¸öÏû·ÑÕß¿ÉÒÔ×é³É**Ïû·ÑÕß×飨consumer group£©**£¬²»Í¬µÄ**Ïû·ÑÕß×é**¿ÉÒÔ¶©ÔÄÏàͬµÄTopic£¬Ò²¿ÉÒÔ¶ÀÁ¢µÄÏû·ÑTopic£¬Ã¿Ò»¸öÏû·ÑÕß×é¶¼ÓÐ×Ô¼ºµÄÏû·ÑÆ«ÒÆÁ¿¡£
+
+ÏûÏ¢µÄÏû·Ñ·½Ê½Ò»°ãÓÐÁ½ÖÖ£¬Ë³ÐòÏû·ÑºÍ²¢·¢Ïû·Ñ¡£
+
+* ˳ÐòÏû·Ñ£ºÏû·ÑÕß½«Ëø×¡ÏûÏ¢¶ÓÁУ¬È·±£ÏûÏ¢°´ÕÕ˳ÐòÒ»¸öÒ»¸öµÄ±»Ïû·Ñµô£¬Ë³ÐòÏû·Ñ»áÒýÆðÒ»²¿·ÖÐÔÄÜËðʧ¡£ÔÚÏû·ÑÏûÏ¢µÄʱºò£¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇÓ¦¸Ã·µ»Ø`SUSPEND_CURRENT_QUEUE_A_MOMENT`Õâ¸ö״̬£¬Ëü½«¸æËßÏû·ÑÕß¹ýÒ»¶Îʱ¼äºó£¬»áÖØÐÂÏû·ÑÕâ¸öÏûÏ¢¡£
+* ²¢·¢Ïû·Ñ£ºÏû·ÑÕß½«²¢·¢µÄÏû·ÑÏûÏ¢£¬ÕâÖÖ·½Ê½µÄÐÔÄܷdz£ºÃ£¬Ò²ÊÇÍÆ¼öµÄÏû·Ñ·½Ê½¡£ÔÚÏû·ÑµÄ¹ý³ÌÖУ¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇ·µ»Ø`RECONSUME_LATER`״̬£¬Ëü¸æËßÏû·ÑÕßÏÖÔÚ²»ÄÜÕýÈ·µÄÏû·ÑËü£¬¹ýÒ»¶Îʱ¼äºó£¬»áÔÙ´ÎÏû·ÑËü¡£
+
+ÔÚÏû·ÑÕßÄÚ²¿£¬ÊÇʹÓÃ`ThreadPoolExecutor`×÷ΪÏ̳߳صģ¬ÎÒÃÇ¿ÉÒÔͨ¹ý`setConsumeThreadMin`ºÍ`setConsumeThreadMax`ÉèÖÃ×îСÏû·ÑÏ̺߳Í×î´óÏû·ÑÏ̡߳£
+
+µ±Ò»¸öеÄÏû·ÑÕß×齨Á¢ÒÔºó£¬ËüÒª¾ö¶¨ÊÇ·ñÏû·Ñ֮ǰµÄÀúÊ·ÏûÏ¢£¬`CONSUME_FROM_LAST_OFFSET`½«ºöÂÔÀúÊ·ÏûÏ¢£¬Ïû·ÑеÄÏûÏ¢¡£`CONSUME_FROM_FIRST_OFFSET`½«Ïû·Ñ¶ÓÁÐÖеÄÿһ¸öÏûÏ¢£¬Ö®Ç°µÄÀúÊ·ÏûÏ¢Ò²»áÔÙÏû·ÑÒ»±é¡£`CONSUME_FROM_TIMESTAMP`¿ÉÒÔÖ¸¶¨Ïû·ÑÏûÏ¢µÄʱ¼ä£¬Ö¸¶¨Ê±¼äÒÔºóµÄÏûÏ¢»á±»Ïû·Ñ¡£
+
+Èç¹ûÄãµÄÓ¦Óò»ÄÜÈÝÈÌÖØ¸´Ïû·Ñ£¬ÄÇôÔÚÏû·ÑÏûÏ¢µÄ¹ý³ÌÖУ¬Òª×öºÃÏûÏ¢µÄУÑé¡£
+
+ºÃÁË£¬½ñÌì¾Íµ½ÕâÀï°É£¬ÏÂһƪÎÒÃǽ«½éÉÜRocketMQµÄ»·¾³´î½¨¡£
\ No newline at end of file
diff --git "a/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\346\266\210\346\201\257\347\232\204\347\224\237\344\272\247\344\270\216\346\266\210\350\264\271.md" "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\346\266\210\346\201\257\347\232\204\347\224\237\344\272\247\344\270\216\346\266\210\350\264\271.md"
new file mode 100644
index 0000000..7b22bce
--- /dev/null
+++ "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\346\266\210\346\201\257\347\232\204\347\224\237\344\272\247\344\270\216\346\266\210\350\264\271.md"
@@ -0,0 +1,62 @@
+# [RocketMQϵÁУ¨Ò»£©»ù±¾¸ÅÄî](https://www.cnblogs.com/boboooo/p/13038950.html)
+
+
+
+
+
+RocketMQÊǰ¢Àï³öÆ·µÄÒ»¿î¿ªÔ´µÄÏûÏ¢Öмä¼þ£¬ÈÃÆäÉùÃû´óÔëµÄ¾ÍÊÇËüµÄÊÂÎñÏûÏ¢µÄ¹¦ÄÜ¡£ÔÚÆóÒµÖУ¬ÏûÏ¢Öмä¼þÑ¡ÔñʹÓÃRocketMQµÄ»¹ÊÇͦ¶àµÄ£¬ÕâһϵÁеÄÎÄÕ¶¼ÊÇÕë¶ÔRocketMQµÄ£¬ÔÛÃÇÏÈ´ÓRocketMQµÄһЩ»ù±¾¸ÅÄîºÍ»·¾³µÄ´î½¨¿ªÊ¼ÁÄÆð¡£
+
+RocketMQÓÉ4²¿·Ö×é³É£¬·Ö±ðÊÇ£ºÃû³Æ·þÎñ£¨Name Server£©¡¢ÏûÏ¢¶ÓÁУ¨Brokers£©¡¢Éú²úÕߣ¨producer£©ºÍÏû·ÑÕߣ¨consumer£©¡£Õâ4²¿·Ö¶¼¿ÉÒÔ½øÐÐˮƽÀ©Õ¹£¬´Ó¶ø±ÜÃâµ¥µã¹ÊÕÏ£¬ÈçÏÂͼ£¬
+
+
+
+ÕâÊÇRocketMQ¹ÙÍøÉϵÄÒ»ÕÅͼ£¬·Ç³£ÇåÎúµÄÁгöÁË4¸ö²¿·Ö£¬²¢ÇÒ¶¼ÊǼ¯ÈºÄ£Ê½¡£ÏÂÃæÎÒÃǾͷֱð˵һ˵Õâ4²¿·Ö¡£
+
+## Ãû³Æ·þÎñ£¨NameServer£©
+
+Name Server°çÑݵĽÇÉ«ÊÇÒ»¸ö×¢²áÖÐÐÄ£¬ºÍZookeeperµÄ×÷Óò¶à¡£ËüµÄÖ÷Òª¹¦ÄÜÓÐÁ½¸ö£¬ÈçÏ£º
+
+* brokerµÄ¹ÜÀí£ºbroker¼¯Èº½«×Ô¼ºµÄÐÅÏ¢×¢²áµ½NameServer£¬NameServerÌṩÐÄÌø»úÖÆ¼ì²âÿһ¸öbrokerÊÇ·ñÕý³£¡£
+* ·ÓɹÜÀí£ºÃ¿Ò»¸öNameServer¶¼ÓÐÕû¸öbroker¼¯ÈººÍ¶ÓÁеÄÐÅÏ¢£¬ÒÔ±ã¿Í»§¶Ë£¨Éú²úÕߺÍÏû·ÑÕߣ©²éѯ¡£
+
+NameServerе÷×Å·Ö²¼Ê½ÏµÍ³ÖеÄÿһ¸ö×é¼þ£¬²¢ÇÒ¹ÜÀí×Åÿһ¸öTopicµÄ·ÓÉÐÅÏ¢¡£
+
+## Broker
+
+BrokerÖ÷ÒªÊÇ´æ´¢ÏûÏ¢£¬²¢ÇÒÌṩTopicµÄ»úÖÆ¡£ËüÌá¹©ÍÆºÍÀÁ½ÖÖģʽ£¬»¹ÓÐһЩÈÝÔֵĴëÊ©£¬±ÈÈç¿ÉÒÔÅäÖÃÏûÏ¢¸±±¾¡£ÏÂÃæÎÒÃÇ¿´Ò»¿´BrokcerµÄÖ÷´Ó»úÖÆ¡£
+
+BrokerµÄ½ÇÉ«·ÖΪ¡°Òì²½Ö÷¡±¡¢¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Èý¸ö½ÇÉ«¡£Èç¹ûÄã²»ÄÜÈÝÈÌÏûÏ¢µÄ¶ªÊ§£¬Äã¿ÉÒÔÅäÖÃÒ»¸ö¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öBroker£¬Èç¹ûÄã¾õµÃÏûÏ¢¶ªÊ§Ò²ÎÞËùν£¬Ö»Òª¶ÓÁпÉÓþÍokµÄ»°£¬Äã¿ÉÒÔÅäÖá°Òì²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öbroker¡£Èç¹ûÄãÖ»ÊÇÏë¼òµ¥µÄ´î½¨£¬Ö»ÅäÖÃÒ»¸ö¡°Òì²½Ö÷¡±£¬²»ÅäÖá°´Ó¡±Ò²ÊÇ¿ÉÒԵġ£
+
+ÉÏÃæÌáµ½µÄÊÇbrokerÖ®¼äµÄ±¸·Ý£¬brokerÀïµÄÐÅÏ¢Ò²ÊÇ¿ÉÒÔ±£´æµ½´ÅÅ̵쬱£´æµ½´ÅÅ̵ķ½Ê½Ò²ÓÐÁ½ÖÖ£¬ÍƼöµÄ·½Ê½ÊÇÒì²½±£´æ´ÅÅÌ£¬Í¬²½±£´æ´ÅÅÌÊǷdz£ËðºÄÐÔÄܵġ£
+
+## Éú²úÕß
+
+Éú²úÕßÖ§³Ö¼¯Èº²¿Êð£¬ËüÃÇÏòbroker¼¯Èº·¢ËÍÏûÏ¢£¬¶øÇÒÖ§³Ö¶àÖÖ¸ºÔؾùºâµÄ·½Ê½¡£
+
+µ±Éú²úÕßÏòbroker·¢ËÍÏûϢʱ£¬»áµÃµ½·¢Ëͽá¹û£¬·¢Ëͽá¹ûÖÐÓÐÒ»¸ö·¢ËÍ״̬¡£¼ÙÉèÎÒÃǵÄÅäÖÃÖУ¬ÏûÏ¢µÄÅäÖÃ`isWaitStoreMsgOK = true`£¬Õâ¸öÅäÖÃĬÈÏÒ²ÊÇ`true`£¬Èç¹ûÄãÅäÖÃΪ`false`£¬ÔÚ·¢ËÍÏûÏ¢µÄ¹ý³ÌÖУ¬Ö»Òª²»·¢ÉúÒì³££¬·¢Ëͽá¹û¶¼ÊÇ`SEND_OK`¡£µ±`isWaitStoreMsgOK = true`£¬·¢Ëͽá¹ûÓÐÒÔϼ¸ÖÖ£¬
+
+* `FLUSH_DISK_TIMEOUT`£º±£´æ´ÅÅ̳¬Ê±£¬µ±±£´æ´ÅÅ̵ķ½Ê½ÉèÖÃΪSYNC_FLUSH£¨Í¬²½£©£¬²¢ÇÒÔÚsyncFlushTimeoutÅäÖõÄʱ¼äÄÚ£¨Ä¬ÈÏ5s£©£¬Ã»ÓÐÍê³É±£´æ´ÅÅ̵͝×÷£¬½«»áµÃµ½Õâ¸ö״̬¡£
+* `FLUSH_SLAVE_TIMEOUT`£ºÍ¬²½¡°´Ó¡±³¬Ê±£¬µ±brokerµÄ½ÇÉ«ÉèÖÃΪ¡°Í¬²½Ö÷¡±Ê±£¬µ«ÊÇÔÚÉèÖõÄͬ²½Ê±¼äÄÚ£¬Ä¬ÈÏΪ5s£¬Ã»ÓÐÍê³ÉÖ÷´ÓÖ®¼äµÄͬ²½£¬¾Í»áµÃµ½Õâ¸ö״̬¡£
+* `SLAVE_NOT_AVAILABLE`£º¡°´Ó¡±²»¿ÉÓ㬵±ÎÒÃÇÉèÖá°Í¬²½Ö÷¡±£¬µ«ÊÇûÓÐÅäÖá°´Ó¡±brokerʱ£¬»á·µ»ØÕâ¸ö״̬¡£
+* `SEND_OK`£ºÏûÏ¢·¢Ëͳɹ¦¡£
+
+ÔÙÀ´¿´¿´ÏûÏ¢ÖØ¸´ÓëÏûÏ¢¶ªÊ§£¬µ±Äã·¢ÏÖÄãµÄÏûÏ¢¶ªÊ§Ê±£¬Í¨³£ÓÐÁ½¸öÑ¡Ôñ£¬Ò»¸öÊǶª¾Í¶ª°É£¬ÕâÑùÏûÏ¢¾ÍÕæµÄ¶ªÁË£»ÁíÒ»¸öÑ¡ÔñÊÇÏûÏ¢ÖØÐ·¢ËÍ£¬ÕâÑùÓпÉÄÜÒýÆðÏûÏ¢ÖØ¸´¡£Í¨³£Çé¿öÏ£¬»¹ÊÇÍÆ¼öÖØÐ·¢Ë͵ģ¬ÎÒÃÇÔÚÏû·ÑÏûÏ¢µÄʱºòҪȥ³ýµôÖØ¸´µÄÏûÏ¢¡£
+
+·¢ËÍmessageµÄ´óСһ°ã²»³¬¹ý512k£¬Ä¬Èϵķ¢ËÍÏûÏ¢µÄ·½Ê½ÊÇͬ²½µÄ£¬·¢ËÍ·½·¨»áÒ»Ö±×èÈû£¬Ö±µ½µÈµ½·µ»ØµÄÏìÓ¦¡£Èç¹ûÄã±È½ÏÔÚÒâÐÔÄÜ£¬Ò²¿ÉÒÔÓÃ`send(msg, callback)`Òì²½µÄ·½Ê½·¢ËÍÏûÏ¢¡£
+
+## Ïû·ÑÕß
+
+¶à¸öÏû·ÑÕß¿ÉÒÔ×é³É**Ïû·ÑÕß×飨consumer group£©**£¬²»Í¬µÄ**Ïû·ÑÕß×é**¿ÉÒÔ¶©ÔÄÏàͬµÄTopic£¬Ò²¿ÉÒÔ¶ÀÁ¢µÄÏû·ÑTopic£¬Ã¿Ò»¸öÏû·ÑÕß×é¶¼ÓÐ×Ô¼ºµÄÏû·ÑÆ«ÒÆÁ¿¡£
+
+ÏûÏ¢µÄÏû·Ñ·½Ê½Ò»°ãÓÐÁ½ÖÖ£¬Ë³ÐòÏû·ÑºÍ²¢·¢Ïû·Ñ¡£
+
+* ˳ÐòÏû·Ñ£ºÏû·ÑÕß½«Ëø×¡ÏûÏ¢¶ÓÁУ¬È·±£ÏûÏ¢°´ÕÕ˳ÐòÒ»¸öÒ»¸öµÄ±»Ïû·Ñµô£¬Ë³ÐòÏû·Ñ»áÒýÆðÒ»²¿·ÖÐÔÄÜËðʧ¡£ÔÚÏû·ÑÏûÏ¢µÄʱºò£¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇÓ¦¸Ã·µ»Ø`SUSPEND_CURRENT_QUEUE_A_MOMENT`Õâ¸ö״̬£¬Ëü½«¸æËßÏû·ÑÕß¹ýÒ»¶Îʱ¼äºó£¬»áÖØÐÂÏû·ÑÕâ¸öÏûÏ¢¡£
+* ²¢·¢Ïû·Ñ£ºÏû·ÑÕß½«²¢·¢µÄÏû·ÑÏûÏ¢£¬ÕâÖÖ·½Ê½µÄÐÔÄܷdz£ºÃ£¬Ò²ÊÇÍÆ¼öµÄÏû·Ñ·½Ê½¡£ÔÚÏû·ÑµÄ¹ý³ÌÖУ¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇ·µ»Ø`RECONSUME_LATER`״̬£¬Ëü¸æËßÏû·ÑÕßÏÖÔÚ²»ÄÜÕýÈ·µÄÏû·ÑËü£¬¹ýÒ»¶Îʱ¼äºó£¬»áÔÙ´ÎÏû·ÑËü¡£
+
+ÔÚÏû·ÑÕßÄÚ²¿£¬ÊÇʹÓÃ`ThreadPoolExecutor`×÷ΪÏ̳߳صģ¬ÎÒÃÇ¿ÉÒÔͨ¹ý`setConsumeThreadMin`ºÍ`setConsumeThreadMax`ÉèÖÃ×îСÏû·ÑÏ̺߳Í×î´óÏû·ÑÏ̡߳£
+
+µ±Ò»¸öеÄÏû·ÑÕß×齨Á¢ÒÔºó£¬ËüÒª¾ö¶¨ÊÇ·ñÏû·Ñ֮ǰµÄÀúÊ·ÏûÏ¢£¬`CONSUME_FROM_LAST_OFFSET`½«ºöÂÔÀúÊ·ÏûÏ¢£¬Ïû·ÑеÄÏûÏ¢¡£`CONSUME_FROM_FIRST_OFFSET`½«Ïû·Ñ¶ÓÁÐÖеÄÿһ¸öÏûÏ¢£¬Ö®Ç°µÄÀúÊ·ÏûÏ¢Ò²»áÔÙÏû·ÑÒ»±é¡£`CONSUME_FROM_TIMESTAMP`¿ÉÒÔÖ¸¶¨Ïû·ÑÏûÏ¢µÄʱ¼ä£¬Ö¸¶¨Ê±¼äÒÔºóµÄÏûÏ¢»á±»Ïû·Ñ¡£
+
+Èç¹ûÄãµÄÓ¦Óò»ÄÜÈÝÈÌÖØ¸´Ïû·Ñ£¬ÄÇôÔÚÏû·ÑÏûÏ¢µÄ¹ý³ÌÖУ¬Òª×öºÃÏûÏ¢µÄУÑé¡£
+
+ºÃÁË£¬½ñÌì¾Íµ½ÕâÀï°É£¬ÏÂһƪÎÒÃǽ«½éÉÜRocketMQµÄ»·¾³´î½¨¡£
\ No newline at end of file
diff --git "a/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\347\216\257\345\242\203\346\220\255\345\273\272.md"
new file mode 100644
index 0000000..7b22bce
--- /dev/null
+++ "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\347\216\257\345\242\203\346\220\255\345\273\272.md"
@@ -0,0 +1,62 @@
+# [RocketMQϵÁУ¨Ò»£©»ù±¾¸ÅÄî](https://www.cnblogs.com/boboooo/p/13038950.html)
+
+
+
+
+
+RocketMQÊǰ¢Àï³öÆ·µÄÒ»¿î¿ªÔ´µÄÏûÏ¢Öмä¼þ£¬ÈÃÆäÉùÃû´óÔëµÄ¾ÍÊÇËüµÄÊÂÎñÏûÏ¢µÄ¹¦ÄÜ¡£ÔÚÆóÒµÖУ¬ÏûÏ¢Öмä¼þÑ¡ÔñʹÓÃRocketMQµÄ»¹ÊÇͦ¶àµÄ£¬ÕâһϵÁеÄÎÄÕ¶¼ÊÇÕë¶ÔRocketMQµÄ£¬ÔÛÃÇÏÈ´ÓRocketMQµÄһЩ»ù±¾¸ÅÄîºÍ»·¾³µÄ´î½¨¿ªÊ¼ÁÄÆð¡£
+
+RocketMQÓÉ4²¿·Ö×é³É£¬·Ö±ðÊÇ£ºÃû³Æ·þÎñ£¨Name Server£©¡¢ÏûÏ¢¶ÓÁУ¨Brokers£©¡¢Éú²úÕߣ¨producer£©ºÍÏû·ÑÕߣ¨consumer£©¡£Õâ4²¿·Ö¶¼¿ÉÒÔ½øÐÐˮƽÀ©Õ¹£¬´Ó¶ø±ÜÃâµ¥µã¹ÊÕÏ£¬ÈçÏÂͼ£¬
+
+
+
+ÕâÊÇRocketMQ¹ÙÍøÉϵÄÒ»ÕÅͼ£¬·Ç³£ÇåÎúµÄÁгöÁË4¸ö²¿·Ö£¬²¢ÇÒ¶¼ÊǼ¯ÈºÄ£Ê½¡£ÏÂÃæÎÒÃǾͷֱð˵һ˵Õâ4²¿·Ö¡£
+
+## Ãû³Æ·þÎñ£¨NameServer£©
+
+Name Server°çÑݵĽÇÉ«ÊÇÒ»¸ö×¢²áÖÐÐÄ£¬ºÍZookeeperµÄ×÷Óò¶à¡£ËüµÄÖ÷Òª¹¦ÄÜÓÐÁ½¸ö£¬ÈçÏ£º
+
+* brokerµÄ¹ÜÀí£ºbroker¼¯Èº½«×Ô¼ºµÄÐÅÏ¢×¢²áµ½NameServer£¬NameServerÌṩÐÄÌø»úÖÆ¼ì²âÿһ¸öbrokerÊÇ·ñÕý³£¡£
+* ·ÓɹÜÀí£ºÃ¿Ò»¸öNameServer¶¼ÓÐÕû¸öbroker¼¯ÈººÍ¶ÓÁеÄÐÅÏ¢£¬ÒÔ±ã¿Í»§¶Ë£¨Éú²úÕߺÍÏû·ÑÕߣ©²éѯ¡£
+
+NameServerе÷×Å·Ö²¼Ê½ÏµÍ³ÖеÄÿһ¸ö×é¼þ£¬²¢ÇÒ¹ÜÀí×Åÿһ¸öTopicµÄ·ÓÉÐÅÏ¢¡£
+
+## Broker
+
+BrokerÖ÷ÒªÊÇ´æ´¢ÏûÏ¢£¬²¢ÇÒÌṩTopicµÄ»úÖÆ¡£ËüÌá¹©ÍÆºÍÀÁ½ÖÖģʽ£¬»¹ÓÐһЩÈÝÔֵĴëÊ©£¬±ÈÈç¿ÉÒÔÅäÖÃÏûÏ¢¸±±¾¡£ÏÂÃæÎÒÃÇ¿´Ò»¿´BrokcerµÄÖ÷´Ó»úÖÆ¡£
+
+BrokerµÄ½ÇÉ«·ÖΪ¡°Òì²½Ö÷¡±¡¢¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Èý¸ö½ÇÉ«¡£Èç¹ûÄã²»ÄÜÈÝÈÌÏûÏ¢µÄ¶ªÊ§£¬Äã¿ÉÒÔÅäÖÃÒ»¸ö¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öBroker£¬Èç¹ûÄã¾õµÃÏûÏ¢¶ªÊ§Ò²ÎÞËùν£¬Ö»Òª¶ÓÁпÉÓþÍokµÄ»°£¬Äã¿ÉÒÔÅäÖá°Òì²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öbroker¡£Èç¹ûÄãÖ»ÊÇÏë¼òµ¥µÄ´î½¨£¬Ö»ÅäÖÃÒ»¸ö¡°Òì²½Ö÷¡±£¬²»ÅäÖá°´Ó¡±Ò²ÊÇ¿ÉÒԵġ£
+
+ÉÏÃæÌáµ½µÄÊÇbrokerÖ®¼äµÄ±¸·Ý£¬brokerÀïµÄÐÅÏ¢Ò²ÊÇ¿ÉÒÔ±£´æµ½´ÅÅ̵쬱£´æµ½´ÅÅ̵ķ½Ê½Ò²ÓÐÁ½ÖÖ£¬ÍƼöµÄ·½Ê½ÊÇÒì²½±£´æ´ÅÅÌ£¬Í¬²½±£´æ´ÅÅÌÊǷdz£ËðºÄÐÔÄܵġ£
+
+## Éú²úÕß
+
+Éú²úÕßÖ§³Ö¼¯Èº²¿Êð£¬ËüÃÇÏòbroker¼¯Èº·¢ËÍÏûÏ¢£¬¶øÇÒÖ§³Ö¶àÖÖ¸ºÔؾùºâµÄ·½Ê½¡£
+
+µ±Éú²úÕßÏòbroker·¢ËÍÏûϢʱ£¬»áµÃµ½·¢Ëͽá¹û£¬·¢Ëͽá¹ûÖÐÓÐÒ»¸ö·¢ËÍ״̬¡£¼ÙÉèÎÒÃǵÄÅäÖÃÖУ¬ÏûÏ¢µÄÅäÖÃ`isWaitStoreMsgOK = true`£¬Õâ¸öÅäÖÃĬÈÏÒ²ÊÇ`true`£¬Èç¹ûÄãÅäÖÃΪ`false`£¬ÔÚ·¢ËÍÏûÏ¢µÄ¹ý³ÌÖУ¬Ö»Òª²»·¢ÉúÒì³££¬·¢Ëͽá¹û¶¼ÊÇ`SEND_OK`¡£µ±`isWaitStoreMsgOK = true`£¬·¢Ëͽá¹ûÓÐÒÔϼ¸ÖÖ£¬
+
+* `FLUSH_DISK_TIMEOUT`£º±£´æ´ÅÅ̳¬Ê±£¬µ±±£´æ´ÅÅ̵ķ½Ê½ÉèÖÃΪSYNC_FLUSH£¨Í¬²½£©£¬²¢ÇÒÔÚsyncFlushTimeoutÅäÖõÄʱ¼äÄÚ£¨Ä¬ÈÏ5s£©£¬Ã»ÓÐÍê³É±£´æ´ÅÅ̵͝×÷£¬½«»áµÃµ½Õâ¸ö״̬¡£
+* `FLUSH_SLAVE_TIMEOUT`£ºÍ¬²½¡°´Ó¡±³¬Ê±£¬µ±brokerµÄ½ÇÉ«ÉèÖÃΪ¡°Í¬²½Ö÷¡±Ê±£¬µ«ÊÇÔÚÉèÖõÄͬ²½Ê±¼äÄÚ£¬Ä¬ÈÏΪ5s£¬Ã»ÓÐÍê³ÉÖ÷´ÓÖ®¼äµÄͬ²½£¬¾Í»áµÃµ½Õâ¸ö״̬¡£
+* `SLAVE_NOT_AVAILABLE`£º¡°´Ó¡±²»¿ÉÓ㬵±ÎÒÃÇÉèÖá°Í¬²½Ö÷¡±£¬µ«ÊÇûÓÐÅäÖá°´Ó¡±brokerʱ£¬»á·µ»ØÕâ¸ö״̬¡£
+* `SEND_OK`£ºÏûÏ¢·¢Ëͳɹ¦¡£
+
+ÔÙÀ´¿´¿´ÏûÏ¢ÖØ¸´ÓëÏûÏ¢¶ªÊ§£¬µ±Äã·¢ÏÖÄãµÄÏûÏ¢¶ªÊ§Ê±£¬Í¨³£ÓÐÁ½¸öÑ¡Ôñ£¬Ò»¸öÊǶª¾Í¶ª°É£¬ÕâÑùÏûÏ¢¾ÍÕæµÄ¶ªÁË£»ÁíÒ»¸öÑ¡ÔñÊÇÏûÏ¢ÖØÐ·¢ËÍ£¬ÕâÑùÓпÉÄÜÒýÆðÏûÏ¢ÖØ¸´¡£Í¨³£Çé¿öÏ£¬»¹ÊÇÍÆ¼öÖØÐ·¢Ë͵ģ¬ÎÒÃÇÔÚÏû·ÑÏûÏ¢µÄʱºòҪȥ³ýµôÖØ¸´µÄÏûÏ¢¡£
+
+·¢ËÍmessageµÄ´óСһ°ã²»³¬¹ý512k£¬Ä¬Èϵķ¢ËÍÏûÏ¢µÄ·½Ê½ÊÇͬ²½µÄ£¬·¢ËÍ·½·¨»áÒ»Ö±×èÈû£¬Ö±µ½µÈµ½·µ»ØµÄÏìÓ¦¡£Èç¹ûÄã±È½ÏÔÚÒâÐÔÄÜ£¬Ò²¿ÉÒÔÓÃ`send(msg, callback)`Òì²½µÄ·½Ê½·¢ËÍÏûÏ¢¡£
+
+## Ïû·ÑÕß
+
+¶à¸öÏû·ÑÕß¿ÉÒÔ×é³É**Ïû·ÑÕß×飨consumer group£©**£¬²»Í¬µÄ**Ïû·ÑÕß×é**¿ÉÒÔ¶©ÔÄÏàͬµÄTopic£¬Ò²¿ÉÒÔ¶ÀÁ¢µÄÏû·ÑTopic£¬Ã¿Ò»¸öÏû·ÑÕß×é¶¼ÓÐ×Ô¼ºµÄÏû·ÑÆ«ÒÆÁ¿¡£
+
+ÏûÏ¢µÄÏû·Ñ·½Ê½Ò»°ãÓÐÁ½ÖÖ£¬Ë³ÐòÏû·ÑºÍ²¢·¢Ïû·Ñ¡£
+
+* ˳ÐòÏû·Ñ£ºÏû·ÑÕß½«Ëø×¡ÏûÏ¢¶ÓÁУ¬È·±£ÏûÏ¢°´ÕÕ˳ÐòÒ»¸öÒ»¸öµÄ±»Ïû·Ñµô£¬Ë³ÐòÏû·Ñ»áÒýÆðÒ»²¿·ÖÐÔÄÜËðʧ¡£ÔÚÏû·ÑÏûÏ¢µÄʱºò£¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇÓ¦¸Ã·µ»Ø`SUSPEND_CURRENT_QUEUE_A_MOMENT`Õâ¸ö״̬£¬Ëü½«¸æËßÏû·ÑÕß¹ýÒ»¶Îʱ¼äºó£¬»áÖØÐÂÏû·ÑÕâ¸öÏûÏ¢¡£
+* ²¢·¢Ïû·Ñ£ºÏû·ÑÕß½«²¢·¢µÄÏû·ÑÏûÏ¢£¬ÕâÖÖ·½Ê½µÄÐÔÄܷdz£ºÃ£¬Ò²ÊÇÍÆ¼öµÄÏû·Ñ·½Ê½¡£ÔÚÏû·ÑµÄ¹ý³ÌÖУ¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇ·µ»Ø`RECONSUME_LATER`״̬£¬Ëü¸æËßÏû·ÑÕßÏÖÔÚ²»ÄÜÕýÈ·µÄÏû·ÑËü£¬¹ýÒ»¶Îʱ¼äºó£¬»áÔÙ´ÎÏû·ÑËü¡£
+
+ÔÚÏû·ÑÕßÄÚ²¿£¬ÊÇʹÓÃ`ThreadPoolExecutor`×÷ΪÏ̳߳صģ¬ÎÒÃÇ¿ÉÒÔͨ¹ý`setConsumeThreadMin`ºÍ`setConsumeThreadMax`ÉèÖÃ×îСÏû·ÑÏ̺߳Í×î´óÏû·ÑÏ̡߳£
+
+µ±Ò»¸öеÄÏû·ÑÕß×齨Á¢ÒÔºó£¬ËüÒª¾ö¶¨ÊÇ·ñÏû·Ñ֮ǰµÄÀúÊ·ÏûÏ¢£¬`CONSUME_FROM_LAST_OFFSET`½«ºöÂÔÀúÊ·ÏûÏ¢£¬Ïû·ÑеÄÏûÏ¢¡£`CONSUME_FROM_FIRST_OFFSET`½«Ïû·Ñ¶ÓÁÐÖеÄÿһ¸öÏûÏ¢£¬Ö®Ç°µÄÀúÊ·ÏûÏ¢Ò²»áÔÙÏû·ÑÒ»±é¡£`CONSUME_FROM_TIMESTAMP`¿ÉÒÔÖ¸¶¨Ïû·ÑÏûÏ¢µÄʱ¼ä£¬Ö¸¶¨Ê±¼äÒÔºóµÄÏûÏ¢»á±»Ïû·Ñ¡£
+
+Èç¹ûÄãµÄÓ¦Óò»ÄÜÈÝÈÌÖØ¸´Ïû·Ñ£¬ÄÇôÔÚÏû·ÑÏûÏ¢µÄ¹ý³ÌÖУ¬Òª×öºÃÏûÏ¢µÄУÑé¡£
+
+ºÃÁË£¬½ñÌì¾Íµ½ÕâÀï°É£¬ÏÂһƪÎÒÃǽ«½éÉÜRocketMQµÄ»·¾³´î½¨¡£
\ No newline at end of file
diff --git "a/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\351\241\272\345\272\217\346\266\210\350\264\271.md" "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\351\241\272\345\272\217\346\266\210\350\264\271.md"
new file mode 100644
index 0000000..7b22bce
--- /dev/null
+++ "b/docs/mq/RocketMQ/RocketMQ\347\263\273\345\210\227\357\274\232\351\241\272\345\272\217\346\266\210\350\264\271.md"
@@ -0,0 +1,62 @@
+# [RocketMQϵÁУ¨Ò»£©»ù±¾¸ÅÄî](https://www.cnblogs.com/boboooo/p/13038950.html)
+
+
+
+
+
+RocketMQÊǰ¢Àï³öÆ·µÄÒ»¿î¿ªÔ´µÄÏûÏ¢Öмä¼þ£¬ÈÃÆäÉùÃû´óÔëµÄ¾ÍÊÇËüµÄÊÂÎñÏûÏ¢µÄ¹¦ÄÜ¡£ÔÚÆóÒµÖУ¬ÏûÏ¢Öмä¼þÑ¡ÔñʹÓÃRocketMQµÄ»¹ÊÇͦ¶àµÄ£¬ÕâһϵÁеÄÎÄÕ¶¼ÊÇÕë¶ÔRocketMQµÄ£¬ÔÛÃÇÏÈ´ÓRocketMQµÄһЩ»ù±¾¸ÅÄîºÍ»·¾³µÄ´î½¨¿ªÊ¼ÁÄÆð¡£
+
+RocketMQÓÉ4²¿·Ö×é³É£¬·Ö±ðÊÇ£ºÃû³Æ·þÎñ£¨Name Server£©¡¢ÏûÏ¢¶ÓÁУ¨Brokers£©¡¢Éú²úÕߣ¨producer£©ºÍÏû·ÑÕߣ¨consumer£©¡£Õâ4²¿·Ö¶¼¿ÉÒÔ½øÐÐˮƽÀ©Õ¹£¬´Ó¶ø±ÜÃâµ¥µã¹ÊÕÏ£¬ÈçÏÂͼ£¬
+
+
+
+ÕâÊÇRocketMQ¹ÙÍøÉϵÄÒ»ÕÅͼ£¬·Ç³£ÇåÎúµÄÁгöÁË4¸ö²¿·Ö£¬²¢ÇÒ¶¼ÊǼ¯ÈºÄ£Ê½¡£ÏÂÃæÎÒÃǾͷֱð˵һ˵Õâ4²¿·Ö¡£
+
+## Ãû³Æ·þÎñ£¨NameServer£©
+
+Name Server°çÑݵĽÇÉ«ÊÇÒ»¸ö×¢²áÖÐÐÄ£¬ºÍZookeeperµÄ×÷Óò¶à¡£ËüµÄÖ÷Òª¹¦ÄÜÓÐÁ½¸ö£¬ÈçÏ£º
+
+* brokerµÄ¹ÜÀí£ºbroker¼¯Èº½«×Ô¼ºµÄÐÅÏ¢×¢²áµ½NameServer£¬NameServerÌṩÐÄÌø»úÖÆ¼ì²âÿһ¸öbrokerÊÇ·ñÕý³£¡£
+* ·ÓɹÜÀí£ºÃ¿Ò»¸öNameServer¶¼ÓÐÕû¸öbroker¼¯ÈººÍ¶ÓÁеÄÐÅÏ¢£¬ÒÔ±ã¿Í»§¶Ë£¨Éú²úÕߺÍÏû·ÑÕߣ©²éѯ¡£
+
+NameServerе÷×Å·Ö²¼Ê½ÏµÍ³ÖеÄÿһ¸ö×é¼þ£¬²¢ÇÒ¹ÜÀí×Åÿһ¸öTopicµÄ·ÓÉÐÅÏ¢¡£
+
+## Broker
+
+BrokerÖ÷ÒªÊÇ´æ´¢ÏûÏ¢£¬²¢ÇÒÌṩTopicµÄ»úÖÆ¡£ËüÌá¹©ÍÆºÍÀÁ½ÖÖģʽ£¬»¹ÓÐһЩÈÝÔֵĴëÊ©£¬±ÈÈç¿ÉÒÔÅäÖÃÏûÏ¢¸±±¾¡£ÏÂÃæÎÒÃÇ¿´Ò»¿´BrokcerµÄÖ÷´Ó»úÖÆ¡£
+
+BrokerµÄ½ÇÉ«·ÖΪ¡°Òì²½Ö÷¡±¡¢¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Èý¸ö½ÇÉ«¡£Èç¹ûÄã²»ÄÜÈÝÈÌÏûÏ¢µÄ¶ªÊ§£¬Äã¿ÉÒÔÅäÖÃÒ»¸ö¡°Í¬²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öBroker£¬Èç¹ûÄã¾õµÃÏûÏ¢¶ªÊ§Ò²ÎÞËùν£¬Ö»Òª¶ÓÁпÉÓþÍokµÄ»°£¬Äã¿ÉÒÔÅäÖá°Òì²½Ö÷¡±ºÍ¡°´Ó¡±Á½¸öbroker¡£Èç¹ûÄãÖ»ÊÇÏë¼òµ¥µÄ´î½¨£¬Ö»ÅäÖÃÒ»¸ö¡°Òì²½Ö÷¡±£¬²»ÅäÖá°´Ó¡±Ò²ÊÇ¿ÉÒԵġ£
+
+ÉÏÃæÌáµ½µÄÊÇbrokerÖ®¼äµÄ±¸·Ý£¬brokerÀïµÄÐÅÏ¢Ò²ÊÇ¿ÉÒÔ±£´æµ½´ÅÅ̵쬱£´æµ½´ÅÅ̵ķ½Ê½Ò²ÓÐÁ½ÖÖ£¬ÍƼöµÄ·½Ê½ÊÇÒì²½±£´æ´ÅÅÌ£¬Í¬²½±£´æ´ÅÅÌÊǷdz£ËðºÄÐÔÄܵġ£
+
+## Éú²úÕß
+
+Éú²úÕßÖ§³Ö¼¯Èº²¿Êð£¬ËüÃÇÏòbroker¼¯Èº·¢ËÍÏûÏ¢£¬¶øÇÒÖ§³Ö¶àÖÖ¸ºÔؾùºâµÄ·½Ê½¡£
+
+µ±Éú²úÕßÏòbroker·¢ËÍÏûϢʱ£¬»áµÃµ½·¢Ëͽá¹û£¬·¢Ëͽá¹ûÖÐÓÐÒ»¸ö·¢ËÍ״̬¡£¼ÙÉèÎÒÃǵÄÅäÖÃÖУ¬ÏûÏ¢µÄÅäÖÃ`isWaitStoreMsgOK = true`£¬Õâ¸öÅäÖÃĬÈÏÒ²ÊÇ`true`£¬Èç¹ûÄãÅäÖÃΪ`false`£¬ÔÚ·¢ËÍÏûÏ¢µÄ¹ý³ÌÖУ¬Ö»Òª²»·¢ÉúÒì³££¬·¢Ëͽá¹û¶¼ÊÇ`SEND_OK`¡£µ±`isWaitStoreMsgOK = true`£¬·¢Ëͽá¹ûÓÐÒÔϼ¸ÖÖ£¬
+
+* `FLUSH_DISK_TIMEOUT`£º±£´æ´ÅÅ̳¬Ê±£¬µ±±£´æ´ÅÅ̵ķ½Ê½ÉèÖÃΪSYNC_FLUSH£¨Í¬²½£©£¬²¢ÇÒÔÚsyncFlushTimeoutÅäÖõÄʱ¼äÄÚ£¨Ä¬ÈÏ5s£©£¬Ã»ÓÐÍê³É±£´æ´ÅÅ̵͝×÷£¬½«»áµÃµ½Õâ¸ö״̬¡£
+* `FLUSH_SLAVE_TIMEOUT`£ºÍ¬²½¡°´Ó¡±³¬Ê±£¬µ±brokerµÄ½ÇÉ«ÉèÖÃΪ¡°Í¬²½Ö÷¡±Ê±£¬µ«ÊÇÔÚÉèÖõÄͬ²½Ê±¼äÄÚ£¬Ä¬ÈÏΪ5s£¬Ã»ÓÐÍê³ÉÖ÷´ÓÖ®¼äµÄͬ²½£¬¾Í»áµÃµ½Õâ¸ö״̬¡£
+* `SLAVE_NOT_AVAILABLE`£º¡°´Ó¡±²»¿ÉÓ㬵±ÎÒÃÇÉèÖá°Í¬²½Ö÷¡±£¬µ«ÊÇûÓÐÅäÖá°´Ó¡±brokerʱ£¬»á·µ»ØÕâ¸ö״̬¡£
+* `SEND_OK`£ºÏûÏ¢·¢Ëͳɹ¦¡£
+
+ÔÙÀ´¿´¿´ÏûÏ¢ÖØ¸´ÓëÏûÏ¢¶ªÊ§£¬µ±Äã·¢ÏÖÄãµÄÏûÏ¢¶ªÊ§Ê±£¬Í¨³£ÓÐÁ½¸öÑ¡Ôñ£¬Ò»¸öÊǶª¾Í¶ª°É£¬ÕâÑùÏûÏ¢¾ÍÕæµÄ¶ªÁË£»ÁíÒ»¸öÑ¡ÔñÊÇÏûÏ¢ÖØÐ·¢ËÍ£¬ÕâÑùÓпÉÄÜÒýÆðÏûÏ¢ÖØ¸´¡£Í¨³£Çé¿öÏ£¬»¹ÊÇÍÆ¼öÖØÐ·¢Ë͵ģ¬ÎÒÃÇÔÚÏû·ÑÏûÏ¢µÄʱºòҪȥ³ýµôÖØ¸´µÄÏûÏ¢¡£
+
+·¢ËÍmessageµÄ´óСһ°ã²»³¬¹ý512k£¬Ä¬Èϵķ¢ËÍÏûÏ¢µÄ·½Ê½ÊÇͬ²½µÄ£¬·¢ËÍ·½·¨»áÒ»Ö±×èÈû£¬Ö±µ½µÈµ½·µ»ØµÄÏìÓ¦¡£Èç¹ûÄã±È½ÏÔÚÒâÐÔÄÜ£¬Ò²¿ÉÒÔÓÃ`send(msg, callback)`Òì²½µÄ·½Ê½·¢ËÍÏûÏ¢¡£
+
+## Ïû·ÑÕß
+
+¶à¸öÏû·ÑÕß¿ÉÒÔ×é³É**Ïû·ÑÕß×飨consumer group£©**£¬²»Í¬µÄ**Ïû·ÑÕß×é**¿ÉÒÔ¶©ÔÄÏàͬµÄTopic£¬Ò²¿ÉÒÔ¶ÀÁ¢µÄÏû·ÑTopic£¬Ã¿Ò»¸öÏû·ÑÕß×é¶¼ÓÐ×Ô¼ºµÄÏû·ÑÆ«ÒÆÁ¿¡£
+
+ÏûÏ¢µÄÏû·Ñ·½Ê½Ò»°ãÓÐÁ½ÖÖ£¬Ë³ÐòÏû·ÑºÍ²¢·¢Ïû·Ñ¡£
+
+* ˳ÐòÏû·Ñ£ºÏû·ÑÕß½«Ëø×¡ÏûÏ¢¶ÓÁУ¬È·±£ÏûÏ¢°´ÕÕ˳ÐòÒ»¸öÒ»¸öµÄ±»Ïû·Ñµô£¬Ë³ÐòÏû·Ñ»áÒýÆðÒ»²¿·ÖÐÔÄÜËðʧ¡£ÔÚÏû·ÑÏûÏ¢µÄʱºò£¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇÓ¦¸Ã·µ»Ø`SUSPEND_CURRENT_QUEUE_A_MOMENT`Õâ¸ö״̬£¬Ëü½«¸æËßÏû·ÑÕß¹ýÒ»¶Îʱ¼äºó£¬»áÖØÐÂÏû·ÑÕâ¸öÏûÏ¢¡£
+* ²¢·¢Ïû·Ñ£ºÏû·ÑÕß½«²¢·¢µÄÏû·ÑÏûÏ¢£¬ÕâÖÖ·½Ê½µÄÐÔÄܷdz£ºÃ£¬Ò²ÊÇÍÆ¼öµÄÏû·Ñ·½Ê½¡£ÔÚÏû·ÑµÄ¹ý³ÌÖУ¬Èç¹û³öÏÖÒì³££¬²»½¨ÒéÖ±½ÓÅ׳ö£¬¶øÊÇ·µ»Ø`RECONSUME_LATER`״̬£¬Ëü¸æËßÏû·ÑÕßÏÖÔÚ²»ÄÜÕýÈ·µÄÏû·ÑËü£¬¹ýÒ»¶Îʱ¼äºó£¬»áÔÙ´ÎÏû·ÑËü¡£
+
+ÔÚÏû·ÑÕßÄÚ²¿£¬ÊÇʹÓÃ`ThreadPoolExecutor`×÷ΪÏ̳߳صģ¬ÎÒÃÇ¿ÉÒÔͨ¹ý`setConsumeThreadMin`ºÍ`setConsumeThreadMax`ÉèÖÃ×îСÏû·ÑÏ̺߳Í×î´óÏû·ÑÏ̡߳£
+
+µ±Ò»¸öеÄÏû·ÑÕß×齨Á¢ÒÔºó£¬ËüÒª¾ö¶¨ÊÇ·ñÏû·Ñ֮ǰµÄÀúÊ·ÏûÏ¢£¬`CONSUME_FROM_LAST_OFFSET`½«ºöÂÔÀúÊ·ÏûÏ¢£¬Ïû·ÑеÄÏûÏ¢¡£`CONSUME_FROM_FIRST_OFFSET`½«Ïû·Ñ¶ÓÁÐÖеÄÿһ¸öÏûÏ¢£¬Ö®Ç°µÄÀúÊ·ÏûÏ¢Ò²»áÔÙÏû·ÑÒ»±é¡£`CONSUME_FROM_TIMESTAMP`¿ÉÒÔÖ¸¶¨Ïû·ÑÏûÏ¢µÄʱ¼ä£¬Ö¸¶¨Ê±¼äÒÔºóµÄÏûÏ¢»á±»Ïû·Ñ¡£
+
+Èç¹ûÄãµÄÓ¦Óò»ÄÜÈÝÈÌÖØ¸´Ïû·Ñ£¬ÄÇôÔÚÏû·ÑÏûÏ¢µÄ¹ý³ÌÖУ¬Òª×öºÃÏûÏ¢µÄУÑé¡£
+
+ºÃÁË£¬½ñÌì¾Íµ½ÕâÀï°É£¬ÏÂһƪÎÒÃǽ«½éÉÜRocketMQµÄ»·¾³´î½¨¡£
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka \345\277\253\351\200\237\344\270\212\346\211\213\357\274\210Java\347\211\210\357\274\211.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka \345\277\253\351\200\237\344\270\212\346\211\213\357\274\210Java\347\211\210\357\274\211.md"
new file mode 100644
index 0000000..b4bc0a9
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka \345\277\253\351\200\237\344\270\212\346\211\213\357\274\210Java\347\211\210\357\274\211.md"
@@ -0,0 +1,173 @@
+**�言**
+
+ä¸Šç¯‡æ–‡ç« è®²è§£äº† Kafka 的基础概念和架构,了解了基本概念之å�Žï¼Œå¿…须得实践一波了,所谓“实践æ‰�是检验真ç�†çš„唯一办法â€�,å�Žç»ç³»åˆ—关于 Kafka çš„æ–‡ç« éƒ½ä»¥ kafka_2.11-0.9.0.0 为例;å�¦å¤–为了让大家快速入门,本文å�ªæ��ä¾›å�•机版的安装实战教程,如果有想å°�试集群方案的,å�Žé�¢åœ¨å‡ºä¸€ç¯‡é›†ç¾¤å®‰è£…的教程,废è¯�ä¸�多说了,直接开干。
+
+## **安装**
+
+### **1\. 下载**
+
+版本�:kafka_2.11-0.9.0.0
+
+下载地�:[http://kafka.apache.org/downloads](https://link.zhihu.com/?target=http%3A//kafka.apache.org/downloads)
+
+### **2\. 安装**
+
+
+
+```
+# 安装目录
+$ pwd
+/Users/my/software/study
+
+# �压
+$ sudo tar -zxvf kafka_2.11-0.9.0.0.tgz
+
+# �命�
+$ sudo mv kafka_2.11-0.9.0.0.tgz kafka-0.9
+
+# 查看目录结构
+$ cd kafka-0.9 && ls
+LICENSE NOTICE bin config libs site-docs
+
+# 目录结构介�:
+# bin: å˜æ”¾kafka 客户端和æœ�务端的执行脚本
+# config: å˜æ”¾kafka的一些é…�置文件
+# libs: å˜æ”¾kafkaè¿�行的的jar包
+# site-docs: å˜æ”¾kafkaçš„é…�置文档说明
+
+# �置环境��,方便在任�目录下�行kafka命令
+# å�šä¸»ä½¿ç”¨çš„Mac,所以é…�置在了 ~/.bash_profile文件ä¸ï¼Œ
+# Linuxä¸åˆ™é…�置在 ~/.bashrc 或者 ~/.zshrc文件ä¸
+$ vim ~/.bash_profile
+
+export KAFKA_HOME=/Users/haikuan1/software/study/kafka-0.9
+export PATH=$PATH:$JAVA_HOME:$KAFKA_HOME/bin
+
+# 使得环境��生效
+$ source ~/.bash_profile
+
+```
+
+
+
+### **3.�行**
+
+### **3.1 �动 zookeeper**
+
+
+
+```
+# å�¯åЍzookeeperï¼Œå› ä¸ºkafka的元数æ�®éœ€è¦�ä¿�å˜åˆ°zookeeperä¸
+$ bin/zookeeper-server-start.sh config/zookeeper.properties
+
+# 若出现如下信�,则�明zookeeper�动�功了
+[2020-04-25 16:23:44,493] INFO Server environment:user.dir=/Users/haikuan1/software/study/kafka-0.10 (org.apache.zookeeper.server.ZooKeeperServer)
+[2020-04-25 16:23:44,505] INFO tickTime set to 3000 (org.apache.zookeeper.server.ZooKeeperServer)
+[2020-04-25 16:23:44,505] INFO minSessionTimeout set to -1 (org.apache.zookeeper.server.ZooKeeperServer)
+[2020-04-25 16:23:44,505] INFO maxSessionTimeout set to -1 (org.apache.zookeeper.server.ZooKeeperServer)
+[2020-04-25 16:23:44,548] INFO binding to port 0.0.0.0/0.0.0.0:2181 (org.apache.zookeeper.server.NIOServerCnxnFactory)
+
+```
+
+
+
+### **3.2 �动 Kafka server**
+
+
+
+```
+# 以守护进程的方å¼�å�¯åЍkafkaæœ�务端,去掉 -daemon å�‚数则关é—当å‰�窗å�£æœ�务端自动退出
+$ bin/kafka-server-start.sh -daemon config/server.properties
+
+```
+
+
+
+### **3.3 kafka 基础命令使用**
+
+
+
+```
+# 1\. 创建一个topic
+# --replication-factor:指定副本个数
+# --partition:指定partition个数
+# --topic:指定topicçš„å��å—
+$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partition 1 --topic mytopic
+
+# 2\. 查看创建�功的topic
+$ kafka-topics.sh --list --zookeeper localhost:2181
+
+# 3\. 创建生产者和消费者
+
+# 3.1 �动kafka消费端
+# --from-beginning:从头开始消费,该特性也表明kafka消�具有�久性
+$ bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic mytopic --from-beginning
+
+# 3.2 �动kafka生产端
+# --broker-list:当�的Broker列表,��供�务的列表
+$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic mytopic
+
+```
+
+
+
+
+
+
+
+
+
+
+### **4.使用 Java 连接 kafka 进行测试**
+
+### **4.1 创建一个 maven 工程,引入如下 pom �赖**
+
+
+
+```
+
+ org.apache.kafka
+ kafka-clients
+ 0.9.0.0
+
+
+
+ org.apache.kafka
+ kafka_2.11
+ 0.9.0.0
+
+
+```
+
+
+
+### **4.2 消费者端代ç �**
+
+
+
+
+
+
+
+
+### **4.3 生产者端代ç �**
+
+
+
+
+
+
+
+
+### **4.4 消费者端效果图**
+
+
+
+
+
+
+
+
+### **5.总结**
+
+本文介�了 kafka �机版安装�简�命令使用,然�使用 Java 实现了生产者和消费者的简�功能,虽然内容�能比较简�,但还是**强烈建议大家手动去实践一下**,从而对 kafka 的架构有一个更深入的�解。
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\344\270\200\346\235\241\346\266\210\346\201\257\345\255\230\345\210\260broker\347\232\204\350\277\207\347\250\213.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\344\270\200\346\235\241\346\266\210\346\201\257\345\255\230\345\210\260broker\347\232\204\350\277\207\347\250\213.md"
new file mode 100644
index 0000000..6af0292
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\344\270\200\346\235\241\346\266\210\346\201\257\345\255\230\345\210\260broker\347\232\204\350\277\207\347\250\213.md"
@@ -0,0 +1,112 @@
+**�言**
+
+ç»�è¿‡ä¸Šç¯‡æ–‡ç« çš„ç®€å�•实战之å�Žï¼Œ**今天æ�¥è�Šè�Šç”Ÿäº§è€…将消æ�¯ä»Žå®¢æˆ·ç«¯å�‘é€�到 Broker 上背å�Žå�‘生了哪些故事**,看ä¸�çœ‹ç”±ä½ ï¼Œä½†æ˜¯æˆ‘ä¿�è¯�å�¯ä»¥æœ¬ç¯‡æ–‡ç« ä½ ä¸€å®šå�¯ä»¥å¦åˆ°åº”用背å�Žçš„一些实质东西。
+
+本文我们从以下 4 个方��探讨下一�消�如何被准确的��到 Broker 的 partition 上。
+
+**1\. 客户端组件**
+
+**2\. 客户端缓å˜å˜å‚¨æ¨¡åž‹**
+
+**3\. 确定消�的 partition �置**
+
+**4\. ��线程的工作原�**
+
+* * *
+
+## **客户端组件**
+
+* **KafkaProducer:**
+
+KafkaProducer 是一个生产者客户端的进程,通过该对象�动生产者���消�。
+
+* **RecordAccumulator:**
+
+RecordAccumulator 是一个记录收集器,用于收集客户端å�‘é€�的消æ�¯ï¼Œå¹¶å°†æ”¶é›†åˆ°çš„æ¶ˆæ�¯æš‚å˜åˆ°å®¢æˆ·ç«¯ç¼“å˜ä¸ã€‚
+
+* **Sender:**
+
+Sender 是一个å�‘é€�线程,负责读å�–记录收集器ä¸ç¼“å˜çš„æ‰¹é‡�消æ�¯ï¼Œç»�过一些ä¸é—´è½¬æ�¢æ“�作,将è¦�å�‘é€�的数æ�®å‡†å¤‡å¥½ï¼Œç„¶å�Žäº¤ç”± Selector è¿›è¡Œç½‘ç»œä¼ è¾“ã€‚
+
+* **Selector:**
+
+Selector 是一个选择器,用于处�网络连接和读写处�,使用网络连接处�客户端上的网络请求。
+
+通过使用以上四大组件å�³å�¯å®Œæˆ�客户端消æ�¯çš„å�‘é€�工作。消æ�¯åœ¨ç½‘络ä¸ä¼ 输的方å¼�å�ªèƒ½é€šè¿‡äºŒçº§åˆ¶çš„æ–¹å¼�,所以首先需è¦�将消æ�¯åº�列化为二进制形å¼�缓å˜åœ¨å®¢æˆ·ç«¯ï¼Œkafka 使用了å�Œç«¯é˜Ÿåˆ—的方å¼�将消æ�¯ç¼“å˜èµ·æ�¥ï¼Œç„¶å�Žä½¿ç”¨å�‘é€�线程(Sender)读å�–队列ä¸çš„æ¶ˆæ�¯äº¤ç»™ Selector è¿›è¡Œç½‘ç»œä¼ è¾“å�‘é€�ç»™æœ�务端(Broker)
+
+
+
+
+
+
+
+
+以上为å�‘é€�消æ�¯çš„主æµ�程,附上部分æº�ç �供大家å�‚考,接下æ�¥åˆ†æž�ä¸‹å‡ ä¸ªé�žå¸¸é‡�è¦�æµ�程的具体实现原ç�†ã€‚
+
+* * *
+
+## **客户端缓å˜å˜å‚¨æ¨¡åž‹**
+
+
+
+
+
+
+
+
+从上图å�¯ä»¥çœ‹å‡ºï¼Œä¸€æ�¡æ¶ˆæ�¯é¦–先需è¦�确定è¦�被å˜å‚¨åˆ°é‚£ä¸ª partition 对应的å�Œç«¯é˜Ÿåˆ—上;其次,å˜å‚¨æ¶ˆæ�¯çš„å�Œç«¯é˜Ÿåˆ—是以批的维度å˜å‚¨çš„,å�³ N æ�¡æ¶ˆæ�¯ç»„æˆ�一批,一批消æ�¯æœ€å¤šå˜å‚¨ N æ�¡ï¼Œè¶…过å�Žåˆ™æ–°å»ºä¸€ä¸ªç»„æ�¥å˜å‚¨æ–°æ¶ˆæ�¯ï¼›å…¶æ¬¡ï¼Œæ–°æ�¥çš„æ¶ˆæ�¯æ€»æ˜¯ä»Žå·¦ä¾§å†™å…¥ï¼Œå�³è¶Šé� 左侧的消æ�¯äº§ç”Ÿçš„æ—¶é—´è¶Šæ™šï¼›æœ€å�Žï¼Œå�ªæœ‰å½“一批消æ�¯å‡‘够 N æ�¡å�Žæ‰�会å�‘é€�ç»™ Broker,å�¦åˆ™ä¸�会å�‘é€�到 Broker 上。
+
+了解了客户端å˜å‚¨æ¨¡åž‹å�Žï¼Œæ�¥æŽ¢è®¨ä¸‹ç¡®å®šæ¶ˆæ�¯çš„ partition(分区)ä½�置?
+
+* * *
+
+## **确定消�的 partition �置**
+
+消��分为两�,一�是指定了 key 的消�,一�是没有指定 key 的消�。
+
+对于指定了 key 的消æ�¯ï¼Œpartition ä½�置的计算方å¼�为:**`Utils.murmur2(key) % numPartitions`**,å�³å…ˆå¯¹ key 进行哈希计算,然å�Žåœ¨äºŽ partition 个数求余,从而得到该æ�¡æ¶ˆæ�¯åº”该被å˜å‚¨åœ¨å“ªä¸ª partition 上。
+
+对于没有指定 key 的消�,partition �置的计算方�为:**采用 round-robin 方�确定 partition �置**,�采用轮询的方�,平�的将消�分布到��的 partition 上,从而���些 partition 数��过大影� Broker 和消费端性能。
+
+### **注�**
+
+由于 partition 有主副的区分,æ¤å¤„å�‚与计算的 partition æ•°é‡�是当å‰�有主 partition 的数é‡�,å�³å¦‚æžœæŸ�个 partition æ— ä¸»çš„æ—¶å€™ï¼Œåˆ™æ¤ partition 是ä¸�能够进行数æ�®å†™å…¥çš„。
+
+ç¨�微解释一下,主副 partition 的机制是为了æ��高 kafka 系统的容错性的,å�³å½“æŸ�个 Broker æ„�å¤–å®•æœºæ—¶ï¼Œåœ¨æ¤ Broker 上的主 partition 状æ€�为ä¸�å�¯è¯»å†™æ—¶ï¼ˆå�ªæœ‰ä¸» partition å�¯å¯¹å¤–æ��供读写æœ�务,副 partition å�ªæœ‰æ•°æ�®å¤‡ä»½çš„功能),kafka 会从主 partition 对应的 N 个副 partition 䏿Œ‘选一个,并将其状æ€�改为主 partition,从而继ç»å¯¹å¤–æ��供读写æ“�作。
+
+消æ�¯è¢«ç¡®å®šåˆ†é…�到æŸ�个 partition 对应记录收集器(å�³å�Œç«¯é˜Ÿåˆ—)å�Žï¼ŒæŽ¥ä¸‹æ�¥ï¼Œå�‘é€�线程(Senderï¼‰ä»Žè®°å½•æ”¶é›†å™¨ä¸æ”¶é›†æ»¡è¶³æ�¡ä»¶çš„æ‰¹æ•°æ�®å�‘é€�ç»™ Broker,那么å�‘é€�线程是如何收集满足æ�¡ä»¶çš„æ‰¹æ•°æ�®çš„?批数æ�®æ˜¯æŒ‰ç…§ partition 维度å�‘é€�的还是按照 Broker 维度å�‘é€�æ•°æ�®çš„?
+
+* * *
+
+## **��线程的工作原�**
+
+Sender 线程的主è¦�工作是收集满足æ�¡ä»¶çš„æ‰¹æ•°æ�®ï¼Œä½•为满足æ�¡ä»¶çš„æ‰¹æ•°æ�®ï¼Ÿç¼“å˜æ•°æ�®æ˜¯ä»¥æ‰¹ç»´åº¦å˜å‚¨çš„,当一批数æ�®é‡�达到指定的 N æ�¡æ—¶ï¼Œå°±æ»¡è¶³å�‘é€�ç»™ Broker çš„æ�¡ä»¶äº†ã€‚
+
+partition 维度和 Broker 维度��消�模型对比。
+
+
+
+
+
+
+
+
+从图ä¸å�¯ä»¥çœ‹å‡ºï¼Œå·¦ä¾§æŒ‰ç…§ partition 维度å�‘é€�消æ�¯ï¼Œæ¯�个 partition 都需è¦�å’Œ Broker 建连,总共å�‘生了四次网络连接。而å�³ä¾§å°†åˆ†å¸ƒåœ¨å�Œä¸€ä¸ª Broker çš„ partition 按组è�šå�ˆå�Žåœ¨ä¸Ž Broker 建连,å�ªéœ€è¦�两次网络连接å�³å�¯ã€‚所以 Kafka 选择å�³ä¾§çš„æ–¹å¼�。
+
+### **Sender 的主�工作**
+
+第一æ¥ï¼šæ‰«æ��è®°å½•æ”¶é›†å™¨ä¸æ»¡è¶³æ�¡ä»¶çš„æ‰¹æ•°æ�®ï¼Œç„¶å�Žå°† partition -> 批数æ�®æ˜ 射转æ�¢æˆ� BrokerId -> N 批数æ�®çš„æ˜ 射。第二æ¥ï¼šSender 线程会为æ¯�个 BrokerId 创建一个客户端请求,然å�Žå°†è¯·æ±‚交给 NetWorkClient,由 NetWrokClient 去真æ£å�‘é€�网络请求到 Broker。
+
+### **NetWorkClient 的工作内容**
+
+Sender 线程准备好���的数��,交由 NetWorkClient �进行网络相关�作。主�包括客户端与�务端的建连���客户端请求�接��务端�应。完�如上一系列的工作主�由如下方法完�。
+
+1. reday()方法。从记录收集器获�准备完毕的节点,并连接所有准备好的节点。
+2. send()方法。为æ¯�个节点创建一个客户端请求,然å�Žå°†è¯·æ±‚暂时å˜åˆ°èŠ‚ç‚¹å¯¹åº”çš„ Channel(通é�“)ä¸ã€‚
+3. poll()方法。该方法会真æ£è½®è¯¢ç½‘络请求,å�‘é€�请求给æœ�务端节点和接å�—æœ�务端的å“�应。
+
+* * *
+
+## **总结**
+
+以上,å�³ä¸ºç”Ÿäº§è€…客户端的一æ�¡æ¶ˆæ�¯ä»Žç”Ÿäº§åˆ°å�‘é€�到 Broker 上的全过程。现在是ä¸�是就很清晰了呢?也许有些朋å�‹ä¼šæ¯”较疑惑它的**ç½‘ç»œè¯·æ±‚æ¨¡åž‹æ˜¯ä»€ä¹ˆæ ·çš„**ï¼Œä½œè€…å°±çŒœä½ ä¼šä½ ä¼šé—®ï¼Œä¸‹ä¸€ç¯‡æˆ‘ä»¬å°±æ�¥æ‰’开它的神秘é�¢çº±çœ‹çœ‹å…¶ç©¶ç«Ÿæ˜¯æ€Žä¹ˆå®žçŽ°çš„ï¼Œæ•¬è¯·æœŸå¾…ã€‚
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\344\273\213\347\273\215.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\344\273\213\347\273\215.md"
new file mode 100644
index 0000000..bb4fd3b
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\344\273\213\347\273\215.md"
@@ -0,0 +1,122 @@
+## 一.官网Kafka介�
+
+## 1.1 什么是事件�?
+
+事件æµ�æ˜¯ç›¸å½“äºŽäººä½“ä¸æž¢ç¥žç»�系统的数å—系统。它是“永远在线â€�世界的技术基础,在这个世界里,ä¼�业越æ�¥è¶Šå¤šåœ°ç”±è½¯ä»¶å®šä¹‰å’Œè‡ªåŠ¨åŒ–ï¼Œè½¯ä»¶çš„ç”¨æˆ·ä¹Ÿæ›´å¤šåœ°æ˜¯è½¯ä»¶ã€‚
+
+从技术上讲,事件æµ�是指以事件æµ�的形å¼�从数æ�®åº“ã€�ä¼ æ„Ÿå™¨ã€�移动设备ã€�云æœ�务和软件应用ç‰äº‹ä»¶æº�实时æ�•获数æ�®çš„实践;æŒ�久地å˜å‚¨è¿™äº›äº‹ä»¶æµ�以备以å�Žæ£€ç´¢;实时和回顾性地æ“�作ã€�处ç�†å’Œå“�应事件æµ�;å¹¶æ ¹æ�®éœ€è¦�将事件æµ�路由到ä¸�å�Œçš„ç›®çš„åœ°æŠ€æœ¯ã€‚å› æ¤ï¼Œäº‹ä»¶æµ�ç¡®ä¿�了数æ�®çš„è¿žç»æµ�动和解释,从而使æ£ç¡®çš„ä¿¡æ�¯åœ¨æ£ç¡®çš„地点ã€�æ£ç¡®çš„æ—¶é—´å‡ºçŽ°ã€‚
+
+## 1.2 我�以使用事件��什么?
+
+事件æµ�应用于众多行业和组织的å�„ç§�用例。它的许多例å�包括: 1. 实时处ç�†æ”¯ä»˜å’Œé‡‘èž�交易,如股票交易所ã€�银行和ä¿�险。 2. 实时跟踪和监控汽车ã€�å�¡è½¦ã€�车队和è¿�输,如物æµ�和汽车行业。 3. æŒ�ç»æ�•获和分æž�æ�¥è‡ªç‰©è�”ç½‘è®¾å¤‡æˆ–å…¶ä»–è®¾å¤‡çš„ä¼ æ„Ÿå™¨æ•°æ�®ï¼Œå¦‚工厂和风电场。 4. 收集并立å�³å“�应客户的互动和订å�•,如零售ã€�酒店和旅游行业,以å�Šç§»åŠ¨åº”ç”¨ç¨‹åº�。 5. 监测ä½�院病人,预测病情å�˜åŒ–,确ä¿�在紧急情况下å�Šæ—¶æ²»ç–—。 6. 连接ã€�å˜å‚¨å…¬å�¸ä¸�å�Œéƒ¨é—¨äº§ç”Ÿçš„æ•°æ�®å¹¶ä½¿å…¶å�¯ç”¨ã€‚ 7. 作为数æ�®å¹³å�°ã€�事件驱动架构和微æœ�务的基础。
+
+## 1.3 Apache Kafka®是一个事件�平�。这是什么��?
+
+Kafka结å�ˆäº†ä¸‰ä¸ªå…³é”®çš„åŠŸèƒ½ï¼Œæ‰€ä»¥ä½ å�¯ä»¥ç”¨ä¸€ä¸ªå�•一的战斗测试解决方案æ�¥å®žçŽ°ç«¯åˆ°ç«¯äº‹ä»¶æµ�的用例: 1. å�‘布(写)和订阅(读)事件æµ�,包括从其他系统连ç»å¯¼å…¥/导出数æ�®ã€‚ 2. æŒ�久性和å�¯é� 地å˜å‚¨äº‹ä»¶æµ�,å�ªè¦�ä½ æƒ³ã€‚ 3. 在事件å�‘生或回顾时处ç�†äº‹ä»¶æµ�。
+
+所有这些功能都是以分布��高度�伸缩�弹性�容错和安全的方��供的。Kafka�以部署在裸金属硬件�虚拟机和容器上,也�以部署在云上。您�以选择自管�您的Kafka环境和使用由��供应商�供的完全管�的�务。
+
+## 1.4 简而言之,Kafka是如何工作的?
+
+Kafka是一个分布å¼�系统,由æœ�务器和客户端组æˆ�,通过高性能的TCP网络å��议进行通信。它å�¯ä»¥éƒ¨ç½²åœ¨è£¸é‡‘属硬件ã€�虚拟机和内部环境ä¸çš„容器上,也å�¯ä»¥éƒ¨ç½²åœ¨äº‘环境ä¸ã€‚
+
+**æœ�务器:**Kafka作为一个集群è¿�行一个或多个æœ�务器,å�¯ä»¥è·¨è¶Šå¤šä¸ªæ•°æ�®ä¸å¿ƒæˆ–云区域。其ä¸ä¸€äº›æœ�务器构æˆ�å˜å‚¨å±‚,称为代ç�†ã€‚å…¶ä»–æœ�务器è¿�行Kafka Connectæ�¥æŒ�ç»å¯¼å…¥å’Œå¯¼å‡ºæ•°æ�®ä½œä¸ºäº‹ä»¶æµ�,将Kafka与您现有的系统集æˆ�,如关系数æ�®åº“以å�Šå…¶ä»–Kafkaé›†ç¾¤ã€‚ä¸ºäº†è®©ä½ å®žçŽ°å…³é”®ä»»åŠ¡çš„ç”¨ä¾‹ï¼ŒKafka集群具有高度的å�¯æ‰©å±•性和容错性:如果它的任何一个æœ�务器å�‘生故障,其他æœ�务器将接管它们的工作,以确ä¿�æŒ�ç»çš„æ“�作而ä¸�丢失任何数æ�®ã€‚
+
+**客户机:**它们å…�许您编写分布å¼�应用程åº�和微æœ�务,这些应用程åº�和微æœ�务å�¯ä»¥å¹¶è¡Œåœ°ã€�大规模地读å�–ã€�写入和处ç�†äº‹ä»¶æµ�,甚至在出现网络问题或机器故障的情况下也å�¯ä»¥å®¹é”™ã€‚Kafkaé™„å¸¦äº†ä¸€äº›è¿™æ ·çš„å®¢æˆ·ç«¯ï¼Œè¿™äº›å®¢æˆ·ç«¯è¢«Kafka社区æ��ä¾›çš„å‡ å��个客户端增强了:客户端å�¯ä»¥ç”¨äºŽJavaå’ŒScala,包括更高级别的Kafka Streams库,用于Goã€�Pythonã€�C/ c++和许多其他编程è¯è¨€ä»¥å�ŠREST api。
+
+## 1.5 主è¦�概念和术è¯
+
+äº‹ä»¶è®°å½•äº†åœ¨ä¸–ç•Œä¸Šæˆ–ä½ çš„ä¼�业ä¸â€œå�‘生了æŸ�事â€�的事实。在文档ä¸ä¹Ÿç§°ä¸ºè®°å½•或消æ�¯ã€‚å½“ä½ è¯»æˆ–å†™æ•°æ�®åˆ°Kafkaæ—¶ï¼Œä½ ä»¥äº‹ä»¶çš„å½¢å¼�å�šè¿™ä»¶äº‹ã€‚从概念上讲,事件具有键ã€�值ã€�时间戳和å�¯é€‰çš„元数æ�®å¤´ã€‚下é�¢æ˜¯ä¸€ä¸ªä¾‹å�: 1. 活动é‡�点:“爱丽ä¸�â€� 2. 事件值:“å�‘Bob支付200美元â€� 3. 事件时间戳:“2020å¹´6月25日下å�ˆ2:06。â€�
+
+生产者是那些å�‘Kafkaå�‘布(写)事件的客户端应用程åº�,而消费者是那些订阅(读和处ç�†)这些事件的应用程åº�。在Kafkaä¸ï¼Œç”Ÿäº§è€…å’Œæ¶ˆè´¹è€…æ˜¯å®Œå…¨è§£è€¦çš„ï¼Œå½¼æ¤æ˜¯ä¸�å�¯çŸ¥çš„,这是实现Kafkaé—»å��的高å�¯æ‰©å±•æ€§çš„ä¸€ä¸ªå…³é”®è®¾è®¡å…ƒç´ ã€‚ä¾‹å¦‚ï¼Œç”Ÿäº§è€…ä»Žä¸�需è¦�ç‰å¾…消费者。Kafkaæ��供了å�„ç§�å�„æ ·çš„ä¿�è¯�,比如精确处ç�†ä¸€æ¬¡äº‹ä»¶çš„能力。
+
+事件被组织并æŒ�久地å˜å‚¨åœ¨ä¸»é¢˜ä¸ã€‚很简å�•,一个主题类似于文件系统ä¸çš„一个文件夹,事件就是该文件夹ä¸çš„æ–‡ä»¶ã€‚一个示例主题å��ç§°å�¯ä»¥æ˜¯â€œpaymentsâ€�。Kafkaä¸çš„主题总是多生产者和多订阅者:一个主题å�¯ä»¥æœ‰0个ã€�1个或多个生产者å�‘它写入事件,也å�¯ä»¥æœ‰0个ã€�1个或多个消费者订阅这些事件。主题ä¸çš„事件å�¯ä»¥æ ¹æ�®éœ€è¦�ç»�常读å�–â€”â€”ä¸Žä¼ ç»Ÿæ¶ˆæ�¯ä¼ 递系统ä¸�å�Œï¼Œäº‹ä»¶åœ¨ä½¿ç”¨å�Žä¸�ä¼šåˆ é™¤ã€‚ç›¸å��ï¼Œä½ å�¯ä»¥é€šè¿‡æ¯�个主题的é…�置设置æ�¥å®šä¹‰Kafka应该ä¿�ç•™ä½ çš„äº‹ä»¶å¤šé•¿æ—¶é—´ï¼Œä¹‹å�Žæ—§çš„事件将被丢弃。Kafka的性能相对于数æ�®å¤§å°�æ�¥è¯´æ˜¯ä¸�å�˜çš„,所以长时间å˜å‚¨æ•°æ�®æ˜¯å®Œå…¨å�¯ä»¥çš„。
+
+主题是分区的,这æ„�味ç�€ä¸€ä¸ªä¸»é¢˜åˆ†æ•£åœ¨ä½�于ä¸�å�ŒKafka broker上的多个“桶â€�上。这ç§�æ•°æ�®çš„分布å¼�ä½�置对于å�¯ä¼¸ç¼©æ€§é�žå¸¸é‡�è¦�ï¼Œå› ä¸ºå®ƒå…�许客户机应用程åº�å�Œæ—¶ä»Ž/å�‘多个代ç�†è¯»å�–和写入数æ�®ã€‚当一个新事件被å�‘å¸ƒåˆ°ä¸€ä¸ªä¸»é¢˜æ—¶ï¼Œå®ƒå®žé™…ä¸Šè¢«é™„åŠ åˆ°ä¸»é¢˜çš„ä¸€ä¸ªåˆ†åŒºä¸ã€‚具有相å�Œäº‹ä»¶é”®(例如,客户或车辆ID)的事件被写入å�Œä¸€ä¸ªåˆ†åŒºï¼ŒKafkaä¿�è¯�任何给定主题分区的消费者都将始终以写入的完全相å�Œçš„顺åº�读å�–该分区的事件。
+
+
+
+
+
+
+
+
+è®©ä½ çš„æ•°æ�®å®¹é”™å’Œå�¯ç”¨æ€§,æ¯�一个主题å�¯ä»¥è¢«å¤�制,甚至跨geo-regions或数æ�®ä¸å¿ƒ,è¿™æ ·æ€»æœ‰å¤šä¸ªç»�纪人有一份数æ�®ä»¥é˜²å‡ºé”™,ä½ æƒ³å�šä»£ç�†ç»´æŠ¤,ç‰ç‰ã€‚一个常è§�的生产设置是å¤�åˆ¶å› å�3,也就是说,您的数æ�®æ€»æ˜¯æœ‰ä¸‰ä¸ªå‰¯æœ¬ã€‚这个å¤�制是在主题分区级别执行的。
+
+## 二.Kafka简介
+
+Kafka是一�消�队列,主�用�处�大�数�状�下的消�队列,一般用��日志的处�。既然是消�队列,那么Kafka也就拥有消�队列的相应的特性了。
+
+**消æ�¯é˜Ÿåˆ—的好处** 1. 解耦å�ˆ 耦å�ˆçš„状æ€�è¡¨ç¤ºå½“ä½ å®žçŽ°æŸ�个功能的时候,是直接接入当å‰�接å�£ï¼Œè€Œåˆ©ç”¨æ¶ˆæ�¯é˜Ÿåˆ—,å�¯ä»¥å°†ç›¸åº”的消æ�¯å�‘é€�到消æ�¯é˜Ÿåˆ—ï¼Œè¿™æ ·çš„è¯�,如果接å�£å‡ºäº†é—®é¢˜ï¼Œå°†ä¸�会影å“�到当å‰�的功能。
+
+
+
+
+
+
+
+
+1. 异æ¥å¤„ç�† 异æ¥å¤„ç�†æ›¿ä»£äº†ä¹‹å‰�çš„å�Œæ¥å¤„ç�†ï¼Œå¼‚æ¥å¤„ç�†ä¸�需è¦�让æµ�程走完就返回结果,å�¯ä»¥å°†æ¶ˆæ�¯å�‘é€�到消æ�¯é˜Ÿåˆ—ä¸ï¼Œç„¶å�Žè¿”回结果,剩下让其他业务处ç�†æŽ¥å�£ä»Žæ¶ˆæ�¯é˜Ÿåˆ—䏿‹‰å�–消费处ç�†å�³å�¯ã€‚
+
+2. æµ�é‡�削峰 高æµ�é‡�的时候,使用消æ�¯é˜Ÿåˆ—作为ä¸é—´ä»¶å�¯ä»¥å°†æµ�é‡�的高峰ä¿�å˜åœ¨æ¶ˆæ�¯é˜Ÿåˆ—ä¸ï¼Œä»Žè€Œé˜²æ¢äº†ç³»ç»Ÿçš„高请求,å‡�è½»æœ�务器的请求处ç�†åŽ‹åŠ›ã€‚
+
+## 2.1 Kafka消费模�
+
+Kafka的消费模å¼�主è¦�有两ç§�:一ç§�是一对一的消费,也å�³ç‚¹å¯¹ç‚¹çš„通信,å�³ä¸€ä¸ªå�‘é€�一个接收。第二ç§�为一对多的消费,å�³ä¸€ä¸ªæ¶ˆæ�¯å�‘é€�到消æ�¯é˜Ÿåˆ—ï¼Œæ¶ˆè´¹è€…æ ¹æ�®æ¶ˆæ�¯é˜Ÿåˆ—的订阅拉å�–消æ�¯æ¶ˆè´¹ã€‚
+
+**一对一**
+
+
+
+
+
+
+
+
+消æ�¯ç”Ÿäº§è€…å�‘布消æ�¯åˆ°Queue队列ä¸ï¼Œé€šçŸ¥æ¶ˆè´¹è€…ä»Žé˜Ÿåˆ—ä¸æ‹‰å�–消æ�¯è¿›è¡Œæ¶ˆè´¹ã€‚消æ�¯è¢«æ¶ˆè´¹ä¹‹å�Žåˆ™åˆ 除,Queue支æŒ�多个消费者,但对于一æ�¡æ¶ˆæ�¯è€Œè¨€ï¼Œå�ªæœ‰ä¸€ä¸ªæ¶ˆè´¹è€…å�¯ä»¥æ¶ˆè´¹ï¼Œå�³ä¸€æ�¡æ¶ˆæ�¯å�ªèƒ½è¢«ä¸€ä¸ªæ¶ˆè´¹è€…消费。
+
+**一对多**
+
+
+
+
+
+
+
+
+è¿™ç§�模å¼�也称为å�‘布/订阅模å¼�,å�³åˆ©ç”¨Topicå˜å‚¨æ¶ˆæ�¯ï¼Œæ¶ˆæ�¯ç”Ÿäº§è€…将消æ�¯å�‘布到Topicä¸ï¼Œå�Œæ—¶æœ‰å¤šä¸ªæ¶ˆè´¹è€…订阅æ¤topic,消费者å�¯ä»¥ä»Žä¸æ¶ˆè´¹æ¶ˆæ�¯ï¼Œæ³¨æ„�å�‘布到Topicä¸çš„æ¶ˆæ�¯ä¼šè¢«å¤šä¸ªæ¶ˆè´¹è€…消费,消费者消费数æ�®ä¹‹å�Žï¼Œæ•°æ�®ä¸�会被清除,Kafka会默认ä¿�留一段时间,然å�Žå†�åˆ é™¤ã€‚
+
+## 2.2 Kafka的基础架构
+
+
+
+
+
+
+
+
+Kafkaåƒ�å…¶ä»–Mqä¸€æ ·ï¼Œä¹Ÿæœ‰è‡ªå·±çš„åŸºç¡€æž¶æž„ï¼Œä¸»è¦�å˜åœ¨ç”Ÿäº§è€…Producerã€�Kafka集群Brokerã€�消费者Consumerã€�注册ä¸å¿ƒZookeeper.
+
+1. Producer:消æ�¯ç”Ÿäº§è€…,å�‘Kafkaä¸å�‘布消æ�¯çš„角色。
+
+2. Consumer:消æ�¯æ¶ˆè´¹è€…,å�³ä»ŽKafka䏿‹‰å�–消æ�¯æ¶ˆè´¹çš„客户端。
+
+3. Consumer Group:消费者组,消费者组则是一组ä¸å˜åœ¨å¤šä¸ªæ¶ˆè´¹è€…,消费者消费Brokerä¸å½“å‰�Topicçš„ä¸�å�Œåˆ†åŒºä¸çš„æ¶ˆæ�¯ï¼Œæ¶ˆè´¹è€…组之间互ä¸�å½±å“�,所有的消费者都属于æŸ�个消费者组,å�³æ¶ˆè´¹è€…组是逻辑上的一个订阅者。æŸ�一个分区ä¸çš„æ¶ˆæ�¯å�ªèƒ½å¤Ÿä¸€ä¸ªæ¶ˆè´¹è€…组ä¸çš„一个消费者所消费
+
+4. Broker:�纪人,一�Kafka�务器就是一个Broker,一个集群由多个Broker组�,一个Broker�以容纳多个Topic。
+
+5. Topic:主题,�以�解为一个队列,生产者和消费者都是��一个Topic
+
+6. Partition:分区,为了实现扩展性,一个�常大的Topic�以分布到多个Broker上,一个Topic�以分为多个Partition,�个Partition是一个有�的队列(分区有�,�能��全局有�)
+
+7. Replica:副本Replication,为ä¿�è¯�é›†ç¾¤ä¸æŸ�个节点å�‘生故障,节点上的Partitionæ•°æ�®ä¸�丢失,Kafkaå�¯ä»¥æ£å¸¸çš„工作,Kafkaæ��供了副本机制,一个Topicçš„æ¯�个分区有若干个副本,一个Leader和多个Follower
+
+8. Leader:�个分区多个副本的主角色,生产者��数�的对象,以�消费者消费数�的对象都是Leader。
+
+9. Follower:æ¯�个分区多个副本的从角色,实时的从Leaderä¸å�Œæ¥æ•°æ�®ï¼Œä¿�æŒ�å’ŒLeaderæ•°æ�®çš„å�Œæ¥ï¼ŒLeaderå�‘生故障的时候,æŸ�个Follower会æˆ�为新的Leader。
+
+上述一个Topic会产生多个分区Partition,分区ä¸åˆ†ä¸ºLeaderå’ŒFollower,消æ�¯ä¸€èˆ¬å�‘é€�到Leader,Follower通过数æ�®çš„å�Œæ¥ä¸ŽLeaderä¿�æŒ�å�Œæ¥ï¼Œæ¶ˆè´¹çš„è¯�也是在Leaderä¸å�‘生消费,如果多个消费者,则分别消费Leaderå’Œå�„个Followerä¸çš„æ¶ˆæ�¯ï¼Œå½“Leaderå�‘生故障的时候,æŸ�个Follower会æˆ�ä¸ºä¸»èŠ‚ç‚¹ï¼Œæ¤æ—¶ä¼šå¯¹é½�消æ�¯çš„å��ç§»é‡�。
+
+## å�‚考文ç«
+https://blog.csdn.net/cao131502
+https://zhuanlan.zhihu.com/p/137811719
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\345\216\237\347\220\206\345\210\206\346\236\220\346\200\273\347\273\223\347\257\207.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\345\216\237\347\220\206\345\210\206\346\236\220\346\200\273\347\273\223\347\257\207.md"
new file mode 100644
index 0000000..58632b3
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\345\216\237\347\220\206\345\210\206\346\236\220\346\200\273\347\273\223\347\257\207.md"
@@ -0,0 +1,636 @@
+## 一�概述
+
+Kakfaèµ·åˆ�是由LinkedInå…¬å�¸å¼€å�‘的一个分布å¼�的消æ�¯ç³»ç»Ÿï¼Œå�Žæˆ�为Apache的一部分,它使用Scala编写,以å�¯æ°´å¹³æ‰©å±•和高å�žå��率而被广泛使用。目å‰�è¶Šæ�¥è¶Šå¤šçš„å¼€æº�分布å¼�处ç�†ç³»ç»Ÿå¦‚Clouderaã€�Apache Stormã€�Sparkç‰éƒ½æ”¯æŒ�与Kafka集æˆ�。
+
+Kafkaå‡å€Ÿç�€è‡ªèº«çš„优势,越æ�¥è¶Šå�—到互è�”网ä¼�业的é�’ç��,唯å“�会也采用Kafkaä½œä¸ºå…¶å†…éƒ¨æ ¸å¿ƒæ¶ˆæ�¯å¼•擎之一。Kafka作为一个商业级消æ�¯ä¸é—´ä»¶ï¼Œæ¶ˆæ�¯å�¯é� 性的é‡�è¦�性å�¯æƒ³è€ŒçŸ¥ã€‚如何确ä¿�消æ�¯çš„ç²¾ç¡®ä¼ è¾“?如何确ä¿�消æ�¯çš„准确å˜å‚¨?如何确ä¿�消æ�¯çš„æ£ç¡®æ¶ˆè´¹?这些都是需è¦�考虑的问题。本文首先从Kafka的架构ç�€æ‰‹ï¼Œå…ˆäº†è§£ä¸‹Kafka的基本原ç�†ï¼Œç„¶å�Žé€šè¿‡å¯¹kakfaçš„å˜å‚¨æœºåˆ¶ã€�å¤�制原ç�†ã€�å�Œæ¥åŽŸç�†ã€�å�¯é� 性和æŒ�久性ä¿�è¯�ç‰ç‰ä¸€æ¥æ¥å¯¹å…¶å�¯é� 性进行分æž�,最å�Žé€šè¿‡benchmarkæ�¥å¢žå¼ºå¯¹Kafka高å�¯é� 性的认知。
+
+
+
+
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## 二�Kafka的使用场景
+
+(1)日志收集:一个公å�¸å�¯ä»¥ç”¨Kafkaå�¯ä»¥æ”¶é›†å�„ç§�æœ�务的log,通过kafka以统一接å�£æœ�务的方å¼�开放给å�„ç§�consumer,例如Hadoopã€�Hbaseã€�Solrç‰ï¼›
+
+(2)消æ�¯ç³»ç»Ÿï¼šè§£è€¦å’Œç”Ÿäº§è€…和消费者ã€�ç¼“å˜æ¶ˆæ�¯ç‰ï¼›
+
+(3)用户活动跟踪:Kafkaç»�常被用æ�¥è®°å½•web用户或者app用户的å�„ç§�活动,如æµ�览网页ã€�æ�œç´¢ã€�ç‚¹å‡»ç‰æ´»åŠ¨ï¼Œè¿™äº›æ´»åŠ¨ä¿¡æ�¯è¢«å�„个æœ�务器å�‘布到kafkaçš„topicä¸ï¼Œç„¶å�Žè®¢é˜…者通过订阅这些topicæ�¥å�šå®žæ—¶çš„监控分æž�,或者装载到Hadoopã€�æ•°æ�®ä»“库ä¸å�šç¦»çº¿åˆ†æž�和挖掘;
+
+(4)è¿�è�¥æŒ‡æ ‡ï¼šKafka也ç»�常用æ�¥è®°å½•è¿�è�¥ç›‘控数æ�®ã€‚包括收集å�„ç§�分布å¼�应用的数æ�®ï¼Œç”Ÿäº§å�„ç§�æ“�作的集ä¸å��馈,比如报è¦å’ŒæŠ¥å‘Šï¼›
+
+(5)��处�:比如spark streaming和storm;
+
+(6)事件�;
+
+
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## 三�Kafka基本架构
+
+
+
+如上图所示,一个典型的Kafka体系架构包括:
+
+* 若干Producer(å�¯ä»¥æ˜¯æœ�务器日志,业务数æ�®ï¼Œé¡µé�¢å‰�端产生的page viewç‰ç‰),
+* 若干broker(Kafka支�水平扩展,一般broker数�越多,集群��率越高),
+* 若干Consumer (Group),以�一个Zookeeper集群。
+
+Kafka通过Zookeeper管�集群�置,选举leader,以�在consumer group�生�化时进行rebalance。Producer使用push(推)模�将消��布到broker,Consumer使用pull(拉)模�从broker订阅并消费消�。
+
+
+
+### 1�Topic & Partition
+
+一个topicå�¯ä»¥è®¤ä¸ºä¸€ä¸ªä¸€ç±»æ¶ˆæ�¯ï¼Œæ¯�个topic将被分æˆ�多个partition,æ¯�个partition在å˜å‚¨å±‚é�¢æ˜¯append log文件。任何å�‘布到æ¤partition的消æ�¯éƒ½ä¼šè¢«è¿½åŠ åˆ°log文件的尾部,æ¯�æ�¡æ¶ˆæ�¯åœ¨æ–‡ä»¶ä¸çš„ä½�置称为offset(å��ç§»é‡�),offset为一个long型的数å—ï¼Œå®ƒå”¯ä¸€æ ‡è®°ä¸€æ�¡æ¶ˆæ�¯ã€‚æ¯�æ�¡æ¶ˆæ�¯éƒ½è¢«append到partitionä¸ï¼Œæ˜¯é¡ºåº�写ç£�ç›˜ï¼Œå› æ¤æ•ˆçއé�žå¸¸é«˜(ç»�验è¯�,顺åº�写ç£�盘效率比éš�机写内å˜è¿˜è¦�高,这是Kafka高å�žå��率的一个很é‡�è¦�çš„ä¿�è¯�)。
+
+
+
+æ¯�一æ�¡æ¶ˆæ�¯è¢«å�‘é€�到brokerä¸ï¼Œä¼šæ ¹æ�®partition规则选择被å˜å‚¨åˆ°å“ªä¸€ä¸ªpartition。partition机制å�¯ä»¥é€šè¿‡æŒ‡å®šproducerçš„partition.class这一å�‚æ•°æ�¥æŒ‡å®šï¼Œè¯¥class必须实现kafka.producer.Partitioner接å�£ã€‚如果partition规则设置的å�ˆç�†ï¼Œæ‰€æœ‰æ¶ˆæ�¯å�¯ä»¥å�‡åŒ€åˆ†å¸ƒåˆ°ä¸�å�Œçš„partitioné‡Œï¼Œè¿™æ ·å°±å®žçŽ°äº†æ°´å¹³æ‰©å±•ã€‚(如果一个topic对应一个文件,那这个文件所在的机器I/O将会æˆ�为这个topic的性能瓶颈,而partition解决了这个问题)。在创建topicæ—¶å�¯ä»¥åœ¨$KAFKA_HOME/config/server.properties䏿Œ‡å®šè¿™ä¸ªpartition的数é‡�(如下所示),当然å�¯ä»¥åœ¨topic创建之å�ŽåŽ»ä¿®æ”¹partition的数é‡�。
+
+
+
+# The default number of log partitions per topic. More partitions allow greater
+# parallelism for consumption, but this will also result in more files across
+# the brokers.
+#默认partitions数�
+num.partitions=1
+
+
+
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## å››ã€�高å�¯é� 性å˜å‚¨åˆ†æž�概述
+
+Kafka的高å�¯é� 性的ä¿�éšœæ�¥æº�于其å�¥å£®çš„副本(replication)ç–略。通过调节其副本相关å�‚数,å�¯ä»¥ä½¿å¾—Kafka在性能和å�¯é� 性之间è¿�转的游刃有余。Kafka从0.8.x版本开始æ��ä¾›partition级别的å¤�制,replication的数é‡�å�¯ä»¥åœ¨$KAFKA_HOME/config/server.propertiesä¸é…�ç½®(default.replication.refactor)。
+
+这里先从Kafka文件å˜å‚¨æœºåˆ¶å…¥æ‰‹ï¼Œä»Žæœ€åº•层了解Kafkaçš„å˜å‚¨ç»†èŠ‚ï¼Œè¿›è€Œå¯¹å…¶çš„å˜å‚¨æœ‰ä¸ªå¾®è§‚的认知。之å�Žé€šè¿‡Kafkaå¤�制原ç�†å’Œå�Œæ¥æ–¹å¼�æ�¥é˜�è¿°å®�观层é�¢çš„æ¦‚念。最å�Žä»ŽISR,HW,leader选举以å�Šæ•°æ�®å�¯é� 性和æŒ�久性ä¿�è¯�ç‰ç‰å�„个维度æ�¥ä¸°å¯Œå¯¹Kafka相关知识点的认知。
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## 五ã€�Kafka文件å˜å‚¨æœºåˆ¶
+
+Kafka䏿¶ˆæ�¯æ˜¯ä»¥topic进行分类的,生产者通过topicå�‘Kafka brokerå�‘é€�消æ�¯ï¼Œæ¶ˆè´¹è€…通过topic读å�–æ•°æ�®ã€‚然而topic在物ç�†å±‚é�¢å�ˆèƒ½ä»¥partition为分组,一个topicå�¯ä»¥åˆ†æˆ�若干个partition,那么topic以å�Špartitionå�ˆæ˜¯æ€Žä¹ˆå˜å‚¨çš„å‘¢?partition还å�¯ä»¥ç»†åˆ†ä¸ºsegment,一个partition物ç�†ä¸Šç”±å¤šä¸ªsegment组æˆ�,那么这些segmentå�ˆæ˜¯ä»€ä¹ˆå‘¢?下é�¢æˆ‘们æ�¥ä¸€ä¸€æ�晓。
+
+为了便于说明问题,å�‡è®¾è¿™é‡Œå�ªæœ‰ä¸€ä¸ªKafka集群,且这个集群å�ªæœ‰ä¸€ä¸ªKafka broker,å�³å�ªæœ‰ä¸€å�°ç‰©ç�†æœºã€‚在这个Kafka brokerä¸é…�ç½®($KAFKA_HOME/config/server.propertiesä¸)log.dirs=/tmp/kafka-logsï¼Œä»¥æ¤æ�¥è®¾ç½®Kafka消æ�¯æ–‡ä»¶å˜å‚¨ç›®å½•,与æ¤å�Œæ—¶åˆ›å»ºä¸€ä¸ªtopic:topic_zzh_test,partition的数é‡�为4($KAFKA_HOME/bin/kafka-topics.sh –create –zookeeper localhost:2181 –partitions 4 –topic topic_vms_test –replication-factor 4)ã€‚é‚£ä¹ˆæˆ‘ä»¬æ¤æ—¶å�¯ä»¥åœ¨/tmp/kafka-logs目录ä¸å�¯ä»¥çœ‹åˆ°ç”Ÿæˆ�了4个目录:
+
+
+
+
+
+drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-0
+drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-1
+drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-2
+drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-3
+
+
+
+
+在Kafka文件å˜å‚¨ä¸ï¼Œå�Œä¸€ä¸ªtopic下有多个ä¸�å�Œçš„partition,æ¯�个partiton为一个目录,partitionçš„å��称规则为:topicå��ç§°+有åº�åº�å�·ï¼Œç¬¬ä¸€ä¸ªåº�å�·ä»Ž0开始计,最大的åº�å�·ä¸ºpartitionæ•°é‡�å‡�1,partition是实际物ç�†ä¸Šçš„æ¦‚念,而topic是逻辑上的概念。
+
+上é�¢æ��到partition还å�¯ä»¥ç»†åˆ†ä¸ºsegment,这个segmentå�ˆæ˜¯ä»€ä¹ˆ?如果就以partition为最å°�å˜å‚¨å�•ä½�,我们å�¯ä»¥æƒ³è±¡å½“Kafka producerä¸�æ–å�‘é€�消æ�¯ï¼Œå¿…然会引起partitionæ–‡ä»¶çš„æ— é™�æ‰©å¼ ï¼Œè¿™æ ·å¯¹äºŽæ¶ˆæ�¯æ–‡ä»¶çš„维护以å�Šå·²ç»�被消费的消æ�¯çš„æ¸…ç�†å¸¦æ�¥ä¸¥é‡�的影å“�,所以这里以segment为å�•ä½�å�ˆå°†partition细分。æ¯�个partition(目录)相当于一个巨型文件被平å�‡åˆ†é…�到多个大å°�相ç‰çš„segment(段)æ•°æ�®æ–‡ä»¶ä¸(æ¯�个segment æ–‡ä»¶ä¸æ¶ˆæ�¯æ•°é‡�ä¸�一定相ç‰)è¿™ç§�特性也方便old segmentçš„åˆ é™¤ï¼Œå�³æ–¹ä¾¿å·²è¢«æ¶ˆè´¹çš„æ¶ˆæ�¯çš„æ¸…ç�†ï¼Œæ��高ç£�盘的利用率。æ¯�个partitionå�ªéœ€è¦�支æŒ�顺åº�读写就行,segment的文件生命周期由æœ�务端é…�ç½®å�‚æ•°(log.segment.bytes,log.roll.{ms,hours}ç‰è‹¥å¹²å�‚æ•°)决定。
+
+
+
+
+
+[](javascript:void(0); "å¤�制代ç �")
+
+ #在强制刷新数�到�盘�许接收消�的数�
+#log.flush.interval.messages=10000 # 在强制刷新之å‰�,消æ�¯å�¯ä»¥åœ¨æ—¥å¿—ä¸å�œç•™çš„æœ€é•¿æ—¶é—´
+#log.flush.interval.ms=1000 #一个日志的最å°�å˜æ´»æ—¶é—´ï¼Œå�¯ä»¥è¢«åˆ 除
+log.retention.hours=168 # 一个基于大å°�的日志ä¿�ç•™ç–略。段将被从日志ä¸åˆ 除å�ªè¦�剩下的部分段ä¸�低于log.retention.bytes。
+#log.retention.bytes=1073741824 # �一个日志段大�的最大值。当到达这个大�时,会生�一个新的片段。
+log.segment.bytes=1073741824 # 检查日志段的时间间隔,看是å�¦å�¯ä»¥æ ¹æ�®ä¿�ç•™ç–ç•¥åˆ é™¤å®ƒä»¬
+log.retention.check.interval.ms=300000
+
+
+[](javascript:void(0); "å¤�制代ç �")
+
+
+
+segment文件由两部分组æˆ�,分别为“.indexâ€�文件和“.logâ€�文件,分别表示为segment索引文件和数æ�®æ–‡ä»¶ã€‚这两个文件的命令规则为:partition全局的第一个segment从0开始,å�Žç»æ¯�个segment文件å��为上一个segment文件最å�Žä¸€æ�¡æ¶ˆæ�¯çš„offset值,数值大å°�为64ä½�,20ä½�æ•°å—å—符长度,没有数å—用0填充,如下:
+
+
+
+
+
+
+
+[](javascript:void(0); "å¤�制代ç �")
+
+00000000000000000000.index 00000000000000000000.log 00000000000000170410.index 00000000000000170410.log 00000000000000239430.index 00000000000000239430.log
+
+[](javascript:void(0); "å¤�制代ç �")
+
+
+
+以上�的segment文件为例,展示出segment:00000000000000170410的“.index�文件和“.log�文件的对应的关系,如下图:
+
+
+
+
+
+
+
+如上图,“.indexâ€�索引文件å˜å‚¨å¤§é‡�的元数æ�®ï¼Œâ€œ.logâ€�æ•°æ�®æ–‡ä»¶å˜å‚¨å¤§é‡�的消æ�¯ï¼Œç´¢å¼•文件ä¸çš„元数æ�®æŒ‡å�‘对应数æ�®æ–‡ä»¶ä¸message的物ç�†å��移地å�€ã€‚å…¶ä¸ä»¥â€œ.indexâ€�索引文件ä¸çš„元数æ�®[3, 348]为例,在“.logâ€�æ•°æ�®æ–‡ä»¶è¡¨ç¤ºç¬¬3个消æ�¯ï¼Œå�³åœ¨å…¨å±€partitionä¸è¡¨ç¤º170410+3=170413个消æ�¯ï¼Œè¯¥æ¶ˆæ�¯çš„物ç�†å��移地å�€ä¸º348。
+
+那么如何从partitionä¸é€šè¿‡offset查找messageå‘¢?
+
+以上图为例,读å�–offset=170418的消æ�¯ï¼Œé¦–先查找segment文件,其ä¸00000000000000000000.index为最开始的文件,第二个文件为00000000000000170410.index(èµ·å§‹å��移为170410+1=170411),而第三个文件为00000000000000239430.index(èµ·å§‹å��移为239430+1=239431),所以这个offset=170418å°±è�½åˆ°äº†ç¬¬äºŒä¸ªæ–‡ä»¶ä¹‹ä¸ã€‚å…¶ä»–å�Žç»æ–‡ä»¶å�¯ä»¥ä¾�次类推,以其实å��ç§»é‡�命å��并排列这些文件,然å�Žæ ¹æ�®äºŒåˆ†æŸ¥æ‰¾æ³•å°±å�¯ä»¥å¿«é€Ÿå®šä½�到具体文件ä½�ç½®ã€‚å…¶æ¬¡æ ¹æ�®00000000000000170410.index文件ä¸çš„[8,1325]定ä½�到00000000000000170410.log文件ä¸çš„1325çš„ä½�置进行读å�–。
+
+è¦�是读å�–offset=170418的消æ�¯ï¼Œä»Ž00000000000000170410.log文件ä¸çš„1325çš„ä½�置进行读å�–,那么怎么知é�“何时读完本æ�¡æ¶ˆæ�¯ï¼Œå�¦åˆ™å°±è¯»åˆ°ä¸‹ä¸€æ�¡æ¶ˆæ�¯çš„内容了?
+
+这个就需è¦�è�”系到消æ�¯çš„物ç�†ç»“构了,消æ�¯éƒ½å…·æœ‰å›ºå®šçš„物ç�†ç»“构,包括:offset(8 Bytes)ã€�消æ�¯ä½“的大å°�(4 Bytes)ã€�crc32(4 Bytes)ã€�magic(1 Byte)ã€�attributes(1 Byte)ã€�key length(4 Bytes)ã€�key(K Bytes)ã€�payload(N Bytes)ç‰ç‰å—段,å�¯ä»¥ç¡®å®šä¸€æ�¡æ¶ˆæ�¯çš„大å°�,å�³è¯»å�–到哪里截æ¢ã€‚
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## å…ã€�å¤�制原ç�†å’Œå�Œæ¥æ–¹å¼�
+
+Kafkaä¸topicçš„æ¯�个partition有一个预写å¼�的日志文件,虽然partitionå�¯ä»¥ç»§ç»ç»†åˆ†ä¸ºè‹¥å¹²ä¸ªsegment文件,但是对于上层应用æ�¥è¯´å�¯ä»¥å°†partition看æˆ�最å°�çš„å˜å‚¨å�•å…ƒ(一个有多个segment文件拼接的“巨型â€�文件),æ¯�个partition都由一些列有åº�çš„ã€�ä¸�å�¯å�˜çš„æ¶ˆæ�¯ç»„æˆ�,这些消æ�¯è¢«è¿žç»çš„è¿½åŠ åˆ°partitionä¸ã€‚
+
+
+
+ä¸Šå›¾ä¸æœ‰ä¸¤ä¸ªæ–°å��è¯�:HWå’ŒLEO。这里先介ç»�下LEO,LogEndOffset的缩写,表示æ¯�个partitionçš„log最å�Žä¸€æ�¡Messageçš„ä½�置。HW是HighWatermark的缩写,是指consumer能够看到的æ¤partitionçš„ä½�置,这个涉å�Šåˆ°å¤šå‰¯æœ¬çš„æ¦‚念,这里先æ��å�Šä¸€ä¸‹ï¼Œä¸‹èŠ‚å†�详表。
+
+言归æ£ä¼ ,为了æ��高消æ�¯çš„å�¯é� 性,Kafkaæ¯�个topicçš„partition有N个副本(replicas),其ä¸N(大于ç‰äºŽ1)是topicçš„å¤�åˆ¶å› å�(replica fator)的个数。Kafka通过多副本机制实现故障自动转移,当Kafka集群ä¸ä¸€ä¸ªbroker失效情况下ä»�ç„¶ä¿�è¯�æœ�务å�¯ç”¨ã€‚在Kafkaä¸å�‘生å¤�制时确ä¿�partition的日志能有åº�地写到其他节点上,N个replicasä¸ï¼Œå…¶ä¸ä¸€ä¸ªreplica为leader,其他都为follower, leader处ç�†partition的所有读写请求,与æ¤å�Œæ—¶ï¼Œfollower会被动定期地去å¤�制leader上的数æ�®ã€‚
+
+如下图所示,Kafkaé›†ç¾¤ä¸æœ‰4个broker, æŸ�topic有3个partition,且å¤�åˆ¶å› å�å�³å‰¯æœ¬ä¸ªæ•°ä¹Ÿä¸º3:
+
+
+
+Kafkaæ��供了数æ�®å¤�制算法ä¿�è¯�,如果leaderå�‘生故障或挂掉,一个新leader被选举并被接å�—客户端的消æ�¯æˆ�功写入。Kafkaç¡®ä¿�从å�Œæ¥å‰¯æœ¬åˆ—表ä¸é€‰ä¸¾ä¸€ä¸ªå‰¯æœ¬ä¸ºleader,或者说follower追赶leaderæ•°æ�®ã€‚leader负责维护和跟踪ISR(In-Sync Replicas的缩写,表示副本å�Œæ¥é˜Ÿåˆ—,具体å�¯å�‚考下节)䏿‰€æœ‰follower滞å�Žçš„状æ€�。当producerå�‘é€�一æ�¡æ¶ˆæ�¯åˆ°brokerå�Žï¼Œleader写入消æ�¯å¹¶å¤�制到所有follower。消æ�¯æ��交之å�Žæ‰�被æˆ�功å¤�制到所有的å�Œæ¥å‰¯æœ¬ã€‚消æ�¯å¤�制延迟å�—最慢的followeré™�制,é‡�è¦�的是快速检测慢副本,如果follower“è�½å�Žâ€�太多或者失效,leader将会把它从ISRä¸åˆ 除。
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## 七�零拷�
+
+Kafkaä¸å˜åœ¨å¤§é‡�的网络数æ�®æŒ�久化到ç£�盘(Producer到Broker)和ç£�盘文件通过网络å�‘é€�(Broker到Consumer)的过程。这一过程的性能直接影å“�Kafka的整体å�žå��é‡�。
+
+
+
+### 1ã€�ä¼ ç»Ÿæ¨¡å¼�下的四次拷è´�与四次上下文切æ�¢
+
+以将ç£�盘文件通过网络å�‘é€�ä¸ºä¾‹ã€‚ä¼ ç»Ÿæ¨¡å¼�下,一般使用如下伪代ç �所示的方法先将文件数æ�®è¯»å…¥å†…å˜ï¼Œç„¶å�Žé€šè¿‡Socket将内å˜ä¸çš„æ•°æ�®å�‘é€�出去。
+
+
+
+buffer = File.read
+Socket.send(buffer)
+
+
+
+
+这一过程实际上å�‘生了四次数æ�®æ‹·è´�。首先通过系统调用将文件数æ�®è¯»å…¥åˆ°å†…æ ¸æ€�Buffer(DMAæ‹·è´�),然å�Žåº”用程åº�å°†å†…å˜æ€�Bufferæ•°æ�®è¯»å…¥åˆ°ç”¨æˆ·æ€�Buffer(CPUæ‹·è´�),接ç�€ç”¨æˆ·ç¨‹åº�通过Socketå�‘é€�æ•°æ�®æ—¶å°†ç”¨æˆ·æ€�Bufferæ•°æ�®æ‹·è´�åˆ°å†…æ ¸æ€�Buffer(CPUæ‹·è´�),最å�Žé€šè¿‡DMAæ‹·è´�将数æ�®æ‹·è´�到NIC Buffer。å�Œæ—¶ï¼Œè¿˜ä¼´éš�ç�€å››æ¬¡ä¸Šä¸‹æ–‡åˆ‡æ�¢ï¼Œå¦‚下图所示。
+
+
+
+### 2�sendfile和transferTo实现零拷�
+
+Linux 2.4+å†…æ ¸é€šè¿‡`sendfile`系统调用,æ��供了零拷è´�。数æ�®é€šè¿‡DMAæ‹·è´�åˆ°å†…æ ¸æ€�Bufferå�Žï¼Œç›´æŽ¥é€šè¿‡DMAæ‹·è´�到NIC Bufferï¼Œæ— éœ€CPUæ‹·è´�。这也是零拷è´�这一说法的æ�¥æº�。除了å‡�å°‘æ•°æ�®æ‹·è´�å¤–ï¼Œå› ä¸ºæ•´ä¸ªè¯»æ–‡ä»¶-网络å�‘é€�由一个`sendfile`调用完æˆ�,整个过程å�ªæœ‰ä¸¤æ¬¡ä¸Šä¸‹æ–‡åˆ‡æ�¢ï¼Œå› æ¤å¤§å¤§æ��高了性能。零拷è´�过程如下图所示。
+
+
+
+从具体实现æ�¥çœ‹ï¼ŒKafka的数æ�®ä¼ 输通过TransportLayeræ�¥å®Œæˆ�,其å�ç±»`PlaintextTransportLayer`通过[Java NIO](http://www.jasongj.com/java/nio_reactor/)çš„FileChannelçš„`transferTo`å’Œ`transferFrom`方法实现零拷è´�,如下所示。
+
+
+
+@Override public long transferFrom(FileChannel fileChannel, long position, long count) throws IOException { return fileChannel.transferTo(position, count, socketChannel);
+}
+
+
+
+
+**注:** `transferTo`å’Œ`transferFrom`å¹¶ä¸�ä¿�è¯�一定能使用零拷è´�。实际上是å�¦èƒ½ä½¿ç”¨é›¶æ‹·è´�与æ“�作系统相关,如果æ“�作系统æ��ä¾›`sendfile`è¿™æ ·çš„é›¶æ‹·è´�ç³»ç»Ÿè°ƒç”¨ï¼Œåˆ™è¿™ä¸¤ä¸ªæ–¹æ³•ä¼šé€šè¿‡è¿™æ ·çš„ç³»ç»Ÿè°ƒç”¨å……åˆ†åˆ©ç”¨é›¶æ‹·è´�的优势,å�¦åˆ™å¹¶ä¸�能通过这两个方法本身实现零拷è´�。
+
+
+
+
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## å…«ã€� ISR(副本å�Œæ¥é˜Ÿåˆ—)
+
+上节我们涉å�Šåˆ°ISR (In-Sync Replicas),这个是指副本å�Œæ¥é˜Ÿåˆ—。副本数对Kafkaçš„å�žå��率是有一定的影å“�,但æž�大的增强了å�¯ç”¨æ€§ã€‚默认情况下Kafkaçš„replicaæ•°é‡�为1,å�³æ¯�个partition都有一个唯一的leader,为了确ä¿�消æ�¯çš„å�¯é� 性,通常应用ä¸å°†å…¶å€¼(ç”±brokerçš„å�‚æ•°offsets.topic.replication.factor指定)大å°�设置为大于1,比如3。 所有的副本(replicas)统称为Assigned Replicas,å�³AR。ISR是ARä¸çš„一个å�集,由leader维护ISR列表,follower从leaderå�Œæ¥æ•°æ�®æœ‰ä¸€äº›å»¶è¿Ÿ(包括延迟时间replica.lag.time.max.ms和延迟æ�¡æ•°replica.lag.max.messages两个维度, 当å‰�最新的版本0.10.xä¸å�ªæ”¯æŒ�replica.lag.time.max.ms这个维度),任æ„�一个超过阈值都会把follower剔除出ISR, å˜å…¥OSR(Outof-Sync Replicas)åˆ—è¡¨ï¼Œæ–°åŠ å…¥çš„followerä¹Ÿä¼šå…ˆå˜æ”¾åœ¨OSRä¸ã€‚AR=ISR+OSR
+
+Kafka 0.10.x版本å�Žç§»é™¤äº†replica.lag.max.messageså�‚数,å�ªä¿�留了replica.lag.time.max.ms作为ISRä¸å‰¯æœ¬ç®¡ç�†çš„å�‚æ•°ã€‚ä¸ºä»€ä¹ˆè¿™æ ·å�šå‘¢?replica.lag.max.messages表示当å‰�æŸ�个副本è�½å�Žleaeder的消æ�¯æ•°é‡�超过了这个å�‚数的值,那么leader就会把follower从ISRä¸åˆ 除。å�‡è®¾è®¾ç½®replica.lag.max.messages=4,那么如果producerä¸€æ¬¡ä¼ é€�至broker的消æ�¯æ•°é‡�都å°�于4æ�¡æ—¶ï¼Œå› 为在leader接å�—到producerå�‘é€�的消æ�¯ä¹‹å�Žè€Œfollower副本开始拉å�–这些消æ�¯ä¹‹å‰�,followerè�½å�Žleader的消æ�¯æ•°ä¸�会超过4æ�¡æ¶ˆæ�¯ï¼Œæ•…æ¤æ²¡æœ‰follower移出ISR,所以这时候replica.lag.max.message的设置似乎是å�ˆç�†çš„。但是producerå�‘起瞬时高峰æµ�é‡�,producer一次å�‘é€�的消æ�¯è¶…过4æ�¡æ—¶ï¼Œä¹Ÿå°±æ˜¯è¶…过replica.lag.max.messagesï¼Œæ¤æ—¶follower都会被认为是与leader副本ä¸�å�Œæ¥äº†ï¼Œä»Žè€Œè¢«è¸¢å‡ºäº†ISR。但实际上这些followeréƒ½æ˜¯å˜æ´»çжæ€�的且没有性能问题。那么在之å�Žè¿½ä¸Šleader,并被é‡�æ–°åŠ å…¥äº†ISR。于是就会出现它们ä¸�æ–地剔出ISRç„¶å�Žé‡�新回归ISRï¼Œè¿™æ— ç–‘å¢žåŠ äº†æ— è°“çš„æ€§èƒ½æ�Ÿè€—。而且这个å�‚数是broker全局的。设置太大了,影å“�真æ£â€œè�½å�Žâ€�follower的移除;设置的太å°�了,导致follower的频ç¹�è¿›å‡ºã€‚æ— æ³•ç»™å®šä¸€ä¸ªå�ˆé€‚çš„replica.lag.max.messages的值,故æ¤ï¼Œæ–°ç‰ˆæœ¬çš„Kafka移除了这个å�‚数。注:ISRä¸åŒ…括:leaderå’Œfollower。
+
+
+
+上é�¢ä¸€èŠ‚è¿˜æ¶‰å�Šåˆ°ä¸€ä¸ªæ¦‚念,å�³HW。HW俗称高水ä½�,HighWatermark的缩写,å�–一个partition对应的ISR䏿œ€å°�çš„LEO作为HW,consumer最多å�ªèƒ½æ¶ˆè´¹åˆ°HW所在的ä½�置。å�¦å¤–æ¯�个replica都有HW,leaderå’Œfollowerå�„自负责更新自己的HW的状æ€�。对于leader新写入的消æ�¯ï¼Œconsumerä¸�能立刻消费,leader会ç‰å¾…该消æ�¯è¢«æ‰€æœ‰ISRä¸çš„replicaså�Œæ¥å�Žæ›´æ–°HWï¼Œæ¤æ—¶æ¶ˆæ�¯æ‰�能被consumeræ¶ˆè´¹ã€‚è¿™æ ·å°±ä¿�è¯�了如果leader所在的broker失效,该消æ�¯ä»�ç„¶å�¯ä»¥ä»Žæ–°é€‰ä¸¾çš„leaderä¸èŽ·å�–。对于æ�¥è‡ªå†…部broKer的读å�–请求,没有HWçš„é™�制。
+
+下图详细的说明了当producer生产消�至broker�,ISR以�HW和LEO的�转过程:
+
+
+
+ç”±æ¤å�¯è§�,Kafkaçš„å¤�制机制既ä¸�是完全的å�Œæ¥å¤�制,也ä¸�是å�•纯的异æ¥å¤�制。事实上,å�Œæ¥å¤�制è¦�求所有能工作的follower都å¤�制完,这æ�¡æ¶ˆæ�¯æ‰�会被commit,这ç§�å¤�制方å¼�æž�大的影å“�了å�žå��率。而异æ¥å¤�制方å¼�下,follower异æ¥çš„从leaderå¤�制数æ�®ï¼Œæ•°æ�®å�ªè¦�被leader写入log就被认为已ç»�commit,这ç§�情况下如果follower都还没有å¤�制完,è�½å�ŽäºŽleader时,çª�ç„¶leader宕机,则会丢失数æ�®ã€‚而Kafka的这ç§�使用ISR的方å¼�则很好的å�‡è¡¡äº†ç¡®ä¿�æ•°æ�®ä¸�丢失以å�Šå�žå��率。
+
+Kafka的ISR的管�最终都会�馈到Zookeeper节点上。具体�置为:/brokers/topics/[topic]/partitions/[partition]/state。
+
+目�有两个地方会对这个Zookeeper的节点进行维护:
+
+Controlleræ�¥ç»´æŠ¤ï¼šKafka集群ä¸çš„å…¶ä¸ä¸€ä¸ªBroker会被选举为Controller,主è¦�è´Ÿè´£Partition管ç�†å’Œå‰¯æœ¬çжæ€�管ç�†ï¼Œä¹Ÿä¼šæ‰§è¡Œç±»ä¼¼äºŽé‡�分é…�partition之类的管ç�†ä»»åŠ¡ã€‚åœ¨ç¬¦å�ˆæŸ�些特定æ�¡ä»¶ä¸‹ï¼ŒController下的LeaderSelector会选举新的leader,ISR和新的leader_epochå�Šcontroller_epoch写入Zookeeper的相关节点ä¸ã€‚å�Œæ—¶å�‘èµ·LeaderAndIsrRequest通知所有的replicas。
+
+leaderæ�¥ç»´æŠ¤ï¼šleader有å�•独的线程定期检测ISRä¸follower是å�¦è„±ç¦»ISR, 如果å�‘现ISRå�˜åŒ–,则会将新的ISR的信æ�¯è¿”回到Zookeeper的相关节点ä¸ã€‚
+
+
+
+
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## ä¹�ã€�æ•°æ�®å�¯é� 性和æŒ�久性ä¿�è¯�
+
+当producerå�‘leaderå�‘é€�æ•°æ�®æ—¶ï¼Œå�¯ä»¥é€šè¿‡request.required.ackså�‚æ•°æ�¥è®¾ç½®æ•°æ�®å�¯é� 性的级别:
+
+
+
+* 1(默认):这æ„�味ç�€producer在ISRä¸çš„leaderå·²æˆ�功收到的数æ�®å¹¶å¾—到确认å�Žå�‘é€�下一æ�¡message。如果leader宕机了,则会丢失数æ�®ã€‚
+
+* 0:这æ„�味ç�€produceræ— éœ€ç‰å¾…æ�¥è‡ªbroker的确认而继ç»å�‘é€�下一批消æ�¯ã€‚è¿™ç§�情况下数æ�®ä¼ 输效率最高,但是数æ�®å�¯é� 性确是最低的。
+
+* -1:producer需è¦�ç‰å¾…ISRä¸çš„æ‰€æœ‰follower都确认接收到数æ�®å�Žæ‰�算一次å�‘é€�完æˆ�,å�¯é� æ€§æœ€é«˜ã€‚ä½†æ˜¯è¿™æ ·ä¹Ÿä¸�能ä¿�è¯�æ•°æ�®ä¸�丢失,比如当ISRä¸å�ªæœ‰leaderæ—¶(å‰�é�¢ISR那一节讲到,ISRä¸çš„æˆ�员由于æŸ�äº›æƒ…å†µä¼šå¢žåŠ ä¹Ÿä¼šå‡�少,最少就å�ªå‰©ä¸€ä¸ªleader)ï¼Œè¿™æ ·å°±å�˜æˆ�了acks=1的情况。
+
+ [官网�置说明](http://kafka.apache.org/documentation/#configuration)
+
+如果è¦�æ��高数æ�®çš„å�¯é� 性,在设置request.required.acks=-1çš„å�Œæ—¶ï¼Œä¹Ÿè¦�min.insync.replicas这个å�‚æ•°(å�¯ä»¥åœ¨broker或者topic层é�¢è¿›è¡Œè®¾ç½®)çš„é…�å�ˆï¼Œè¿™æ ·æ‰�能å�‘挥最大的功效。min.insync.replicas这个å�‚数设定ISRä¸çš„æœ€å°�副本数是多少,默认值为1,当且仅当request.required.ackså�‚数设置为-1时,æ¤å�‚æ•°æ‰�生效。如果ISRä¸çš„副本数少于min.insync.replicasé…�置的数é‡�时,客户端会返回异常:org.apache.kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required。
+
+
+
+接下�对acks=1和-1的两�情况进行详细分�:
+
+
+
+
+
+### 9.1�request.required.acks=1
+
+producerå�‘é€�æ•°æ�®åˆ°leader,leader写本地日志æˆ�功,返回客户端æˆ�功;æ¤æ—¶ISRä¸çš„副本还没有æ�¥å¾—å�Šæ‹‰å�–该消æ�¯ï¼Œleaderå°±å®•æœºäº†ï¼Œé‚£ä¹ˆæ¤æ¬¡å�‘é€�的消æ�¯å°±ä¼šä¸¢å¤±ã€‚
+
+
+
+
+
+### 9.2�request.required.acks=-1
+
+å�Œæ¥(Kafka默认为å�Œæ¥ï¼Œå�³producer.type=sync)çš„å�‘é€�模å¼�,replication.factor>=2且min.insync.replicas>=2的情况下,ä¸�会丢失数æ�®ã€‚
+
+有两ç§�典型情况。acks=-1的情况下(å¦‚æ— ç‰¹æ®Šè¯´æ˜Žï¼Œä»¥ä¸‹acks都表示为å�‚æ•°request.required.acks),数æ�®å�‘é€�到leader, ISRçš„follower全部完æˆ�æ•°æ�®å�Œæ¥å�Žï¼Œleaderæ¤æ—¶æŒ‚掉,那么会选举出新的leader,数æ�®ä¸�会丢失。
+
+
+
+acks=-1的情况下,数æ�®å�‘é€�到leaderå�Ž ï¼Œéƒ¨åˆ†ISR的副本å�Œæ¥ï¼Œleaderæ¤æ—¶æŒ‚掉。比如follower1hå’Œfollower2都有å�¯èƒ½å�˜æˆ�æ–°çš„leader, producer端会得到返回异常,producer端会é‡�æ–°å�‘é€�æ•°æ�®ï¼Œæ•°æ�®å�¯èƒ½ä¼šé‡�å¤�
+
+
+当然上图ä¸å¦‚果在leader crash的时候,follower2还没有å�Œæ¥åˆ°ä»»ä½•æ•°æ�®ï¼Œè€Œä¸”follower2被选举为新的leaderçš„è¯�ï¼Œè¿™æ ·æ¶ˆæ�¯å°±ä¸�会é‡�å¤�。
+
+注:Kafka�处�fail/recover问题,�处�Byzantine问题。
+
+
+
+
+
+### 9.3ã€�关于HWçš„è¿›ä¸€æ¥æŽ¢è®¨
+
+考虑上图(å�³acks=-1,部分ISR副本å�Œæ¥)ä¸çš„å�¦ä¸€ç§�情况,如果在Leader挂掉的时候,follower1å�Œæ¥äº†æ¶ˆæ�¯4,5,follower2å�Œæ¥äº†æ¶ˆæ�¯4,与æ¤å�Œæ—¶follower2被选举为leaderï¼Œé‚£ä¹ˆæ¤æ—¶follower1ä¸çš„多出的消æ�¯5该å�šå¦‚何处ç�†å‘¢?
+
+这里就需è¦�HWçš„å��å�Œé…�å�ˆäº†ã€‚如å‰�所述,一个partitionä¸çš„ISR列表ä¸ï¼Œleaderçš„HW是所有ISRåˆ—è¡¨é‡Œå‰¯æœ¬ä¸æœ€å°�的那个的LEO。类似于木桶原ç�†ï¼Œæ°´ä½�å�–决于最低那å�—çŸæ�¿ã€‚
+
+
+
+
+
+如上图,æŸ�个topicçš„æŸ�partition有三个副本,分别为Aã€�Bã€�C。A作为leader肯定是LEO最高,Bç´§éš�å…¶å�Žï¼ŒC机器由于é…�置比较低,网络比较差,故而å�Œæ¥æœ€æ…¢ã€‚这个时候A机器宕机,这时候如果Bæˆ�为leader,å�‡å¦‚没有HW,在Aé‡�æ–°æ�¢å¤�之å�Žä¼šå�šå�Œæ¥(makeFollower)æ“�作,在宕机时log文件之å�Žç›´æŽ¥å�šè¿½åŠ æ“�作,而å�‡å¦‚Bçš„LEOå·²ç»�达到了Açš„LEO,会产生数æ�®ä¸�一致的情况,所以使用HWæ�¥é�¿å…�è¿™ç§�情况。
+
+A在å�šå�Œæ¥æ“�作的时候,先将log文件截æ–到之å‰�自己的HWçš„ä½�置,å�³3,之å�Žå†�从B䏿‹‰å�–消æ�¯è¿›è¡Œå�Œæ¥ã€‚
+
+如果失败的followeræ�¢å¤�过æ�¥ï¼Œå®ƒé¦–先将自己的log文件截æ–到上次checkpointed时刻的HWçš„ä½�置,之å�Žå†�从leaderä¸å�Œæ¥æ¶ˆæ�¯ã€‚leader挂掉会é‡�新选举,新的leader会å�‘é€�“指令â€�让其余的follower截æ–至自身的HWçš„ä½�置然å�Žå†�拉å�–新的消æ�¯ã€‚
+
+当ISRä¸çš„个副本的LEOä¸�ä¸€è‡´æ—¶ï¼Œå¦‚æžœæ¤æ—¶leader挂掉,选举新的leaderæ—¶å¹¶ä¸�是按照LEO的高低进行选举,而是按照ISRä¸çš„顺åº�选举。
+
+
+
+
+
+### 9.4�Leader选举
+
+一æ�¡æ¶ˆæ�¯å�ªæœ‰è¢«ISRä¸çš„æ‰€æœ‰follower都从leaderå¤�制过去æ‰�会被认为已æ��äº¤ã€‚è¿™æ ·å°±é�¿å…�了部分数æ�®è¢«å†™è¿›äº†leader,还没æ�¥å¾—å�Šè¢«ä»»ä½•followerå¤�åˆ¶å°±å®•æœºäº†ï¼Œè€Œé€ æˆ�æ•°æ�®ä¸¢å¤±ã€‚而对于producer而言,它å�¯ä»¥é€‰æ‹©æ˜¯å�¦ç‰å¾…消æ�¯commit,这å�¯ä»¥é€šè¿‡request.required.acksæ�¥è®¾ç½®ã€‚è¿™ç§�机制确ä¿�了å�ªè¦�ISR䏿œ‰ä¸€ä¸ªæˆ–者以上的follower,一æ�¡è¢«commit的消æ�¯å°±ä¸�会丢失。
+
+有一个很é‡�è¦�的问题是当leaderå®•æœºäº†ï¼Œæ€Žæ ·åœ¨followerä¸é€‰ä¸¾å‡ºæ–°çš„leaderï¼Œå› ä¸ºfollowerå�¯èƒ½è�½å�Žå¾ˆå¤šæˆ–者直接crash了,所以必须确ä¿�选择“最新â€�çš„follower作为新的leader。一个基本的原则就是,如果leaderä¸�在了,新的leader必须拥有原æ�¥çš„leader commit的所有消æ�¯ã€‚这就需è¦�å�šä¸€ä¸ªæŠ˜ä¸ï¼Œå¦‚æžœleader在表å��一个消æ�¯è¢«commitå‰�ç‰å¾…更多的follower确认,那么在它挂掉之å�Žå°±æœ‰æ›´å¤šçš„followerå�¯ä»¥æˆ�为新的leaderï¼Œä½†è¿™ä¹Ÿä¼šé€ æˆ�å�žå��率的下é™�。
+
+一ç§�é�žå¸¸å¸¸ç”¨çš„选举leader的方å¼�是“少数æœ�从多数â€�,Kafkaå¹¶ä¸�是采用这ç§�æ–¹å¼�。这ç§�模å¼�下,如果我们有2f+1个副本,那么在commit之å‰�å¿…é¡»ä¿�è¯�有f+1个replicaå¤�制完消æ�¯ï¼Œå�Œæ—¶ä¸ºäº†ä¿�è¯�能æ£ç¡®é€‰ä¸¾å‡ºæ–°çš„leader,失败的副本数ä¸�能超过f个。这ç§�æ–¹å¼�有个很大的优势,系统的延迟å�–å†³äºŽæœ€å¿«çš„å‡ å�°æœºå™¨ï¼Œä¹Ÿå°±æ˜¯è¯´æ¯”如副本数为3,那么延迟就å�–决于最快的那个follower而ä¸�是最慢的那个。“少数æœ�从多数â€�的方å¼�也有一些劣势,为了ä¿�è¯�leader选举的æ£å¸¸è¿›è¡Œï¼Œå®ƒæ‰€èƒ½å®¹å¿�的失败的follower数比较少,如果è¦�容å¿�1个follower挂掉,那么至少è¦�3个以上的副本,如果è¦�容å¿�2个follower挂掉,必须è¦�有5个以上的副本。也就是说,在生产环境下为了ä¿�è¯�较高的容错率,必须è¦�有大é‡�的副本,而大é‡�的副本å�ˆä¼šåœ¨å¤§æ•°æ�®é‡�下导致性能的急剧下é™�。这ç§�算法更多用在Zookeeperè¿™ç§�共享集群é…�置的系统ä¸è€Œå¾ˆå°‘在需è¦�大é‡�æ•°æ�®çš„系统ä¸ä½¿ç”¨çš„åŽŸå› ã€‚HDFSçš„HA功能也是基于“少数æœ�从多数â€�的方å¼�,但是其数æ�®å˜å‚¨å¹¶ä¸�æ˜¯é‡‡ç”¨è¿™æ ·çš„æ–¹å¼�。
+
+实际上,leader选举的算法�常多,比如Zookeeper的Zab�Raft以�Viewstamped Replication。而Kafka所使用的leader选举算法更�是微软的PacificA算法。
+
+Kafka在Zookeeperä¸ä¸ºæ¯�一个partition动æ€�的维护了一个ISR,这个ISR里的所有replication都跟上了leader,å�ªæœ‰ISR里的æˆ�员æ‰�能有被选为leaderçš„å�¯èƒ½(unclean.leader.election.enable=false)。在这ç§�模å¼�下,对于f+1个副本,一个Kafka topic能在ä¿�è¯�ä¸�丢失已ç»�commit消æ�¯çš„å‰�æ��下容å¿�f个副本的失败,在大多数使用场景下,这ç§�模å¼�是å��分有利的。事实上,为了容å¿�f个副本的失败,“少数æœ�从多数â€�的方å¼�å’ŒISR在commitå‰�需è¦�ç‰å¾…的副本的数é‡�æ˜¯ä¸€æ ·çš„ï¼Œä½†æ˜¯ISR需è¦�çš„æ€»çš„å‰¯æœ¬çš„ä¸ªæ•°å‡ ä¹Žæ˜¯â€œå°‘æ•°æœ�从多数â€�的方å¼�的一å�Šã€‚
+
+上文æ��到,在ISRä¸è‡³å°‘有一个follower时,Kafkaå�¯ä»¥ç¡®ä¿�å·²ç»�commit的数æ�®ä¸�丢失,但如果æŸ�一个partition的所有replicaéƒ½æŒ‚äº†ï¼Œå°±æ— æ³•ä¿�è¯�æ•°æ�®ä¸�丢失了。这ç§�情况下有两ç§�å�¯è¡Œçš„æ–¹æ¡ˆï¼š
+
+ç‰å¾…ISRä¸ä»»æ„�一个replica“活â€�过æ�¥ï¼Œå¹¶ä¸”选它作为leader
+
+选择第一个“活â€�过æ�¥çš„replica(å¹¶ä¸�一定是在ISRä¸)作为leader
+
+这就需è¦�在å�¯ç”¨æ€§å’Œä¸€è‡´æ€§å½“ä¸ä½œå‡ºä¸€ä¸ªç®€å�•的抉择。如果一定è¦�ç‰å¾…ISRä¸çš„replica“活â€�过æ�¥ï¼Œé‚£ä¸�å�¯ç”¨çš„æ—¶é—´å°±å�¯èƒ½ä¼šç›¸å¯¹è¾ƒé•¿ã€‚而且如果ISR䏿‰€æœ‰çš„replicaéƒ½æ— æ³•â€œæ´»â€�过æ�¥äº†ï¼Œæˆ–者数æ�®ä¸¢å¤±äº†ï¼Œè¿™ä¸ªpartition将永远ä¸�å�¯ç”¨ã€‚选择第一个“活â€�过æ�¥çš„replica作为leader,而这个replicaä¸�是ISRä¸çš„replica,é‚£å�³ä½¿å®ƒå¹¶ä¸�ä¿�障已ç»�包å�«äº†æ‰€æœ‰å·²commit的消æ�¯ï¼Œå®ƒä¹Ÿä¼šæˆ�为leader而作为consumer的数æ�®æº�。默认情况下,Kafka采用第二ç§�ç–略,å�³ã€€ã€€
+
+
+
+* unclean.leader.election.enable=true,也å�¯ä»¥å°†æ¤å�‚数设置为falseæ�¥å�¯ç”¨ç¬¬ä¸€ç§�ç–略。
+* unclean.leader.election.enable这个å�‚数对于leader的选举ã€�系统的å�¯ç”¨æ€§ä»¥å�Šæ•°æ�®çš„å�¯é� 性都有至关é‡�è¦�的影å“�。
+
+下é�¢æˆ‘们æ�¥åˆ†æž�ä¸‹å‡ ç§�典型的场景。
+
+
+
+如果上图所示,å�‡è®¾æŸ�个partitionä¸çš„副本数为3,replica-0, replica-1, replica-2åˆ†åˆ«å˜æ”¾åœ¨broker0, broker1å’Œbroker2ä¸ã€‚AR=(0,1,2),ISR=(0,1)。
+
+设置request.required.acks=-1, min.insync.replicas=2,unclean.leader.election.enable=false。这里讲broker0ä¸çš„副本也称之为broker0èµ·åˆ�broker0为leader,broker1为follower。
+
+当ISRä¸çš„replica-0出现crash的情况时,broker1选举为新的leader[ISR=(1)]ï¼Œå› ä¸ºå�—min.insync.replicas=2å½±å“�,writeä¸�能æœ�务,但是readèƒ½ç»§ç»æ£å¸¸æœ�务。æ¤ç§�情况æ�¢å¤�方案:
+
+å°�试æ�¢å¤�(é‡�å�¯)replica-0,如果能起æ�¥ï¼Œç³»ç»Ÿæ£å¸¸;
+如果replica-0�能��,需�将min.insync.replicas设置为1,��write功能。
+
+
+当ISRä¸çš„replica-0出现crash,紧接ç�€replica-1也出现了crash, æ¤æ—¶[ISR=(1),leader=-1],ä¸�能对外æ��ä¾›æœ�务,æ¤ç§�情况æ�¢å¤�方案:
+
+å°�试æ�¢å¤�replica-0å’Œreplica-1,如果都能起æ�¥ï¼Œåˆ™ç³»ç»Ÿæ�¢å¤�æ£å¸¸;
+如果replica-0èµ·æ�¥ï¼Œè€Œreplica-1ä¸�能起æ�¥ï¼Œè¿™æ—¶å€™ä»�ç„¶ä¸�能选出leaderï¼Œå› ä¸ºå½“è®¾ç½®unclean.leader.election.enable=false时,leaderå�ªèƒ½ä»ŽISRä¸é€‰ä¸¾ï¼Œå½“ISR䏿‰€æœ‰å‰¯æœ¬éƒ½å¤±æ•ˆä¹‹å�Žï¼Œéœ€è¦�ISR䏿œ€å�Žå¤±æ•ˆçš„那个副本能æ�¢å¤�之å�Žæ‰�能选举leader, å�³replica-0先失效,replica-1å�Žå¤±æ•ˆï¼Œéœ€è¦�replica-1æ�¢å¤�å�Žæ‰�能选举leader。ä¿�守的方案建议把unclean.leader.election.enable设置为true,ä½†æ˜¯è¿™æ ·ä¼šæœ‰ä¸¢å¤±æ•°æ�®çš„æƒ…况å�‘ç”Ÿï¼Œè¿™æ ·å�¯ä»¥æ�¢å¤�readæœ�务。å�Œæ ·éœ€è¦�å°†min.insync.replicas设置为1,æ�¢å¤�write功能;replica-1æ�¢å¤�,replica-0ä¸�能æ�¢å¤�,这个情况上é�¢é�‡åˆ°è¿‡ï¼Œreadæœ�务å�¯ç”¨ï¼Œéœ€è¦�å°†min.insync.replicas设置为1,æ�¢å¤�write功能;
+replica-0和replica-1都�能��,这�情况�以�考情形2.
+
+当ISRä¸çš„replica-0, replica-1å�Œæ—¶å®•机,æ¤æ—¶[ISR=(0,1)],ä¸�能对外æ��ä¾›æœ�务,æ¤ç§�情况æ�¢å¤�方案:å°�试æ�¢å¤�replica-0å’Œreplica-1,当其ä¸ä»»æ„�一个副本æ�¢å¤�æ£å¸¸æ—¶ï¼Œå¯¹å¤–å�¯ä»¥æ��ä¾›readæœ�务。直到2个副本æ�¢å¤�æ£å¸¸ï¼Œwrite功能æ‰�能æ�¢å¤�,或者将将min.insync.replicas设置为1。
+
+
+
+
+
+### 9.5�Kafka的��模�
+
+Kafkaçš„å�‘é€�模å¼�ç”±producer端的é…�ç½®å�‚æ•°producer.typeæ�¥è®¾ç½®ï¼Œè¿™ä¸ªå�‚数指定了在å�Žå�°çº¿ç¨‹ä¸æ¶ˆæ�¯çš„å�‘é€�æ–¹å¼�是å�Œæ¥çš„还是异æ¥çš„,默认是å�Œæ¥çš„æ–¹å¼�,å�³producer.type=sync。如果设置æˆ�异æ¥çš„æ¨¡å¼�,å�³producer.type=async,å�¯ä»¥æ˜¯producer以batch的形å¼�pushæ•°æ�®ï¼Œè¿™æ ·ä¼šæž�大的æ��高brokerçš„æ€§èƒ½ï¼Œä½†æ˜¯è¿™æ ·ä¼šå¢žåŠ ä¸¢å¤±æ•°æ�®çš„风险。如果需è¦�ç¡®ä¿�消æ�¯çš„å�¯é� 性,必须è¦�å°†producer.type设置为sync。
+
+å¯¹äºŽå¼‚æ¥æ¨¡å¼�,还有4个é…�套的å�‚数,如下:
+
+
+
+以batch的方å¼�推é€�æ•°æ�®å�¯ä»¥æž�大的æ��高处ç�†æ•ˆçŽ‡ï¼Œkafka producerå�¯ä»¥å°†æ¶ˆæ�¯åœ¨å†…å˜ä¸ç´¯è®¡åˆ°ä¸€å®šæ•°é‡�å�Žä½œä¸ºä¸€ä¸ªbatchå�‘é€�请求。batch的数é‡�大å°�å�¯ä»¥é€šè¿‡producerçš„å�‚æ•°(batch.num.messages)æŽ§åˆ¶ã€‚é€šè¿‡å¢žåŠ batch的大å°�,å�¯ä»¥å‡�少网络请求和ç£�盘IO的次数,当然具体å�‚数设置需è¦�在效率和时效性方é�¢å�šä¸€ä¸ªæ�ƒè¡¡ã€‚在比较新的版本ä¸è¿˜æœ‰batch.size这个å�‚数。
+
+
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## å��ã€�高å�¯é� 性使用分æž�
+
+
+
+### 10.1ã€�消æ�¯ä¼ 输ä¿�éšœ
+
+å‰�é�¢å·²ç»�介ç»�了Kafka如何进行有效的å˜å‚¨ï¼Œä»¥å�Šäº†è§£äº†producerå’Œconsumer如何工作。接下æ�¥è®¨è®ºçš„æ˜¯Kafka如何确ä¿�消æ�¯åœ¨producerå’Œconsumerä¹‹é—´ä¼ è¾“ã€‚æœ‰ä»¥ä¸‹ä¸‰ç§�å�¯èƒ½çš„ä¼ è¾“ä¿�éšœ(delivery guarantee):
+
+
+
+* At most once: 消æ�¯å�¯èƒ½ä¼šä¸¢ï¼Œä½†ç»�ä¸�会é‡�å¤�ä¼ è¾“
+* At least once:消æ�¯ç»�ä¸�会丢,但å�¯èƒ½ä¼šé‡�å¤�ä¼ è¾“
+* Exactly once:æ¯�æ�¡æ¶ˆæ�¯è‚¯å®šä¼šè¢«ä¼ è¾“ä¸€æ¬¡ä¸”ä»…ä¼ è¾“ä¸€æ¬¡
+
+Kafka的消æ�¯ä¼ 输ä¿�障机制é�žå¸¸ç›´è§‚。当producerå�‘brokerå�‘é€�消æ�¯æ—¶ï¼Œä¸€æ—¦è¿™æ�¡æ¶ˆæ�¯è¢«commit,由于副本机制(replication)çš„å˜åœ¨ï¼Œå®ƒå°±ä¸�会丢失。但是如果producerå�‘é€�æ•°æ�®ç»™brokerå�Žï¼Œé�‡åˆ°çš„ç½‘ç»œé—®é¢˜è€Œé€ æˆ�é€šä¿¡ä¸æ–,那producerå°±æ— æ³•åˆ¤æ–该æ�¡æ¶ˆæ�¯æ˜¯å�¦å·²ç»�æ��交(commit)。虽然Kafkaæ— æ³•ç¡®å®šç½‘ç»œæ•…éšœæœŸé—´å�‘生了什么,但是producerå�¯ä»¥retry多次,确ä¿�消æ�¯å·²ç»�æ£ç¡®ä¼ 输到brokerä¸ï¼Œæ‰€ä»¥ç›®å‰�Kafka实现的是at least once。
+
+consumer从brokerä¸è¯»å�–消æ�¯å�Žï¼Œå�¯ä»¥é€‰æ‹©commit,该æ“�作会在Zookeeperä¸å˜ä¸‹è¯¥consumer在该partition下读å�–的消æ�¯çš„offset。该consumer下一次å†�读该partition时会从下一æ�¡å¼€å§‹è¯»å�–。如未commit,下一次读å�–的开始ä½�置会跟上一次commit之å�Žçš„开始ä½�置相å�Œã€‚当然也å�¯ä»¥å°†consumer设置为autocommit,å�³consumer一旦读å�–到数æ�®ç«‹å�³è‡ªåЍcommit。如果å�ªè®¨è®ºè¿™ä¸€è¯»å�–消æ�¯çš„过程,那Kafka是确ä¿�了exactly once, 但是如果由于å‰�é�¢producer与broker之间的æŸ�ç§�åŽŸå› å¯¼è‡´æ¶ˆæ�¯çš„é‡�å¤�,那么这里就是at least once。
+
+è€ƒè™‘è¿™æ ·ä¸€ç§�情况,当consumer读完消æ�¯ä¹‹å�Žå…ˆcommitå†�处ç�†æ¶ˆæ�¯ï¼Œåœ¨è¿™ç§�模å¼�下,如果consumer在commitå�Žè¿˜æ²¡æ�¥å¾—å�Šå¤„ç�†æ¶ˆæ�¯å°±crash了,下次é‡�新开始工作å�Žå°±æ— 法读到刚刚已æ��交而未处ç�†çš„æ¶ˆæ�¯ï¼Œè¿™å°±å¯¹åº”于at most once了。
+
+读完消�先处��commit。这�模�下,如果处�完了消�在commit之�consumer crash了,下次�新开始工作时还会处�刚刚未commit的消�,实际上该消�已�被处�过了,这就对应于at least once。
+
+��到exactly once就需�引入消�去�机制。
+
+
+
+### 10.2�消�去�
+
+
+
+如上一节所述,Kafka在producer端和consumer端都会出现消�的��,这就需�去�处�。
+
+Kafkaæ–‡æ¡£ä¸æ��å�ŠGUID(Globally Unique Identifier)的概念,通过客户端生æˆ�算法得到æ¯�个消æ�¯çš„unique id,å�Œæ—¶å�¯æ˜ 射至broker上å˜å‚¨çš„地å�€ï¼Œå�³é€šè¿‡GUID便å�¯æŸ¥è¯¢æ��å�–消æ�¯å†…容,也便于å�‘é€�æ–¹çš„å¹‚ç‰æ€§ä¿�è¯�,需è¦�在broker上æ��ä¾›æ¤åŽ»é‡�处ç�†æ¨¡å�—,最新版本已ç»�支æŒ�。
+
+针对GUID, 如果从客户端的角度去é‡�,那么需è¦�引入集ä¸å¼�缓å˜ï¼Œå¿…ç„¶ä¼šå¢žåŠ ä¾�èµ–å¤�æ�‚度,å�¦å¤–缓å˜çš„大å°�难以界定。
+
+ä¸�å�ªæ˜¯Kafka, 类似RabbitMQ以å�ŠRocketMQ这类商业级ä¸é—´ä»¶ä¹Ÿå�ªä¿�éšœat least once, ä¸”ä¹Ÿæ— æ³•ä»Žè‡ªèº«åŽ»è¿›è¡Œæ¶ˆæ�¯åŽ»é‡�ã€‚æ‰€ä»¥æˆ‘ä»¬å»ºè®®ä¸šåŠ¡æ–¹æ ¹æ�®è‡ªèº«çš„业务特点进行去é‡�,比如业务消æ�¯æœ¬èº«å…·å¤‡å¹‚ç‰æ€§ï¼Œæˆ–者借助Redisç‰å…¶ä»–产å“�进行去é‡�处ç�†ã€‚
+
+
+
+
+
+### 10.3ã€�高å�¯é� 性é…�ç½®
+
+Kafkaæ��供了很高的数æ�®å†—余弹性,对于需è¦�æ•°æ�®é«˜å�¯é� 性的场景,我们å�¯ä»¥å¢žåŠ æ•°æ�®å†—余备份数(replication.factor),调高最å°�写入副本数的个数(min.insync.replicas)ç‰ç‰ï¼Œä½†æ˜¯è¿™æ ·ä¼šå½±å“�性能。å��之,性能æ��高而å�¯é� 性则é™�低,用户需è¦�自身业务特性在彼æ¤ä¹‹é—´å�šä¸€äº›æ�ƒè¡¡æ€§é€‰æ‹©ã€‚
+
+è¦�ä¿�è¯�æ•°æ�®å†™å…¥åˆ°Kafka是安全的,高å�¯é� 的,需è¦�如下的é…�置:
+
+
+
+1. topic的�置:replication.factor>=3,�副本数至少是3个;2<=min.insync.replicas<=replication.factor
+2. broker的�置:leader的选举�件unclean.leader.election.enable=false
+3. producer的�置:request.required.acks=-1(all),producer.type=sync
+
+
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## �一�内部网络框架
+
+
+
+Broker的内部处ç�†æµ�水线化,分为多个阶段æ�¥è¿›è¡Œ(SEDA),以æ��高å�žå��é‡�和性能,尽é‡�é�¿å…�Thead盲ç‰å¾…,以下为过程说明。
+
+* Accept Thread负责与客户端建立连接链路,然�把Socket轮转交给Process Thread
+* Process Thread负责接收请求和�应数�,Process Thread�次基于Selector事件循环,首先从Response Queue读��应数�,�客户端回��应,然�接收到客户端请求�,读�数�放入Request Queue。
+* Work Thread负责业务逻辑ã€�IOç£�盘处ç�†ç‰ï¼Œè´Ÿè´£ä»ŽRequest Queue读å�–请求,并把处ç�†ç»“果放入Response Queueä¸ï¼Œå¾…Process Threadå�‘é€�出去。
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## �二�rebalance机制
+
+
+
+Kafkaä¿�è¯�å�Œä¸€consumer groupä¸å�ªæœ‰ä¸€ä¸ªconsumer会消费æŸ�æ�¡æ¶ˆæ�¯ï¼Œå®žé™…上,Kafkaä¿�è¯�的是稳定状æ€�下æ¯�一个consumer实例å�ªä¼šæ¶ˆè´¹æŸ�一个或多个特定的数æ�®ï¼Œè€ŒæŸ�个partition的数æ�®å�ªä¼šè¢«æŸ�一个特定的consumerå®žä¾‹æ‰€æ¶ˆè´¹ã€‚è¿™æ ·è®¾è®¡çš„åŠ£åŠ¿æ˜¯æ— æ³•è®©å�Œä¸€ä¸ªconsumer group里的consumerå�‡åŒ€æ¶ˆè´¹æ•°æ�®ï¼Œä¼˜åŠ¿æ˜¯æ¯�个consumerä¸�用都跟大é‡�çš„broker通信,å‡�少通信开销,å�Œæ—¶ä¹Ÿé™�低了分é…�难度,实现也更简å�•。å�¦å¤–ï¼Œå› ä¸ºå�Œä¸€ä¸ªpartition里的数æ�®æ˜¯æœ‰åº�的,这ç§�设计å�¯ä»¥ä¿�è¯�æ¯�个partition里的数æ�®ä¹Ÿæ˜¯æœ‰åº�被消费。
+
+如果æŸ�consumer groupä¸consumeræ•°é‡�少于partitionæ•°é‡�,则至少有一个consumer会消费多个partition的数æ�®ï¼Œå¦‚æžœconsumer的数é‡�与partitionæ•°é‡�相å�Œï¼Œåˆ™æ£å¥½ä¸€ä¸ªconsumer消费一个partition的数æ�®ï¼Œè€Œå¦‚æžœconsumer的数é‡�多于partition的数é‡�时,会有部分consumeræ— æ³•æ¶ˆè´¹è¯¥topic下任何一æ�¡æ¶ˆæ�¯ã€‚
+
+**Consumer Rebalance算法如下 :**
+
+
+
+1. å°†ç›®æ ‡ topic 下的所有 partirtion 排åº�,å˜äºŽPT 2. 对æŸ� consumer group 下所有 consumer 排åº�,å˜äºŽ CG,第 i 个consumer 记为 Ci 3. N=size(PT)/size(CG),å�‘上å�–æ•´ 4. 解除 Ci 对原æ�¥åˆ†é…�çš„ partition 的消费æ�ƒï¼ˆi从0开始) 5. 将第i*N到(i+1)*N-1个 partition 分é…�ç»™ Ci 
+
+
+
+ç›®å‰�consumer rebalance的控制ç–略是由æ¯�一个consumer通过Zookeeper完æˆ�的。具体的控制方å¼�如下:
+
+
+
+在/consumers/[consumer-group]/下注册id
+设置对/consumers/[consumer-group] 的watcher
+设置对�brokers/ids的watcher
+zk下设置watcher的路径节点更改,触�consumer rebalance
+
+
+
+
+在这ç§�ç–略下,**æ¯�一个consumer或者brokerçš„å¢žåŠ æˆ–è€…å‡�少都会触å�‘consumer rebalance**ã€‚å› ä¸ºæ¯�个consumerå�ªè´Ÿè´£è°ƒæ•´è‡ªå·±æ‰€æ¶ˆè´¹çš„partition,为了ä¿�è¯�整个consumer group的一致性,所以当一个consumer触å�‘了rebalance时,该consumer group内的其它所有consumer也应该å�Œæ—¶è§¦å�‘rebalance。
+
+* Herd effect
+
+任何broker或者consumer的增�都会触�所有的consumer的rebalance
+
+* Split Brain
+
+æ¯�个consumer分别å�•独通过Zookeeper判æ–哪些partition down了,那么ä¸�å�Œconsumer从Zookeeper“看â€�到的viewå°±å�¯èƒ½ä¸�ä¸€æ ·ï¼Œè¿™å°±ä¼šé€ æˆ�错误的reblanceå°�试。而且有å�¯èƒ½æ‰€æœ‰çš„consumer都认为rebalanceå·²ç»�完æˆ�了,但实际上å�¯èƒ½å¹¶é�žå¦‚æ¤ã€‚
+
+[回到顶部](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop)
+
+## �三�BenchMark
+
+Kafka在唯å“�会有ç�€å¾ˆæ·±çš„历å�²æ¸Šæº�ï¼Œæ ¹æ�®å”¯å“�会消æ�¯ä¸é—´ä»¶å›¢é˜Ÿ(VMS团队)所掌æ�¡çš„资料显示,在VMS团队è¿�转的Kafkaé›†ç¾¤ä¸æ‰€æ”¯æ’‘çš„topic数已接近2000,æ¯�天的请求é‡�也已达å�ƒäº¿çº§ã€‚这里就以Kafka的高å�¯é� 性为基准点æ�¥æŽ¢ç©¶å‡ ç§�ä¸�å�Œåœºæ™¯ä¸‹çš„è¡Œä¸ºè¡¨çŽ°ï¼Œä»¥æ¤æ�¥åŠ æ·±å¯¹Kafka的认知,为大家在以å�Žé«˜æ•ˆçš„使用Kafkaæ—¶æ��供一份ä¾�æ�®ã€‚
+
+
+
+### 13.1�测试环境
+
+Kafka broker用到了4�机器,分别为broker[0/1/2/3]�置如下:
+
+CPU: 24core/2.6GHZ
+Memory: 62G
+Network: 4000Mb
+OS/kernel: CentOs release 6.6 (Final)
+Disk: 1089G
+Kafka版本:0.10.1.0
+broker端JVM�数设置:
+
+
+
+
+
+-Xmx8G -Xms8G -server -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true -Xloggc:/apps/service/kafka/bin/../logs/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9999
+
+
+
+客户端机器�置:
+
+* CPU: 24core/2.6GHZ
+* Memory: 3G
+* Network: 1000Mb
+* OS/kernel: CentOs release 6.3 (Final)
+* Disk: 240G
+
+### 13.2���场景测试
+
+#### 场景1:
+
+测试ä¸�å�Œçš„副本数ã€�min.insync.replicasç–略以å�Šrequest.required.acksç–ç•¥(以下简称acksç–ç•¥)对于å�‘é€�速度(TPS)的影å“�。
+
+具体�置:一个producer;��方�为sync;消�体大�为1kB;partition数为12。副本数为:1/2/4;min.insync.replicas分别为1/2/4;acks分别为-1(all)/1/0。
+
+具体测试数�如下表(min.insync.replicas�在acks=-1时有效):
+
+
+
+测试结果分�:
+
+
+
+1. 客户端的acksç–略对å�‘é€�çš„TPS有较大的影å“�,TPS:acks_0 > acks_1 > ack_-1;
+2. 副本数越高,TPS越低;副本数一致时,min.insync.replicas�影�TPS;
+3. acks=0/1时,TPS与min.insync.replicaså�‚数以å�Šå‰¯æœ¬æ•°æ— 关,仅å�—acksç–略的影å“�。
+
+下é�¢å°†partition的个数设置为1,æ�¥è¿›ä¸€æ¥ç¡®è®¤ä¸‹ä¸�å�Œçš„acksç–ç•¥ã€�ä¸�å�Œçš„min.insync.replicasç–略以å�Šä¸�å�Œçš„副本数对于å�‘é€�速度的影å“�,详细请看情景2和情景3。
+
+#### 场景2:
+
+在partition个数固定为1,测试ä¸�å�Œçš„副本数和min.insync.replicasç–略对å�‘é€�速度的影å“�。
+
+具体�置:一个producer;��方�为sync;消�体大�为1kB;producer端acks=-1(all)。��副本数:2/3/4; min.insync.replicas设置为:1/2/4。
+
+测试结果如下:
+
+
+
+测试结果分�:
+
+副本数越高,TPS越低(这点与场景1的测试结论��),但是当partition数为1时差�甚微。min.insync.replicas�影�TPS。
+
+#### 场景3:
+
+在partition个数固定为1,测试ä¸�å�Œçš„acksç–略和副本数对å�‘é€�速度的影å“�。
+
+具体�置:一个producer;��方�为sync;消�体大�为1kB;min.insync.replicas=1。topic副本数为:1/2/4;acks: 0/1/-1。
+
+测试结果如下:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+测试结果分�(与情景1一致):
+
+* 副本数越多,TPS越低;
+* 客户端的acksç–略对å�‘é€�çš„TPS有较大的影å“�,TPS:acks_0 > acks_1 > ack_-1。
+
+#### 场景4:
+
+测试��partition数对��速率的影�
+
+具体�置:一个producer;消�体大�为1KB;��方�为sync;topic副本数为2;min.insync.replicas=2;acks=-1。partition数�设置为1/2/4/8/12。
+
+
+
+测试结果分�:
+
+partitionçš„ä¸�å�Œä¼šå½±å“�TPS,éš�ç�€partition的个数的增长TPS会有所增长,但并ä¸�是一直æˆ�æ£æ¯”关系,到达一定临界值时,partitionæ•°é‡�çš„å¢žåŠ å��而会使TPS略微é™�低。
+
+#### 场景5:
+
+通过将集群ä¸éƒ¨åˆ†broker设置æˆ�ä¸�å�¯æœ�务状æ€�,测试对客户端以å�Šæ¶ˆæ�¯è�½ç›˜çš„å½±å“�。
+
+具体�置:一个producer;消�体大�1KB;��方�为sync;topic副本数为4;min.insync.replicas设置为2;acks=-1;retries=0/100000000;partition数为12。
+
+
+
+测试结果分�:
+
+
+
+1. kill两å�°brokerå�Žï¼Œå®¢æˆ·ç«¯å�¯ä»¥ç»§ç»å�‘é€�。brokerå‡�å°‘å�Žï¼Œpartitionçš„leader分布在剩余的两å�°brokerä¸Šï¼Œé€ æˆ�了TPSçš„å‡�å°�;
+2. kill三å�°brokerå�Žï¼Œå®¢æˆ·ç«¯æ— 法继ç»å�‘é€�。Kafka的自动é‡�试功能开始起作用,当大于ç‰äºŽmin.insync.replicasæ•°é‡�çš„brokeræ�¢å¤�å�Žï¼Œå�¯ä»¥ç»§ç»å�‘é€�;
+3. 当retries�为0时,消�有���盘;客户端�功返回的消�都�功�盘,异常时部分消��以�盘。
+
+#### 场景6:
+
+测试�个producer的��延迟,以�端到端的延迟。
+
+具体�置:一个producer;消�体大�1KB;��方�为sync;topic副本数为4;min.insync.replicas设置为2;acks=-1;partition数为12。
+
+测试数��结果(��为ms):
+
+
+
+**�场景测试总结:**
+
+
+
+1. 当acks=-1时,Kafkaå�‘é€�端的TPSå�—é™�于topic的副本数é‡�(ISRä¸),副本越多TPS越低;
+2. acks=0时,TPS最高,其次为1,最差为-1,�TPS:acks_0 > acks_1 > ack_-1
+3. min.insync.replicas�数�影�TPS;
+4. partitionçš„ä¸�å�Œä¼šå½±å“�TPS,éš�ç�€partition的个数的增长TPS会有所增长,但并ä¸�是一直æˆ�æ£æ¯”关系,到达一定临界值时,partitionæ•°é‡�çš„å¢žåŠ å��而会使TPS略微é™�低;
+5. Kafka在acks=-1,min.insync.replicas>=1时,具有高å�¯é� 性,所有æˆ�功返回的消æ�¯éƒ½å�¯ä»¥è�½ç›˜ã€‚
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\345\270\270\350\247\201\345\221\275\344\273\244\345\217\212\351\205\215\347\275\256\346\200\273\347\273\223.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\345\270\270\350\247\201\345\221\275\344\273\244\345\217\212\351\205\215\347\275\256\346\200\273\347\273\223.md"
new file mode 100644
index 0000000..a3eb8fd
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\345\270\270\350\247\201\345\221\275\344\273\244\345\217\212\351\205\215\347\275\256\346\200\273\347\273\223.md"
@@ -0,0 +1,517 @@
+## **�动zookeeper**
+
+bin/zookeeper-server-start.sh config/zookeeper.properties &
+
+## **�动kafka:**
+
+bin/kafka-server-start.sh config/server.properties
+
+è¿™æ ·å�¯åЍå�ˆä¸€ä¸ªå��处,就是kafkaå�¯åŠ¨å®Œæ¯•ä¹‹å�Žï¼Œä¸�能关é—终端,为æ¤ï¼Œæˆ‘们å�¯ä»¥è¿�行这æ�¡å‘½ä»¤ï¼š
+
+nohup bin/kafka-server-start.sh config/server.properties > ./dev/null 2>&1 &
+
+
+
+多个kafka的�,在�个虚拟机上�行kafka�动命令多次��。
+
+当然这个是�机的命令,集群的命令���讲。
+
+## **查看是��动**
+
+jps -lm
+
+
+
+说明没有�动kfka
+
+
+
+说明�动kafka了
+
+## 查看kafka版本
+
+find ./libs/ -name \*kafka_\* | head -1 | grep -o '\kafka[^\n]*'
+
+kafka_2.12-2.4.1.jar
+
+结果:
+
+就�以看到kafka的具体版本了。
+
+å…¶ä¸ï¼Œ2.12为scala版本,2.4.1为kafka版本。
+
+## **å�œæ¢kafka**
+
+bin/kafka-server-stop.sh
+
+## **å�œæ¢zookeeper**
+
+bin/zookeeper-server-stop.sh
+
+## **创建topic**
+
+bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
+
+多集群创建,执行这个需è¦�æ�建多机器的kafka集群环境,zkq1/zkq2/zkq3分别代表了3å�°zookeeper集群的三å�°æœºå™¨
+
+/bin/kafka-topics.sh —create —zookeeper zkq1:2181,zkq2:2181,zkq3:2181 -replication-factor 6 —partition 6 —topic test
+
+解释:
+
+--topic��的test0是topic的�称
+
+--zookeeper应该和server.properties文件ä¸çš„zookeeper.connectä¸€æ ·
+
+--config指定当�topic上有效的�数值
+
+--partitions指定topicçš„partitionæ•°é‡�,如果ä¸�指定该数é‡�,默认是server.properties文件ä¸çš„num.partitionsé…�置值
+
+--replication-factor指定�个partition的副本个数,默认是1个
+
+也�以�没有的topic��消�的时候创建topic
+
+需�
+
+开�自动创建�置:auto.create.topics.enable=true
+
+使用程åº�直接往kafkaä¸ç›¸åº”çš„topicå�‘é€�æ•°æ�®ï¼Œå¦‚æžœtopicä¸�å˜åœ¨å°±ä¼šæŒ‰é»˜è®¤é…�置进行创建。
+
+## **展示topic**
+
+bin/kafka-topics.sh --list --zookeeper localhost:2181
+
+## **�述topic**
+
+bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
+
+
+
+解释:
+
+�查看多个topic用逗�分割
+
+**leader**:
+
+是该partitons所在的所有broker䏿‹…ä»»leaderçš„broker id,æ¯�个broker都有å�¯èƒ½æˆ�为leader,负责处ç�†æ¶ˆæ�¯çš„读和写,leader是从所有节点ä¸éš�机选择的.
+
+-1表示æ¤broker移除了
+
+**Replicas**:
+
+显示该partiton所有副本所在的broker列表,包括leader,ä¸�管该broker是å�¦æ˜¯å˜æ´»ï¼Œä¸�管是å�¦å’Œleaderä¿�æŒ�了å�Œæ¥ã€‚列出了所有的副本节点,ä¸�管节点是å�¦åœ¨æœ�务ä¸.
+
+**Isr**:
+
+in-sync replicasçš„ç®€å†™ï¼Œè¡¨ç¤ºå˜æ´»ä¸”副本都已å�Œæ¥çš„çš„broker集å�ˆï¼Œæ˜¯replicasçš„å�集,是æ£åœ¨æœ�务ä¸çš„节点.
+
+举例:
+
+比如上�结果的第一行:Topic: test0 .Partition:0 ...Leader: 0 ......Replicas: 0,2,1 Isr: 1,0,2
+
+Partition: 0[该partition编�是0]
+
+Replicas: 0,2,1[代表partition0 在broker0,broker1,broker2上ä¿�å˜äº†å‰¯æœ¬]
+
+Isr: 1,0,2 [代表broker0,broker1,broker2éƒ½å˜æ´»è€Œä¸”ç›®å‰�都和leaderä¿�æŒ�å�Œæ¥]
+
+Leader: 0
+
+代表ä¿�å˜åœ¨broker0,broker1,broker2上的这三个副本ä¸ï¼Œleader是broker0
+
+leader负责读写,broker1ã€�broker2负责从broker0å�Œæ¥ä¿¡æ�¯ï¼Œå¹³æ—¶æ²¡ä»–俩什么事
+
+## **查看topicçš„partitionå�Šå¢žåŠ partition**
+
+/kafka-topics.sh –zookeeper 10.2.1.1:2181 –topic mcc-logs –describe.
+
+## **åˆ é™¤Topic**
+
+/bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test
+
+å¦‚æžœä½ çš„server.properties内没有é…�置相关的é…�置的è¯�,会出现如下错误:
+
+Topic test is marked for deletion.
+
+Note: This will have no impact if delete.topic.enable is not set to true.
+
+è¿™è¾¹æ˜¯è¯´ï¼Œä½ çš„Topicå·²ç»�è¢«æ ‡è®°ä¸ºå¾…åˆ é™¤çš„Topicï¼Œä½†æ˜¯å‘¢ï¼Œä½ é…�置文件的开关没有打开,所以å�ªæ˜¯ç»™å®ƒæ·»åŠ äº†ä¸€ä¸ªæ ‡è®°ï¼Œå®žé™…ä¸Šï¼Œè¿™ä¸ªTopicå¹¶æ²¡æœ‰è¢«åˆ é™¤ã€‚å�ªæœ‰ï¼Œä½ 打开开关之å�Žï¼Œä¼šè‡ªåŠ¨åˆ é™¤è¢«æ ‡è®°åˆ é™¤çš„Topic。
+
+解决办法:
+
+设置server.properties文件内的“delete.topic.enable=true�,并且��Kafka就�以了。
+
+如果ä¸�想修改é…�置也å�¯ä»¥å®Œå…¨åˆ 除
+
+1ã€�åˆ é™¤kafkaå˜å‚¨ç›®å½•(server.propertiewenjian log.dirsé…�置,默认为“/tmp/kafka-logsâ€�)下对应的topic。(ä¸�å�Œbroker下å˜å‚¨çš„topicä¸�一定相å�Œï¼Œæ‰€æœ‰broker都è¦�看一下)
+
+2ã€�进入zookeeperå®¢æˆ·ç«¯åˆ æŽ‰å¯¹åº”topic
+
+zkCli.sh .-server 127.0.0.1:42182
+
+找到topic目录:
+
+ls ../brokers/topics
+
+åˆ æŽ‰å¯¹åº”topic
+
+rmr ./brokers/topic/topic-name
+
+找到目录:
+
+ls .../config/topics
+
+åˆ æŽ‰å¯¹åº”topic
+
+rmr ./config/topics/topic-name .
+
+è¿™æ ·å°±å®Œå…¨åˆ é™¤äº†
+
+## **åˆ é™¤topicä¸å˜å‚¨çš„内容**
+
+在config/server.properties䏿‰¾åˆ°å¦‚下的ä½�ç½®
+
+
+
+åˆ é™¤log.dirs指定的文件目录,
+
+登录zookeeper client。
+
+命令:
+
+/home/ZooKeeper/bin/zkCli.sh
+
+åˆ é™¤zookeeperä¸è¯¥topic相关的目录
+
+命令:
+
+rm -r /kafka/config/topics/test0
+
+rm -r /kafka/brokers/topics/test0
+
+rm -r /kafka/admin/delete_topics/test0 (topicè¢«æ ‡è®°ä¸ºmarked for deletion时需è¦�这个命令)
+
+��zookeeper和broker
+
+## **生产者��消�:**
+
+bin/kafka-console-producer.sh --broker-list 130.51.23.95:9092 --topic my-replicated-topic
+
+这里的ip和端å�£æ˜¯brokerçš„ipå�Šç«¯å�£ï¼Œæ ¹æ�®è‡ªå·±kafka机器的ip和端å�£å†™å°±å�¯ä»¥
+
+## **消费者消费消�:**
+
+bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --new-consumer --from-beginning --consumer.config config/consumer.properties
+
+## **查看topic�分区�移�最大(�)值**
+
+bin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic hive-mdatabase-hostsltable .--time -1 --broker-list node86:9092 --partitions 0
+
+注: time为-1时表示最大值,time为-2时表示最�值
+
+�指定--partitions 就是指这个topic整体的情况
+
+## 查看指定group的消费情况
+
+kafka-consumer-groups.sh --bootstrap-server 172.20.72.93:9092 --describe --group mygroup
+
+�行结果:
+
+
+
+* GROUP:消费者组
+* TOPIC:topicå��å—
+* PARTITION :partition id
+* CURRENT-OFFSET: .当�消费到的offset . . . . . . . .
+* LOG-END-OFFSETSIZE :最新的offset
+* LAG:未消费的�数
+* CONSUMER-ID:æ¶ˆè´¹è€…ç»„ä¸æ¶ˆè´¹è€…çš„id,为—代表没有active的消费者
+* HOST:消费者的机器ip,为—代表没有active的消费者
+* CLIENT-ID:消费者clientID,为—代表没有active的消费者
+
+## .查看所有group的消费情况
+
+kafka-consumer-groups.sh --bootstrap-server 172.20.72.93:9092 --all-groups --all-topics --describe
+
+
+
+## 修改group消费的offset
+
+kafka-consumer-groups.sh --bootstrap-server 172.20.72.93:9092 --group mygroup --reset-offsets --topic mytopic --to-offset 61 --execute
+
+上�就是把mygroup在mytopic的消费offset修改到了61
+
+é‡�设ä½�ç§»æœ‰å‡ ç§�选项:
+
+--to-earliest:. .设置到最早�移处,也就是0
+
+--to-latest:. . .设置到最新处,也就是主题分区HW的�置
+
+--to-offset NUM: 指定具体的�移�置
+
+--shift-by NUM:. 基于当��移��回退多少
+
+--by-duration:. .回退到多长时间
+
+## 查看指定group䏿´»è·ƒçš„æ¶ˆè´¹è€…
+
+kafka-consumer-groups.sh --bootstrap-server 172.20.72.93:9092 --describe --group mygroup --members
+
+## **å¢žåŠ topic分区数**
+
+(å�ªèƒ½å¢žåŠ ä¸�能å‡�少)
+
+为topic t_cdr å¢žåŠ 10个分区
+
+bin/kafka-topics.sh --zookeeper node01:2181 .--alter --topic t_cdr --partitions 10
+
+## **常用�置�说明**
+
+kafka 常����置说明,分为四部分
+
+* Broker Config:kafka �务端的�置
+* Producer Config:生产端的�置
+* Consumer Config:消费端的�置
+* Kafka Connect Config:kafka 连接相关的�置
+
+### **Broker Config**
+
+1. **zookeeper.connect**
+
+连接 zookeeper 集群的地å�€ï¼Œç”¨äºŽå°† kafka 集群相关的元数æ�®ä¿¡æ�¯å˜å‚¨åˆ°æŒ‡å®šçš„ zookeeper 集群ä¸
+
+**2\. advertised.port**
+
+注册到 zookeeper ä¸çš„地å�€ç«¯å�£ä¿¡æ�¯ï¼Œåœ¨ IaaS 环境ä¸ï¼Œé»˜è®¤æ³¨å†Œåˆ° zookeeper ä¸çš„æ˜¯å†…网地å�€ï¼Œé€šè¿‡è¯¥é…�置指定外网访问的地å�€å�Šç«¯å�£ï¼Œadvertised.host.name å’Œ advertised.port 作用和 advertised.port å·®ä¸�多,在 0.10.x 之å�Žï¼Œç›´æŽ¥é…�ç½® advertised.port å�³å�¯ï¼Œå‰�两个å�‚数被废弃掉了。
+
+**3\. auto.create.topics.enable**
+
+自动创建 topic,默认为 true。其作用是当å�‘一个还没有创建的 topic å�‘é€�消æ�¯æ—¶ï¼Œæ¤æ—¶ä¼šè‡ªåŠ¨åˆ›å»ºä¸€ä¸ª topic,并å�Œæ—¶è®¾ç½® -num.partition 1 (partition 个数) å’Œ default.replication.factor (副本个数,默认为 1) å�‚数。
+
+一般该å�‚数需è¦�手动关é—ï¼Œå› ä¸ºè‡ªåŠ¨åˆ›å»ºä¼šå½±å“� topic 的管ç�†ï¼Œæˆ‘们å�¯ä»¥é€šè¿‡ kafka-topic.sh 脚本手动创建 topic,通常也是建议使用这ç§�æ–¹å¼�创建 topic。在 0.10.x 之å�Žæ��供了 kafka-admin 包,å�¯ä»¥ä½¿ç”¨å…¶æ�¥åˆ›å»º topic。
+
+**4\. auto.leader.rebalance.enable**
+
+自动 rebalance,默认为 true。其作用是通过å�Žå�°çº¿ç¨‹å®šæœŸæ‰«æ��检查,在一定æ�¡ä»¶ä¸‹è§¦å�‘é‡�æ–° leader 选举;在生产环境ä¸ï¼Œä¸�建议开å�¯ï¼Œå› 为替æ�¢ leader 在性能上没有什么æ��å�‡ã€‚
+
+**5\. background.threads**
+
+��线程数,默认为 10。用于���作的线程,�以�用改动。
+
+**6\. broker.id**
+
+Broker çš„å”¯ä¸€æ ‡è¯†ï¼Œç”¨äºŽåŒºåˆ†ä¸�å�Œçš„ Broker。kafka çš„æ£€æŸ¥å°±æ˜¯åŸºäºŽæ¤ id 是å�¦åœ¨ zookeeper ä¸/brokers/ids 目录下是å�¦æœ‰ç›¸åº”çš„ id 目录æ�¥åˆ¤å®š Broker 是å�¦å�¥åº·ã€‚
+
+**7\. compression.type**
+
+压缩类型。æ¤é…�ç½®å�¯ä»¥æŽ¥å�—的压缩类型有 gzipã€�snappyã€�lz4。å�¦å¤–å�¯ä»¥ä¸�设置,å�³ä¿�æŒ�和生产端相å�Œçš„åŽ‹ç¼©æ ¼å¼�。
+
+**8\. delete.topic.enable**
+
+å�¯ç”¨åˆ 除 topic。如果关é—ï¼Œåˆ™æ— æ³•ä½¿ç”¨ admin 工具进行 topic çš„åˆ é™¤æ“�作。
+
+**9\. leader.imbalance.check.interval.seconds**
+
+partition 检查�新 rebalance 的周期时间
+
+**10\. leader.imbalance.per.broker.percentage**
+
+æ ‡è¯†æ¯�个 Broker 失去平衡的比率,如果超过改比率,则执行é‡�新选举 Broker çš„ leader
+
+**11\. log.dir / log.dirs**
+
+ä¿�å˜ kafka 日志数æ�®çš„ä½�置。如果 log.dirs 没有设置,则使用 log.dir 指定的目录进行日志数æ�®å˜å‚¨ã€‚
+
+**12\. log.flush.interval.messages**
+
+partition 分区的数��达到指定大�时,对数�进行一次刷盘�作。比如设置了 1024k 大�,当 partition 积累的数��达到这个数值时则将数�写入到�盘上。
+
+**13\. log.flush.interval.ms**
+
+æ•°æ�®å†™å…¥ç£�盘时间间隔,å�³å†…å˜ä¸çš„æ•°æ�®ä¿�留多久就æŒ�久化一次,如果没有设置,则使用 log.flush.scheduler.interval.ms å�‚数指定的值。
+
+**14\. log.retention.bytes**
+
+表示 topic 的容é‡�达到指定大å°�时,则对其数æ�®è¿›è¡Œæ¸…除æ“�作,默认为-1,永远ä¸�åˆ é™¤ã€‚
+
+**15\. log.retention.hours**
+
+æ ‡ç¤º topic 的数æ�®æœ€é•¿ä¿�留多久,å�•ä½�是å°�æ—¶
+
+**16\. log.retention.minutes**
+
+表示 topic 的数�最长�留多久,��是分钟,如果没有设置该�数,则使用 log.retention.hours �数
+
+**17\. log.retention.ms**
+
+表示 topic 的数�最长�留多久,��是毫秒,如果没有设置该�数,则使用 log.retention.minutes �数
+
+**18\. log.roll.hours**
+
+æ–°çš„ segment 创建周期,å�•ä½�å°�时。kafka æ•°æ�®æ˜¯ä»¥ segment å˜å‚¨çš„,当周期时间到达时,就创建一个新的 segment æ�¥å˜å‚¨æ•°æ�®ã€‚
+
+**19\. log.segment.bytes**
+
+segment 的大�。当 segment 大�达到指定值时,就新创建一个 segment。
+
+**20\. message.max.bytes**
+
+topic 能够接收的最大文件大�。需�注�的是 producer 和 consumer 端设置的大�需�一致。
+
+**21\. min.insync.replicas**
+
+最å°�副本å�Œæ¥ä¸ªæ•°ã€‚当 producer 设置了 request.required.acks 为-1 时,则 topic 的副本数è¦�å�Œæ¥è‡³è¯¥å�‚数指定的个数,如果达ä¸�到,则 producer 端会产生异常。
+
+**22\. num.io.threads**
+
+指定 io �作的线程数
+
+**23\. num.network.threads**
+
+执行网络�作的线程数
+
+**24\. num.recovery.threads.per.data.dir**
+
+�个数�目录用于��数�的线程数
+
+**25\. num.replica.fetchers**
+
+从 leader 备份数�的线程数
+
+**26\. offset.metadata.max.bytes**
+
+å…�许消费者端ä¿�å˜ offset 的最大个数
+
+**27\. offsets.commit.timeout.ms**
+
+offset �交的延迟时间
+
+**28\. offsets.topic.replication.factor**
+
+topic 的 offset 的备份数�。该�数建议设置更高��系统更高的�用性
+
+**29\. port**
+
+端��,Broker 对外�供访问的端��。
+
+**30\. request.timeout.ms**
+
+Broker 接收到请求å�Žçš„æœ€é•¿ç‰å¾…时间,如果超过设定时间,则会给客户端å�‘é€�错误信æ�¯
+
+**31\. zookeeper.connection.timeout.ms**
+
+客户端和 zookeeper 建立连接的超时时间,如果没有设置该�数,则使用 zookeeper.session.timeout.ms 值
+
+**32\. connections.max.idle.ms**
+
+空连接的超时时间。�空闲连接超过该时间时则自动销�连接。
+
+### **Producer Config**
+
+1. **bootstrap.servers**
+
+�务端列表。�接收生产消�的�务端列表
+
+**2\. key.serializer**
+
+消�键的�列化方�。指定 key 的�列化类型
+
+3..**value.serializer**
+
+消�内容的�列化方�。指定 value 的�列化类型
+
+4..**acks**
+
+消�写入 Partition 的个数。通常�以设置为 0,1,all;当设置为 0 时,�需�将消���完��就完�消���功能;当设置为 1 时,� Leader Partition 接收到数�并完��盘;当设置为 all 时,�主从 Partition 都接收到数�并�盘。
+
+5..**buffer.memory**
+
+客户端缓å˜å¤§å°�。å�³ Producer 生产的数æ�®é‡�缓å˜è¾¾åˆ°æŒ‡å®šå€¼æ—¶ï¼Œå°†ç¼“å˜æ•°æ�®ä¸€æ¬¡å�‘é€�çš„ Broker 上。
+
+6..**compression.type**
+
+压缩类型。指定消����的压缩类型,通常有 none, gzip, snappy, or, lz4 四�。�指定时消�默认�压缩。
+
+7..**retries**
+
+消æ�¯å�‘é€�失败时é‡�试次数。当该值设置大于 0 时,消æ�¯å› 为网络异常ç‰å› ç´ å¯¼è‡´æ¶ˆæ�¯å�‘é€�失败进行é‡�æ–°å�‘é€�的次数。
+
+### **Consumer Config**
+
+1. **bootstrap.servers**
+
+æœ�务端列表。å�³æ¶ˆè´¹ç«¯ä»ŽæŒ‡å®šçš„æœ�åŠ¡ç«¯åˆ—è¡¨ä¸æ‹‰å�–消æ�¯è¿›è¡Œæ¶ˆè´¹ã€‚
+
+2..**key.deserializer**
+
+消�键的��列化方�。指定 key 的��列化类型,与�列化时指定的类型相对应。
+
+3..**value.deserializer**
+
+消�内容的��列化方�。指定 value 的��列化类型,与�列化时指定的类型相对应。
+
+4..**fetch.min.bytes**
+
+抓�消�的最�内容。指定�次��务端拉�的最�消��。
+
+5..**group.id**
+
+æ¶ˆè´¹ç»„ä¸æ¯�个消费者的唯一表示。
+
+6..**heartbeat.interval.ms**
+
+心跳检查周期。�在周期性的� group coordinator ��心跳,当�务端�生 rebalance 时,会将消���给�个消费者。该�数值需��于 session.timeout.ms,通常为�者的 1/3。
+
+7..**max.partition.fetch.bytes**
+
+Partition �次返回的最大数��大�。
+
+**8\. session.timeout.ms**
+
+consumer 失效的时间。� consumer 在指定的时间�,还没有�应则认为该 consumer 已��生故障了。
+
+**9\. auto.offset.reset**
+
+当 kafka 䏿²¡æœ‰åˆ�å§‹å��ç§»é‡�或æœ�务器上ä¸�å˜åœ¨å��ç§»é‡�时,指定从哪个ä½�置开始消æ�¯æ¶ˆæ�¯ã€‚earliest:指定从头开始;latest:从最新的数æ�®å¼€å§‹æ¶ˆè´¹ã€‚
+
+### **Kafka Connect Config**
+
+1. **group.id**
+
+消费者在消费组ä¸çš„å”¯ä¸€æ ‡è¯†
+
+**2\. internal.key.converter**
+
+内部 key 的转�类型。
+
+**3\. internal.value.converter**
+
+内部 value 的转�类型。
+
+**4\. key.converter**
+
+�务端接收到 key 时指定的转�类型。
+
+5..**value.converter**
+
+�务端接收到 value 时指定的转�类型。
+
+**6\. bootstrap.servers**
+
+�务端列表。
+
+**7\. heartbeat.interval.ms**
+
+心跳检测,与 consumer 䏿Œ‡å®šçš„é…�ç½®å�«ä¹‰ç›¸å�Œã€‚
+
+**8\. session.timeout.ms**
+
+session 有效时间,与 consumer 䏿Œ‡å®šçš„é…�ç½®å�«ä¹‰ç›¸å�Œã€‚
+
+## **总结**
+
+本文总结了平时�常用到的一些 Kafka �置�命令说明,方便�时查看;喜欢的朋��以收�以备�时之需。
+
+
+## å�‚考文ç«
+https://blog.csdn.net/cao131502
+https://zhuanlan.zhihu.com/p/137811719
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\346\236\266\346\236\204\344\273\213\347\273\215.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\346\236\266\346\236\204\344\273\213\347\273\215.md"
new file mode 100644
index 0000000..2d35efe
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\346\236\266\346\236\204\344\273\213\347\273\215.md"
@@ -0,0 +1,298 @@
+## 一. 工作�程
+
+Kafka䏿¶ˆæ�¯æ˜¯ä»¥topic进行分类的,Producer生产消æ�¯ï¼ŒConsumer消费消æ�¯ï¼Œéƒ½æ˜¯é�¢å�‘topic的。
+
+
+
+
+
+
+
+
+Topic是逻辑上的改å�˜ï¼ŒPartition是物ç�†ä¸Šçš„æ¦‚念,æ¯�个Partition对应ç�€ä¸€ä¸ªlog文件,该log文件ä¸å˜å‚¨çš„就是producer生产的数æ�®ï¼Œtopic=N*partitionï¼›partition=log
+
+Producer生产的数æ�®ä¼šè¢«ä¸�æ–çš„è¿½åŠ åˆ°è¯¥log文件的末端,且æ¯�æ�¡æ•°æ�®éƒ½æœ‰è‡ªå·±çš„offset,consumer组ä¸çš„æ¯�个consumer,都会实时记录自己消费到了哪个offset,以便出错æ�¢å¤�的时候,å�¯ä»¥ä»Žä¸Šæ¬¡çš„ä½�ç½®ç»§ç»æ¶ˆè´¹ã€‚æµ�程:Producer => Topic(Log with offset)=> Consumer.
+
+## 二. 文件å˜å‚¨
+
+Kafka文件å˜å‚¨ä¹Ÿæ˜¯é€šè¿‡æœ¬åœ°è�½ç›˜çš„æ–¹å¼�å˜å‚¨çš„,主è¦�是通过相应的log与indexç‰æ–‡ä»¶ä¿�å˜å…·ä½“的消æ�¯æ–‡ä»¶ã€‚
+
+
+
+
+
+
+
+
+生产者ä¸�æ–çš„å�‘logæ–‡ä»¶è¿½åŠ æ¶ˆæ�¯æ–‡ä»¶ï¼Œä¸ºäº†é˜²æ¢log文件过大导致定ä½�效率低下,Kafkaçš„log文件以1G为一个分界点,当.log文件大å°�超过1Gçš„æ—¶å€™ï¼Œæ¤æ—¶ä¼šåˆ›å»ºä¸€ä¸ªæ–°çš„.log文件,å�Œæ—¶ä¸ºäº†å¿«é€Ÿå®šä½�å¤§æ–‡ä»¶ä¸æ¶ˆæ�¯ä½�置,Kafka采å�–了分片和索引的机制æ�¥åŠ é€Ÿå®šä½�。
+
+在kafkaçš„å˜å‚¨log的地方,å�³æ–‡ä»¶çš„地方,会å˜åœ¨æ¶ˆè´¹çš„å��ç§»é‡�以å�Šå…·ä½“的分区信æ�¯ï¼Œåˆ†åŒºä¿¡æ�¯çš„è¯�主è¦�包括.indexå’Œ.log文件组æˆ�
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+副本目的是为了备份,所以å�Œä¸€ä¸ªåˆ†åŒºå˜å‚¨åœ¨ä¸�å�Œçš„broker上,å�³å½“third-2å˜åœ¨å½“å‰�机器kafka01上,实际上å†�kafka03ä¸ä¹Ÿæœ‰è¿™ä¸ªåˆ†åŒºçš„æ–‡ä»¶ï¼ˆå‰¯æœ¬ï¼‰ï¼Œåˆ†åŒºä¸åŒ…å�«å‰¯æœ¬ï¼Œå�³ä¸€ä¸ªåˆ†åŒºå�¯ä»¥è®¾ç½®å¤šä¸ªå‰¯æœ¬ï¼Œå‰¯æœ¬ä¸æœ‰ä¸€ä¸ªæ˜¯leader,其余为follower。
+
+
+
+
+
+
+
+
+如果.log文件超出大�,则会产生新的.log文件。如下所示:
+
+
+
+```
+00000000000000000000.index
+00000000000000000000.log
+00000000000000170410.index
+00000000000000170410.log
+00000000000000239430.index
+00000000000000239430.log
+
+```
+
+
+
+**æ¤æ—¶å¦‚何快速定ä½�æ•°æ�®ï¼Œæ¥éª¤ï¼š**
+
+
+
+```
+.index文件å˜å‚¨çš„æ¶ˆæ�¯çš„offset+真实的起始å��ç§»é‡�。.logä¸å˜æ”¾çš„æ˜¯çœŸå®žçš„æ•°æ�®ã€‚
+
+```
+
+
+
+首先通过二分查找.index文件到查找到当å‰�消æ�¯å…·ä½“çš„å��移,如上图所示,查找为2,å�‘现第二个文件为6,则定ä½�到一个文件ä¸ã€‚ ç„¶å�Žé€šè¿‡ç¬¬ä¸€ä¸ª.index文件通过seek定ä½�å…ƒç´ çš„ä½�ç½®3,定ä½�到之å�ŽèŽ·å�–èµ·å§‹å��ç§»é‡�+当å‰�文件大å°�=总的å��ç§»é‡�。 获å�–到总的å��ç§»é‡�之å�Žï¼Œç›´æŽ¥å®šä½�到.log文件å�³å�¯å¿«é€Ÿè޷得当å‰�消æ�¯å¤§å°�。
+
+## 三. 生产者分区ç–ç•¥
+
+**åˆ†åŒºçš„åŽŸå› ** 1\. æ–¹ä¾¿åœ¨é›†ç¾¤ä¸æ‰©å±•:æ¯�个partition通过调整以适应它所在的机器,而一个Topicå�ˆå�¯ä»¥æœ‰å¤šä¸ªpartition组æˆ�ï¼Œå› æ¤æ•´ä¸ªé›†ç¾¤å�¯ä»¥é€‚应适å�ˆçš„æ•°æ�®ã€‚ 2\. å�¯ä»¥æ��高并å�‘:以Partition为å�•ä½�进行读写。类似于多路。
+
+**分区的原则** 1\. 指明partitionï¼ˆè¿™é‡Œçš„æŒ‡æ˜Žæ˜¯æŒ‡ç¬¬å‡ ä¸ªåˆ†åŒºï¼‰çš„æƒ…å†µä¸‹ï¼Œç›´æŽ¥å°†æŒ‡æ˜Žçš„å€¼ä½œä¸ºpartition的值 2\. 没有指明partition的情况下,但是å˜åœ¨å€¼keyï¼Œæ¤æ—¶å°†keyçš„hash值与topicçš„partition总数进行å�–余得到partition值 3\. 值与partitionå�‡æ— 的情况下,第一次调用时éš�机生æˆ�一个整数,å�Žé�¢æ¯�次调用在这个整数上自增,将这个值与topicå�¯ç”¨çš„partition总数å�–余得到partition值,å�³round-robin算法。
+
+## 四. 生产者ISR
+
+为ä¿�è¯�producerå�‘é€�的数æ�®èƒ½å¤Ÿå�¯é� çš„å�‘é€�到指定的topicä¸ï¼Œtopicçš„æ¯�个partition收到producerå�‘é€�的数æ�®å�Žï¼Œéƒ½éœ€è¦�å�‘producerå�‘é€�ackacknowledgement,如果producer收到ack就会进行下一轮的å�‘é€�,å�¦åˆ™é‡�æ–°å�‘é€�æ•°æ�®ã€‚
+
+
+
+
+
+
+
+
+**å�‘é€�ack的时机** ç¡®ä¿�有follower与leaderå�Œæ¥å®Œæˆ�,leaderå†�å�‘é€�ackï¼Œè¿™æ ·å�¯ä»¥ä¿�è¯�在leader挂掉之å�Žï¼Œfollowerä¸å�¯ä»¥é€‰å‡ºæ–°çš„leader(主è¦�是确ä¿�follower䏿•°æ�®ä¸�丢失)
+
+**followerå�Œæ¥å®Œæˆ�多少æ‰�å�‘é€�ack** 1\. å�Šæ•°ä»¥ä¸Šçš„followerå�Œæ¥å®Œæˆ�,å�³å�¯å�‘é€�ack 2\. 全部的followerå�Œæ¥å®Œæˆ�,æ‰�å�¯ä»¥å�‘é€�ack
+
+## 4.1 副本数æ�®å�Œæ¥ç–ç•¥
+
+### 4.1.1 å�Šæ•°followerå�Œæ¥å®Œæˆ�å�³å�‘é€�ack
+
+优点是延迟低
+
+缺点是选举新的leader的时候,容å¿�nå�°èŠ‚ç‚¹çš„æ•…éšœï¼Œéœ€è¦�2n+1ä¸ªå‰¯æœ¬ï¼ˆå› ä¸ºéœ€è¦�å�Šæ•°å�Œæ„�,所以故障的时候,能够选举的å‰�æ��是剩下的副本超过å�Šæ•°ï¼‰ï¼Œå®¹é”™çŽ‡ä¸º1/2
+
+### 4.1.2 全部followerå�Œæ¥å®Œæˆ�完æˆ�å�‘é€�ack
+
+优点是容错率æ�žï¼Œé€‰ä¸¾æ–°çš„leader的时候,容å¿�nå�°èŠ‚ç‚¹çš„æ•…éšœå�ªéœ€è¦�n+1个副本å�³å�¯ï¼Œå› 为å�ªéœ€è¦�剩下的一个人å�Œæ„�å�³å�¯å�‘é€�ack了
+
+ç¼ºç‚¹æ˜¯å»¶è¿Ÿé«˜ï¼Œå› ä¸ºéœ€è¦�全部副本å�Œæ¥å®Œæˆ�æ‰�å�¯
+
+### 4.1.3 kafka的选择
+
+kafka选择的是第二ç§�ï¼Œå› ä¸ºåœ¨å®¹å™¨çŽ‡ä¸Šé�¢æ›´åŠ æœ‰ä¼˜åŠ¿ï¼Œå�Œæ—¶å¯¹äºŽåˆ†åŒºçš„æ•°æ�®è€Œè¨€ï¼Œæ¯�个分区都有大é‡�的数æ�®ï¼Œç¬¬ä¸€ç§�æ–¹æ¡ˆä¼šé€ æˆ�大é‡�æ•°æ�®çš„冗余。虽然第二ç§�网络延迟较高,但是网络延迟对于Kafka的影å“�较å°�。
+
+## 4.2 ISR(å�Œæ¥å‰¯æœ¬é›†)
+
+**猜想** 采用了第二ç§�方案进行å�Œæ¥ack之å�Žï¼Œå¦‚æžœleader收到数æ�®ï¼Œæ‰€æœ‰çš„follower开始å�Œæ¥æ•°æ�®ï¼Œä½†æœ‰ä¸€ä¸ªfollowerå› ä¸ºæŸ�ç§�故障,迟迟ä¸�能够与leader进行å�Œæ¥ï¼Œé‚£ä¹ˆleaderå°±è¦�一直ç‰å¾…下去,直到它å�Œæ¥å®Œæˆ�,æ‰�å�¯ä»¥å�‘é€�ackï¼Œæ¤æ—¶éœ€è¦�如何解决这个问题呢?
+
+**解决** leaderä¸ç»´æŠ¤äº†ä¸€ä¸ªåЍæ€�çš„ISR(in-sync replica set),å�³ä¸Žleaderä¿�æŒ�å�Œæ¥çš„follower集å�ˆï¼Œå½“ISRä¸çš„follower完æˆ�æ•°æ�®çš„å�Œæ¥ä¹‹å�Žï¼Œç»™leaderå�‘é€�ack,如果follower长时间没有å�‘leaderå�Œæ¥æ•°æ�®ï¼Œåˆ™è¯¥follower将从ISRä¸è¢«è¸¢å‡ºï¼Œè¯¥ä¹‹é—´é˜ˆå€¼ç”±replica.lag.time.max.mså�‚数设定。当leaderå�‘生故障之å�Žï¼Œä¼šä»ŽISRä¸é€‰ä¸¾å‡ºæ–°çš„leader。
+
+## 五. 生产者ack机制
+
+对于æŸ�些ä¸�太é‡�è¦�的数æ�®ï¼Œå¯¹æ•°æ�®çš„å�¯é� 性è¦�求ä¸�是很高,能够容å¿�æ•°æ�®çš„å°‘é‡�丢失,所以没有必è¦�ç‰åˆ°ISR䏿‰€æœ‰çš„follower全部接å�—æˆ�功。
+
+Kafka为用户æ��供了三ç§�å�¯é� æ€§çº§åˆ«ï¼Œç”¨æˆ·æ ¹æ�®å�¯é� 性和延迟的è¦�求进行æ�ƒè¡¡é€‰æ‹©ä¸�å�Œçš„é…�置。
+
+**ackå�‚æ•°é…�ç½®** 0:producerä¸�ç‰å¾…brokerçš„ack,这一æ“�作æ��供了最低的延迟,broker接收到还没有写入ç£�盘就已ç»�返回,当broker故障时有å�¯èƒ½ä¸¢å¤±æ•°æ�®
+
+1:producerç‰å¾…brokerçš„ack,partitionçš„leaderè�½ç›˜æˆ�功å�Žè¿”回ack,如果在followerå�Œæ¥æˆ�功之å‰�leader故障,那么将丢失数æ�®ã€‚(å�ªæ˜¯leaderè�½ç›˜ï¼‰
+
+
+
+
+
+
+
+
+-1(all):producerç‰å¾…brokerçš„ack,partitionçš„leaderå’ŒISRçš„follower全部è�½ç›˜æˆ�功æ‰�返回ack,但是如果在followerå�Œæ¥å®Œæˆ�å�Žï¼Œbrokerå�‘é€�ack之å‰�,如果leaderå�‘ç”Ÿæ•…éšœï¼Œä¼šé€ æˆ�æ•°æ�®é‡�å¤�。(这里的数æ�®é‡�å¤�æ˜¯å› ä¸ºæ²¡æœ‰æ”¶åˆ°ï¼Œæ‰€ä»¥ç»§ç»é‡�å�‘导致的数æ�®é‡�å¤�)
+
+
+
+
+
+
+
+
+producerè¿”ack,0æ— è�½ç›˜ç›´æŽ¥è¿”,1å�ªleaderè�½ç›˜ç„¶å�Žè¿”,-1全部è�½ç›˜ç„¶å�Žè¿”
+
+## å…. æ•°æ�®ä¸€è‡´æ€§é—®é¢˜
+
+
+
+
+
+
+
+
+LEO(Log End Offset):æ¯�个副本最å�Žçš„一个offset HW(High Watermark):高水ä½�,指代消费者能è§�到的最大的offset,ISRé˜Ÿåˆ—ä¸æœ€å°�çš„LEO。
+
+**follower故障和leaderæ•…éšœ** 1\. follower故障:followerå�‘生故障å�Žä¼šè¢«ä¸´æ—¶è¸¢å‡ºISR,ç‰å¾…该followeræ�¢å¤�å�Žï¼Œfollower会读å�–本地ç£�盘记录的上次的HW,并将log文件高于HW的部分截å�–掉,从HW开始å�‘leader进行å�Œæ¥ï¼Œç‰å¾…该followerçš„LEO大于ç‰äºŽè¯¥partitionçš„HW,å�³follower追上leader之å�Žï¼Œå°±å�¯ä»¥é‡�æ–°åŠ å…¥ISR了。 2\. leader故障:leaderå�‘生故障之å�Žï¼Œä¼šä»ŽISRä¸é€‰å‡ºä¸€ä¸ªæ–°çš„leader,为了ä¿�è¯�多个副本之间的数æ�®çš„一致性,其余的follower会先将å�„自的log文件高于HW的部分截掉,然å�Žä»Žæ–°çš„leaderä¸å�Œæ¥æ•°æ�®ã€‚
+
+**这�能��副本之间的数�一致性,并�能��数��丢失或者���**
+
+## 七. ExactlyOnce
+
+å°†æœ�务器的ACK级别设置为-1(all),å�¯ä»¥ä¿�è¯�producer到Server之间ä¸�会丢失数æ�®ï¼Œå�³At Least Once至少一次è¯ä¹‰ã€‚å°†æœ�务器ACK级别设置为0,å�¯ä»¥ä¿�è¯�生产者æ¯�æ�¡æ¶ˆæ�¯å�ªä¼šè¢«å�‘é€�一次,å�³At Most Once至多一次。
+
+At Least Once�以��数��丢失,但是�能��数����,而At Most Once�以��数����,但是�能��数��丢失,对于��的数�,则�求数����也�丢失,�Exactly Once�精确的一次。
+
+在0.11版本的Kafka之�,�能��数��丢失,在下游对数�的��进行去��作,多余多个下游应用的情况,则分别进行全局去�,对性能有很大影�。
+
+0.11版本的kafka,引入了一项é‡�å¤§ç‰¹æ€§ï¼šå¹‚ç‰æ€§ï¼Œå¹‚ç‰æ€§æŒ‡ä»£Producerä¸�论å�‘Serverå�‘é€�了多少次é‡�å¤�æ•°æ�®ï¼ŒServer端都å�ªä¼šæŒ�久化一æ�¡æ•°æ�®ã€‚å¹‚ç‰æ€§ç»“å�ˆAt Least Onceè¯ä¹‰å°±æž„æˆ�了Kafkaçš„Exactly Onceè¯ä¹‰ã€‚
+
+å�¯ç”¨å¹‚ç‰æ€§ï¼Œå�³åœ¨Producerçš„å�‚æ•°ä¸è®¾ç½®enable.idempotence=trueå�³å�¯ï¼ŒKafkaçš„å¹‚ç‰æ€§å®žçŽ°å®žé™…æ˜¯å°†ä¹‹å‰�的去é‡�æ“�作放在了数æ�®ä¸Šæ¸¸æ�¥å�šï¼Œå¼€å�¯å¹‚ç‰æ€§çš„Producer在åˆ�始化的时候会被分é…�一个PID,å�‘å¾€å�Œä¸€ä¸ªPartition的消æ�¯ä¼šé™„带Sequence Number,而Broker端会对å�šç¼“å˜ï¼Œå½“具有相å�Œä¸»é”®çš„æ¶ˆæ�¯çš„æ—¶å€™ï¼ŒBrokerå�ªä¼šæŒ�久化一æ�¡ã€‚
+
+但PID在é‡�å�¯ä¹‹å�Žä¼šå�‘生å�˜åŒ–,å�Œæ—¶ä¸�å�Œçš„Partition也具有ä¸�å�Œçš„ä¸»é”®ï¼Œæ‰€ä»¥å¹‚ç‰æ€§æ— 法ä¿�è¯�跨分区跨会è¯�çš„Exactly Once。
+
+�解决跨分区跨会�的Exactly Once,就引入了生产者事务的概念。
+
+## å…«. Kafka消费者分区分é…�ç–ç•¥
+
+**消费方å¼�:** consumer采用pull拉的方å¼�æ�¥ä»Žbrokerä¸è¯»å�–æ•°æ�®ã€‚
+
+push推的模å¼�很难适应消费速率ä¸�å�Œçš„æ¶ˆè´¹è€…ï¼Œå› ä¸ºæ¶ˆæ�¯å�‘é€�率是由brokerå†³å®šçš„ï¼Œå®ƒçš„ç›®æ ‡æ˜¯å°½å�¯èƒ½ä»¥æœ€å¿«çš„é€Ÿåº¦ä¼ é€’æ¶ˆæ�¯ï¼Œä½†æ˜¯è¿™æ ·å®¹æ˜“é€ æˆ�consumeræ�¥ä¸�å�Šå¤„ç�†æ¶ˆæ�¯ï¼Œå…¸åž‹çš„表现就是拒ç»�æœ�务以å�Šç½‘络拥塞。而pullæ–¹å¼�则å�¯ä»¥è®©consumeræ ¹æ�®è‡ªå·±çš„æ¶ˆè´¹å¤„ç�†èƒ½åŠ›ä»¥é€‚å½“çš„é€Ÿåº¦æ¶ˆè´¹æ¶ˆæ�¯ã€‚
+
+pull模å¼�ä¸�足在于如果Kafka䏿²¡æœ‰æ•°æ�®ï¼Œæ¶ˆè´¹è€…å�¯èƒ½ä¼šé™·å…¥å¾ªçŽ¯ä¹‹ä¸ (å› ä¸ºæ¶ˆè´¹è€…ç±»ä¼¼ç›‘å�¬çжæ€�获å�–æ•°æ�®æ¶ˆè´¹çš„),一直返回空数æ�®ï¼Œé’ˆå¯¹è¿™ä¸€ç‚¹ï¼ŒKafka的消费者在消费数æ�®æ—¶ä¼šä¼ 入一个时长å�‚æ•°timeout,如果当å‰�没有数æ�®å�¯ä¾›æ¶ˆè´¹ï¼Œconsumer会ç‰å¾…一段时间之å�Žå†�返回,时长为timeout。
+
+## 8.1\. 分区分é…�ç–ç•¥
+
+一个consumer group䏿œ‰å¤šä¸ªconsumer,一个topic有多个partition,所以必然会涉å�Šåˆ°partition的分é…�问题,å�³ç¡®å®šé‚£ä¸ªpartition由那个consumer消费的问题。
+
+**Kafka的两ç§�分é…�ç–略:** 1\. round-robin循环 2\. range
+
+**Round-Robin** 主è¦�采用轮询的方å¼�分é…�所有的分区,该ç–略主è¦�实现的æ¥éª¤ï¼š å�‡è®¾å˜åœ¨ä¸‰ä¸ªtopic:t0/t1/t2,分别拥有1/2/3个分区,共有6个分区,分别为t0-0/t1-0/t1-1/t2-0/t2-1/t2-2,这里å�‡è®¾æˆ‘们有三个Consumer,C0ã€�C1ã€�C2,订阅情况为C0:t0,C1:t0ã€�t1,C2:t0/t1/t2。
+
+æ¤æ—¶round-robin采å�–的分é…�æ–¹å¼�,则是按照分区的å—典对分区和消费者进行排åº�,然å�Žå¯¹åˆ†åŒºè¿›è¡Œå¾ªçޝé��历,é�‡åˆ°è‡ªå·±è®¢é˜…的则消费,å�¦åˆ™å�‘下轮询下一个消费者。å�³æŒ‰ç…§åˆ†åŒºè½®è¯¢æ¶ˆè´¹è€…,继而消æ�¯è¢«æ¶ˆè´¹ã€‚
+
+
+
+
+
+
+
+
+分区在循环é��历消费者,自己被当å‰�消费者订阅,则消æ�¯ä¸Žæ¶ˆè´¹è€…å…±å�Œå�‘下(消æ�¯è¢«æ¶ˆè´¹ï¼‰ï¼Œå�¦åˆ™æ¶ˆè´¹è€…å�‘下消æ�¯ç»§ç»é��历(消æ�¯æ²¡æœ‰è¢«æ¶ˆè´¹ï¼‰ã€‚轮询的方å¼�会导致æ¯�个Consumer所承载的分区数é‡�ä¸�一致,从而导致å�„个Consumer压力ä¸�å�‡ã€‚上é�¢çš„C2å› ä¸ºè®¢é˜…çš„æ¯”è¾ƒå¤šï¼Œå¯¼è‡´æ‰¿å�—的压力也相对较大。
+
+**Range** Rangeçš„é‡�分é…�ç–略,首先计算å�„个Consumer将会承载的分区数é‡�,然å�Žå°†æŒ‡å®šæ•°é‡�的分区分é…�给该Consumer。å�‡è®¾å˜åœ¨ä¸¤ä¸ªConsumer,C0å’ŒC1,两个Topic,t0å’Œt1,这两个Topic分别都有三个分区,那么总共的分区有6个,t0-0,t0-1,t0-2,t1-0,t1-1,t1-2。分é…�æ–¹å¼�如下:
+
+range按照topic一次进行分é…�,å�³æ¶ˆè´¹è€…é��历topic,t0,å�«æœ‰ä¸‰ä¸ªåˆ†åŒºï¼Œå�Œæ—¶æœ‰ä¸¤ä¸ªè®¢é˜…了该topic的消费者,将这些分区和消费者按照å—å…¸åº�排列。 按照平å�‡åˆ†é…�的方å¼�计算æ¯�个Consumer会得到多少个分区,如果没有除尽,多出æ�¥çš„分区则按照å—å…¸åº�挨个分é…�ç»™æ¶ˆè´¹è€…ã€‚æŒ‰ç…§æ¤æ–¹å¼�以æ¤åˆ†é…�æ¯�一个topic给订阅的消费者,最å�Žå®Œæˆ�topic分区的分é…�。
+
+
+
+
+
+
+
+
+## 8.2\. 消费者offsetçš„å˜å‚¨
+
+由于Consumer在消费过程ä¸å�¯èƒ½ä¼šå‡ºçްæ–ç”µå®•æœºç‰æ•…障,Consumeræ�¢å¤�以å�Žï¼Œéœ€è¦�从故障å‰�çš„ä½�ç½®ç»§ç»æ¶ˆè´¹ï¼Œæ‰€ä»¥Consumer需è¦�实时记录自己消费到了那个offset,以便故障æ�¢å¤�å�Žç»§ç»æ¶ˆè´¹ã€‚
+
+
+
+
+
+
+
+
+Kafka0.9版本之å‰�,consumer默认将offsetä¿�å˜åœ¨zookeeperä¸ï¼Œä»Ž0.9版本之å�Žï¼Œconsumer默认将offsetä¿�å˜åœ¨kafka一个内置的topicä¸ï¼Œè¯¥topic为__consumer_offsets
+
+## �. 高效读写&Zookeeper作用
+
+## 9.1 高效读写
+
+**顺åº�写ç£�盘** Kafkaçš„producer生产数æ�®ï¼Œéœ€è¦�写入到log文件ä¸ï¼Œå†™çš„è¿‡ç¨‹æ˜¯è¿½åŠ åˆ°æ–‡ä»¶æœ«ç«¯ï¼Œé¡ºåº�写的方å¼�,官网有数æ�®è¡¨æ˜Žï¼Œå�Œæ ·çš„ç£�盘,顺åº�写能够到600M/s,而éš�机写å�ªæœ‰200K/s,这与ç£�盘的机械结构有关,顺åº�å†™ä¹‹æ‰€ä»¥å¿«ï¼Œæ˜¯å› ä¸ºå…¶çœ�去了大é‡�ç£�头寻å�€çš„æ—¶é—´ã€‚
+
+**零�制技术**
+
+NIC:Network Interface Controller网络接�控制器
+
+
+
+
+
+
+
+
+这是常规的读å�–æ“�作: 1\. æ“�作系统将数æ�®ä»Žç£�盘文件ä¸è¯»å�–åˆ°å†…æ ¸ç©ºé—´çš„é¡µé�¢ç¼“å˜ 2\. 应用程åº�将数æ�®ä»Žå†…æ ¸ç©ºé—´è¯»å…¥åˆ°ç”¨æˆ·ç©ºé—´ç¼“å†²åŒº 3\. 应用程åº�将读到的数æ�®å†™å›žå†…æ ¸ç©ºé—´å¹¶æ”¾å…¥åˆ°socket缓冲区 4\. æ“�作系统将数æ�®ä»Žsocket缓冲区å¤�制到网å�¡æŽ¥å�£ï¼Œæ¤æ—¶æ•°æ�®é€šè¿‡ç½‘络å�‘é€�给消费者
+
+
+
+
+
+
+
+
+é›¶æ‹·è´�技术å�ªç”¨å°†ç£�盘文件的数æ�®å¤�制到页é�¢ç¼“å˜ä¸ä¸€æ¬¡ï¼Œç„¶å�Žå°†æ•°æ�®ä»Žé¡µé�¢ç¼“å˜ç›´æŽ¥å�‘é€�到网络ä¸ï¼ˆå�‘é€�ç»™ä¸�å�Œçš„订阅者时,都å�¯ä»¥ä½¿ç”¨å�Œä¸€ä¸ªé¡µé�¢ç¼“å˜ï¼‰ï¼Œä»Žè€Œé�¿å…�了é‡�å¤�å¤�制的æ“�作。
+
+如果有10ä¸ªæ¶ˆè´¹è€…ï¼Œä¼ ç»Ÿæ–¹å¼�下,数æ�®å¤�制次数为4*10=40次,而使用“零拷è´�技术â€�å�ªéœ€è¦�1+10=11次,一次为从ç£�盘å¤�制到页é�¢ç¼“å˜ï¼Œ10次表示10个消费者å�„自读å�–一次页é�¢ç¼“å˜ã€‚
+
+## 9.2 zookeeper作用
+
+Kafkaé›†ç¾¤ä¸æœ‰ä¸€ä¸ªbroker会被选举为Controller,负责管ç�†é›†ç¾¤broker的上下线ã€�所有topic的分区副本分é…�å’Œleader的选举ç‰å·¥ä½œã€‚Controller的工作管ç�†æ˜¯ä¾�赖于zookeeper的。
+
+**Partition的Leader的选举过程**
+
+
+
+
+
+
+
+
+## �. 事务
+
+kafka从0.11版本开始引入了事务支æŒ�,事务å�¯ä»¥ä¿�è¯�Kafka在Exactly Onceè¯ä¹‰çš„基础上,生产和消费å�¯ä»¥è·¨åˆ†åŒºçš„会è¯�,è¦�么全部æˆ�功,è¦�么全部失败。
+
+## 10.1 Producer事务
+
+为了按跨分区跨会è¯�的事务,需è¦�引入一个全局唯一的Transaction ID,并将Producer获得的PID(å�¯ä»¥ç�†è§£ä¸ºProducer ID)å’ŒTransaction IDè¿›è¡Œç»‘å®šï¼Œè¿™æ ·å½“Produceré‡�å�¯ä¹‹å�Žå°±å�¯ä»¥é€šè¿‡æ£åœ¨è¿›è¡Œçš„Transaction ID获得原æ�¥çš„PID。
+
+为了管ç�†Transaction,Kafka引入了一个新的组件Transaction Coordinator,Producer就是通过有和Transaction Coordinator交互获得Transaction ID对应的任务状æ€�,Transaction Coordinator还负责将事务信æ�¯å†™å…¥å†…部的一个Topicä¸ï¼Œè¿™æ ·å�³ä½¿æ•´ä¸ªæœ�务é‡�å�¯ï¼Œç”±äºŽäº‹åŠ¡çŠ¶æ€�得到ä¿�å˜ï¼Œè¿›è¡Œä¸çš„事务状æ€�å�¯ä»¥æ�¢å¤�,从而继ç»è¿›è¡Œã€‚
+
+## 10.2 Consumer事务
+
+对于Consumer而言,事务的ä¿�è¯�相比Producerç›¸å¯¹è¾ƒå¼±ï¼Œå°¤å…¶æ˜¯æ— æ³•ä¿�è¯�Commit的信æ�¯è¢«ç²¾ç¡®æ¶ˆè´¹ï¼Œè¿™æ˜¯ç”±äºŽConsumerå�¯ä»¥é€šè¿‡offset访问任æ„�ä¿¡æ�¯ï¼Œè€Œä¸”ä¸�å�Œçš„Segment File声明周期ä¸�å�Œï¼Œå�Œä¸€äº‹åŠ¡çš„æ¶ˆæ�¯å�¯èƒ½ä¼šå‡ºçްé‡�å�¯å�Žè¢«åˆ 除的情况。
+
+## å�‚考文ç«
+
+https://blog.csdn.net/cao131502
+https://zhuanlan.zhihu.com/p/137811719
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\347\232\204\351\233\206\347\276\244\345\267\245\344\275\234\345\216\237\347\220\206.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\347\232\204\351\233\206\347\276\244\345\267\245\344\275\234\345\216\237\347\220\206.md"
new file mode 100644
index 0000000..cd6122e
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\347\232\204\351\233\206\347\276\244\345\267\245\344\275\234\345\216\237\347\220\206.md"
@@ -0,0 +1,127 @@
+**�言**
+
+ä¸Šç¯‡æ–‡ç« è®²åˆ°äº†æ¶ˆæ�¯åœ¨ Partition 上的å˜å‚¨å½¢å¼�,本æ�¥å‡†å¤‡æŽ¥ç�€æ�¥è�Šè�Šç”Ÿäº§ä¸çš„一些使用方å¼�,想了想还有些很é‡�è¦�的工作组件原ç�†æ²¡æœ‰è®²æ¸…楚,比如一个 Topic ç”± N 个 Partition 组æˆ�,那么这些 Partition 是如何å�‡åŒ€çš„分布在ä¸�å�Œçš„ Broker 上?å†�比如当一个 Broker 宕机å�Žï¼Œå…¶ä¸Šè´Ÿè´£è¯»å†™è¯·æ±‚的主 Partition æ— æ³•æ£å¸¸è®¿é—®ï¼Œå¦‚何让从 Partition 转å�˜æˆ�主 Partition æ�¥ç»§ç»æ��ä¾›æ£å¸¸çš„读写æœ�务?想è¦�解决这些问题,就必须先è¦�了解一下 Kafka 集群内部的管ç�†æœºåˆ¶ï¼Œå…¶ä¸ä¸€ä¸ªé�žå¸¸é‡�è¦�的控制器就是 KafkaController。本文我们就æ�¥è®²è®² KafkaController 是如何æ�¥è§£å†³ä¸Šé�¢æ��到的那些问题的。
+
+### **æ–‡ç« æ¦‚è§ˆ**
+
+1. KafkaController 是什么å�Šå…¶é€‰ä¸¾ç–略。
+2. KafkaController 监控 ZK 的目录分布。
+3. Partition 分布算法。
+4. Partition 的状�转移。
+5. Kafka 集群的负载�衡处��程解�。
+
+## **KafkaController 是什么å�Šå…¶é€‰ä¸¾ç–ç•¥**
+
+Kafka 集群由多å�° Broker æž„æˆ�,æ¯�å�° Broker 都有一个 KafkaController 用于管ç�†å½“å‰�çš„ Broker。试想一下,如果一个集群没有一个“领导者â€�,那么è°�去和“外界â€�(比如 ZK)沟通呢?è°�去å��è°ƒ Partition 应该如何分布在集群ä¸çš„ä¸�å�Œ Broker 上呢?è°�去处ç�† Broker 宕机å�Žï¼Œåœ¨å…¶ Broker 上的主 Partition æ— æ³•æ£å¸¸æ��供读写æœ�务å�Žï¼Œå°†å¯¹åº”的从 Partition 转å�˜æˆ�主 Partition ç»§ç»æ£å¸¸å¯¹å¤–æ��ä¾›æœ�务呢?那么由哪个 Broker çš„ KafkaController æ�¥æ‹…当“领导者â€�这个角色呢?
+
+Kafka 的设计者很�明,Zookeeper 既然是分布�应用�调�务,那么干脆就让它�帮 Kafka 集群选举一个“领导者�出�,这个“领导者�对应的 KafkaController 称为 Leader,其他的 KafkaController 被称为 Follower,在�一时刻,一个 Kafka 集群�能有一个 Leader 和 N 个 Follower。
+
+### **Zookeeper 是怎么实现 KafkaController 的选主工作呢?**
+
+�微熟悉 Zookeeper 的�伙伴应该都比较清楚,Zookeeper 是通过监控目录(zNode)的�化,从而�出一些相应的动作。
+
+Zookeeper 的目录分为四�,第一�是永久的,被称作为 `Persistent`;
+
+第二�是顺�且永久的,被称作为 `Persistent_Sequential`;
+
+第三�是临时的,被称为 `Ephemeral`;
+
+第四�是顺�且临时的,被称作为 `Ephemeral_Sequential`。
+
+KafkaController æ£æ˜¯åˆ©ç”¨äº†ä¸´æ—¶çš„这一特性æ�¥å®Œæˆ�选主的,在 Broker å�¯åŠ¨æ—¶ï¼Œæ¯�个 Broker çš„ KafkaController 都会å�‘ ZK çš„ `/controller` 目录写入 BrokerId,è°�先写入è°�就是 Leader,剩余的 KafkaController 是 Follower,当 Leader 在周期内没有å�‘ ZK å�‘é€�报告的è¯�,则认为 Leader æŒ‚äº†ï¼Œæ¤æ—¶ ZK åˆ é™¤ä¸´æ—¶çš„ `/controller` 目录,Kafka 集群ä¸çš„å…¶ä»– KafkaController 开始新的一轮争主æ“�作,æµ�程和上é�¢ä¸€æ ·ã€‚下é�¢æ˜¯é€‰ Leader çš„æµ�程图。
+
+
+
+
+
+
+Leader选举�程图
+
+
+
+从上图å�¯ä»¥çœ‹å‡ºï¼Œç¬¬ä¸€æ¬¡ï¼ŒBroker1 æˆ�功抢先在 Zookeeper çš„ /controller 目录上写入信æ�¯ï¼Œæ‰€ä»¥ Broker1 çš„ KafkaController 为 Leader,其他两个为 Follower。第二次,Broker1 å®•æœºæˆ–è€…ä¸‹çº¿ï¼Œæ¤æ—¶ Broker2 å’Œ Broker3 检测到,于是开始新一轮的争抢将信æ�¯å†™å…¥ Zookeeper,从图ä¸å�¯ä»¥çœ‹å‡ºï¼ŒBroker2 争到了 Leader,所以 Broker3 是 Follower 状æ€�。
+
+æ£å¸¸æƒ…况下,上é�¢è¿™ä¸ªæµ�程没有问题,但是如果在 Broker1 离线的情况下,Zookeeper å‡†å¤‡åˆ é™¤ /controller 的临时 node 时,系统 hang ä½�æ²¡åŠžæ³•åˆ é™¤ï¼Œæ”¹æ€Žä¹ˆåŠžå‘¢ï¼Ÿè¿™é‡Œç•™ä¸ªå°�疑问供大家æ€�考。å�Žé�¢ä¼šç”¨ä¸€ç¯‡æ–‡ç« 专门æ�¥è§£ç” Kafka 相关的问题(包括é�¢è¯•题哦,敬请期待)。
+
+## **KafkaController 监控的 ZK 目录分布**
+
+KafkaController 在åˆ�始化的时候,会针对ä¸�å�Œçš„ zNode 注册å�„ç§�å�„æ ·çš„ç›‘å�¬å™¨ï¼Œä»¥ä¾¿å¤„ç�†ä¸�å�Œçš„用户请求或者系统内部å�˜åŒ–请求。监控 ZK 的目录大概å�¯ä»¥åˆ†ä¸ºä¸¤éƒ¨åˆ†ï¼Œåˆ†åˆ«æ˜¯ `/admin` 目录和 `/brokers` 目录。å�„目录å�Šå…¶å¯¹åº”的功能如下表所示,需è¦�的朋å�‹è‡ªæ��。
+
+
+
+
+
+
+
+
+## **Partition 分布算法**
+
+
+
+
+
+
+Partition分布算法图
+
+
+
+图解:å�‡è®¾é›†ç¾¤æœ‰ 3 个 Broker,Partition å› å�为 2。
+
+1. éš�机选å�– Broker 集群ä¸çš„一个 Broker 节点,然å�Žä»¥è½®è¯¢çš„æ–¹å¼�将主 Partition å�‡åŒ€çš„分布到ä¸�å�Œçš„ Broker 上。
+2. 主 Partition 分布完��,将从 Partition 按照 AR 组内顺�以轮询的方�将 Partition �匀的分布到��的 Broker 上。
+
+## **Partition 的状�转移**
+
+用户针对特定的 Topic 创建了相应的 Partition ,但是这些 Partition ä¸�一定时刻都能够æ£å¸¸å·¥ä½œï¼Œæ‰€æœ‰ Partition 在å�Œä¸€æ—¶åˆ»ä¼šå¯¹åº” 4 个状æ€�ä¸çš„æŸ�一个;其整个生命周期会ç»�历如下状æ€�的转移,分别是 NonExistentPartitionã€�NewPartitionã€�OnlinePartitionã€�OfflinePartition,其对应的状æ€�转移情况如下图所示。
+
+
+
+
+
+
+Partition状�转移图
+
+
+
+从上图å�¯ä»¥çœ‹å‡ºï¼ŒPartition 的状æ€�会由å‰�置状æ€�æ‰�èƒ½å¤Ÿè½¬ç§»åˆ°ç›®æ ‡çŠ¶æ€�的,而ä¸�是胡乱转移状æ€�的。
+
+`NonExistentPartition:`代表没有创建 Partition 时的状æ€�,也有å�¯èƒ½æ˜¯ç¦»çº¿çš„ Partition è¢«åˆ é™¤å�Žçš„状æ€�。
+
+`NewPartition:`当 Partition è¢«åˆ›å»ºæ—¶ï¼Œæ¤æ—¶å�ªæœ‰ AR(Assigned Replica),还没有 ISR(In-Synic Replicaï¼‰ï¼Œæ¤æ—¶è¿˜ä¸�能接å�—æ•°æ�®çš„写入和读å�–。
+
+`OnlinePartition:`ç”± NewPartition 状æ€�转移为 OnlinePartition 状æ€�ï¼Œæ¤æ—¶ Partition çš„ Leader å·²ç»�被选举出æ�¥äº†ï¼Œå¹¶ä¸”也有对应的 ISR 列表ç‰ã€‚æ¤æ—¶å·²ç»�å�¯ä»¥å¯¹å¤–æ��供读写请求了。
+
+`OfflinePartition:`当 Partition 对应的 Broker 宕机或者网络异常ç‰é—®é¢˜ï¼Œç”± OnlinePartition 转移到 OfflinePartitionï¼Œæ¤æ—¶çš„ Partition å·²ç»�ä¸�能在对外æ��供读写æœ�务。当 Partition è¢«å½»åº•åˆ é™¤å�Žçжæ€�就转移æˆ� NonExistentPartition,当网络æ�¢å¤�或者 Broker æ�¢å¤�å�Žï¼Œå…¶çжæ€�å�ˆå�¯ä»¥è½¬ç§»åˆ° OnlinePartition,从而继ç»å¯¹å¤–æ��供读写æœ�务。
+
+## **Kafka 集群的负载�衡处��程解�**
+
+å‰�é�¢çš„æ–‡ç« 讲到过,Partition 有 Leader Replica å’Œ Preferred Replica 两ç§�角色,Leader Replica 负责对外æ��供读写æœ�务 Preferred Replica è´Ÿè´£å�Œæ¥ Leader Replica 上的数æ�®ã€‚现在集群ä¸å�‡è®¾æœ‰ 3 个 Broker,3 个 Partition,æ¯�个 Partition 有 3 个 Replica,当集群è¿�行一段时候å�Žï¼Œé›†ç¾¤ä¸æŸ�些 Broker 宕机,Leader Replica 进行转移,其过程如下图所示。
+
+
+
+
+
+
+Partition的Leader转移图
+
+
+
+从上图å�¯ä»¥çœ‹å‡ºï¼Œé›†ç¾¤è¿�行一段时间å�Žï¼ŒBroker1 挂掉了,在其上è¿�行的 Partition0 对应的 Leader Replica 转移到了 Broker2 上。å�‡è®¾ä¸€æ®µæ—¶é—´å�Ž Broker3 也挂了,则 Broker3 上的 Partition3 对应的 Leader Replica 也转移到了 Broker2 上,集群ä¸å�ªæœ‰ Broker2 上的 Partition 在对外æ��供读写æœ�åŠ¡ï¼Œä»Žè€Œé€ æˆ� Broker2 上的æœ�务压力比较大,之å�Ž Broker1 å’Œ Broker3 æ�¢å¤�å�Žï¼Œå…¶ä¸Šå�ªæœ‰ Preferred Replica å�šå¤‡ä»½æ“�作。
+
+针对以上这ç§�éš�ç�€æ—¶é—´çš„æŽ¨ç§»ï¼Œé›†ç¾¤ä¸�在åƒ�åˆšå¼€å§‹æ—¶é‚£æ ·å¹³è¡¡ï¼Œéœ€è¦�通过å�Žå�°çº¿ç¨‹å°† Leader Replica é‡�新分é…�到ä¸�å�Œ Broker 上,从而使得读写æœ�务尽é‡�å�‡åŒ€çš„分布在ä¸�å�Œçš„节点上。
+
+é‡�平衡æ“�作是由 partition-rebalance-thread å�Žå�°çº¿ç¨‹æ“�作的,由于其优先级很低,所以å�ªä¼šåœ¨é›†ç¾¤ç©ºé—²çš„æ—¶å€™æ‰�会执行。集群的ä¸�å¹³è¡¡çš„è¯„åˆ¤æ ‡å‡†æ˜¯ç”±`leader.imbalance.per.broker.percentage`é…�置决定的,当集群的ä¸�平衡度达到 10%(默认)时,会触å�‘å�Žå�°çº¿ç¨‹å�¯åЍé‡�平衡æ“�作,其具体执行æ¥éª¤å¦‚下:
+
+1. 对 Partition çš„ AR åˆ—è¡¨æ ¹æ�® Preferred Replica 进行分组æ“�作。
+2. �历 Broker,对其上的 Partition 进行处�。
+3. 统计 Broker 上的 Leader Replica å’Œ Preferred Replica ä¸�相ç‰çš„ Partition 个数。
+4. 统计 Broker 上的 Partition 个数。
+5. Partition 个数 / ä¸�相ç‰çš„ Partition 个数,如果大于 10%,则触å�‘é‡�平衡æ“�作;å��之,则ä¸�å�šä»»ä½•处ç�†ã€‚
+
+## **总结**
+
+本文主è¦�介ç»�了 Kafka 集群æœ�务内部的一些工作机制,相信å°�伙伴们掌æ�¡äº†è¿™éƒ¨åˆ†å†…容å�Žï¼Œå¯¹ Broker æœ�务端的工作æµ�程有了进一æ¥çš„ç�†è§£ï¼Œä»Žè€Œæ›´å¥½çš„æŠŠæŽ§æ•´ä½“é›†ç¾¤æœ�åŠ¡ã€‚ä¸‹ç¯‡æ–‡ç« æˆ‘ä»¬æ�¥æ£å¼�介ç»�一下**Kafka 常用的命令行æ“�作**,敬请期待。
+
+# å�‚考文ç«
+https://blog.csdn.net/cao131502
+https://zhuanlan.zhihu.com/p/137811719
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\351\207\215\350\246\201\347\237\245\350\257\206\347\202\271+\351\235\242\350\257\225\351\242\230\345\244\247\345\205\250.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\351\207\215\350\246\201\347\237\245\350\257\206\347\202\271+\351\235\242\350\257\225\351\242\230\345\244\247\345\205\250.md"
new file mode 100644
index 0000000..77ac95f
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232Kafka\351\207\215\350\246\201\347\237\245\350\257\206\347\202\271+\351\235\242\350\257\225\351\242\230\345\244\247\345\205\250.md"
@@ -0,0 +1,518 @@
+## ���试知识点
+
+
+
+
+Kafka 消费端确�一个 Partition 在一个消费者组内�能被一个消费者消费。这��改怎么�解呢?
+
+1. 在�一个消费者组内,一个 Partition �能被一个消费者消费。
+2. 在�一个消费者组内,所有消费者组�起�必定�以消费一个 Topic 下的所有 Partition。
+3. 在�一个消费组内,一个消费者�以消费多个 Partition 的信�。
+4. 在��消费者组内,�一个分区�以被多个消费者消费。
+5. �个消费者组一定会完整消费一个 Topic 下的所有 Partition。
+
+### **消费组å˜åœ¨çš„æ„�义**
+
+了解了消费者与消费组的关系å�Žï¼Œæœ‰æœ‹å�‹ä¼šæ¯”较疑惑消费者组有啥实际å˜åœ¨çš„æ„�义呢?或者说消费组的作用是什么?
+
+作者对消费组的作用归结了如下两点。
+
+1. 在实际生产ä¸ï¼Œå¯¹äºŽå�Œä¸€ä¸ª Topic,å�¯èƒ½æœ‰ Aã€�Bã€�C ç‰ N 个消费方想è¦�消费。比如一份用户点击日志,A 消费方想用æ�¥å�šä¸€ä¸ªç”¨æˆ·è¿‘ N 天点击过哪些商å“�ï¼›B 消费方想用æ�¥å�šä¸€ä¸ªç”¨æˆ·è¿‘ N 天点击过å‰� TopN 个相似的商å“�ï¼›C 消费方想用æ�¥å�šä¸€ä¸ªæ ¹æ�®ç”¨æˆ·ç‚¹å‡»è¿‡çš„商å“�推è��相关周边的商å“�需求。对于多应用场景,就å�¯ä»¥ä½¿ç”¨æ¶ˆè´¹ç»„æ�¥éš”离ä¸�å�Œçš„业务使用场景,从而达到一个 Topic å�¯ä»¥è¢«å¤šä¸ªæ¶ˆè´¹ç»„é‡�å¤�消费的目的。
+2. 消费组与 Partition çš„æ¶ˆè´¹è¿›åº¦ç»‘å®šã€‚å½“æœ‰æ–°çš„æ¶ˆè´¹è€…åŠ å…¥æˆ–è€…æœ‰æ¶ˆè´¹è€…ä»Žæ¶ˆè´¹ç»„é€€å‡ºæ—¶ï¼Œä¼šè§¦å�‘消费组的 Repartition æ“�作(å�Žé�¢ä¼šè¯¦ç»†ä»‹ç»� Repartition);在 Repartition å‰�,Partition1 被消费组的消费者 A 进行消费,Repartition å�Žï¼ŒPartition1 消费组的消费者 B 进行消费,为了é�¿å…�消æ�¯è¢«é‡�å¤�消费,需è¦�从消费组记录的 Partition 消费进度读å�–当å‰�消费到的ä½�置(å�³ OffSet ä½�置),然å�Žåœ¨ç»§ç»æ¶ˆè´¹ï¼Œä»Žè€Œè¾¾åˆ°æ¶ˆè´¹è€…的平滑è¿�移,å�Œæ—¶ä¹Ÿæ��高了系统的å�¯ç”¨æ€§ã€‚
+
+## **Repartition 触�时机**
+
+使用过 Kafka 消费者客户端的å�Œå¦è‚¯å®šçŸ¥é�“,消费者组内å�¶å°”会触å�‘ Repartition æ“�作,所谓 Repartition å�³ Partition 在æŸ�些情况下é‡�新被分é…�ç»™å�‚与消费的消费者。基本å�¯ä»¥åˆ†ä¸ºå¦‚ä¸‹å‡ ç§�情况。
+
+1. 消费组内�消费者宕机,触� Repartition �作,如下图所示。
+
+
+
+
+
+
+消费者宕机情况
+
+
+
+2\. 消费组内新增消费者,触å�‘ Repartition æ“�作,如下图所示。一般这ç§�情况是为了æ��é«˜æ¶ˆè´¹ç«¯çš„æ¶ˆè´¹èƒ½åŠ›ï¼Œä»Žè€ŒåŠ å¿«æ¶ˆè´¹è¿›åº¦ã€‚
+
+
+
+
+
+
+新增消费者情况
+
+
+
+3.Topic 下的 Partition 增多,触å�‘ Repartition æ“�作,如下图所示。一般这ç§�调整 Partition 个数的情况也是为了æ��é«˜æ¶ˆè´¹ç«¯æ¶ˆè´¹é€Ÿåº¦çš„ï¼Œå› ä¸ºå½“æ¶ˆè´¹è€…ä¸ªæ•°å¤§äºŽç‰äºŽ Partition ä¸ªæ•°æ—¶ï¼Œåœ¨å¢žåŠ æ¶ˆè´¹è€…ä¸ªæ•°æ˜¯æ²¡æœ‰ç”¨çš„ï¼ˆåŽŸå› æ˜¯ï¼šåœ¨ä¸€ä¸ªæ¶ˆè´¹ç»„å†…ï¼Œæ¶ˆè´¹è€…:Partition = 1:N,当 N å°�于 1 时,相当于消费者过剩了),所以一方é�¢å¢žåŠ Partition 个数å�Œæ—¶å¢žåŠ æ¶ˆè´¹è€…ä¸ªæ•°å�¯ä»¥æ��高消费端的消费速度。
+
+
+
+
+
+
+新增Partition个数情况
+
+
+
+## **消费者与 ZK 的关系**
+
+众所周知,ZK ä¸�ä»…ä¿�å˜äº†æ¶ˆè´¹è€…消费 partition 的进度,å�Œæ—¶ä¹Ÿä¿�å˜äº†æ¶ˆè´¹ç»„çš„æˆ�员列表ã€�partition 的所有者。消费者想è¦�消费 Partition,需è¦�从 ZK ä¸èŽ·å�–该消费者对应的分区信æ�¯å�Šå½“å‰�分区对应的消费进度,å�³ OffSert ä¿¡æ�¯ã€‚那么 Partition åº”è¯¥ç”±é‚£ä¸ªæ¶ˆè´¹è€…è¿›è¡Œæ¶ˆè´¹ï¼Œå†³å®šå› ç´ æœ‰å“ªäº›å‘¢ï¼Ÿä»Žä¹‹å‰�的图ä¸ä¸�难得出,两个é‡�è¦�å› ç´ åˆ†åˆ«æ˜¯ï¼šæ¶ˆè´¹ç»„ä¸å˜æ´»çš„æ¶ˆè´¹è€…列表和 Topic 对应的 Partition åˆ—è¡¨ã€‚é€šè¿‡è¿™ä¸¤ä¸ªå› ç´ ç»“å�ˆ Partition 分é…�算法,å�³å�¯å¾—出消费者与 Partition 的对应关系,然å�Žå°†ä¿¡æ�¯å˜å‚¨åˆ° ZK ä¸ã€‚Kafka 有高级 API 和低级 API,如果ä¸�需è¦�æ“�作 OffSet å��ç§»é‡�çš„æ��交,å�¯é€šè¿‡é«˜çº§ API 直接使用,从而é™�低使用者的难度。对于一些比较特殊的使用场景,比如想è¦�消费特定 Partition 的信æ�¯ï¼ŒKafka 也æ��供了低级 API å�¯è¿›è¡Œæ‰‹åЍæ“�作。
+
+## **消费端工作�程**
+
+在介�消费端工作�程�,先�熟悉一下用到的一些组件。
+
+* `KakfaConsumer`:消费端,用于�动消费者进程�消费消�。
+* `ConsumerConfig`:消费端é…�置管ç�†ï¼Œç”¨äºŽç»™æ¶ˆè´¹ç«¯é…�置相关å�‚数,比如指定 Kafka 集群,设置自动æ��交和自动æ��交时间间隔ç‰ç‰å�‚数,都由其æ�¥ç®¡ç�†ã€‚
+* `ConsumerConnector`:消费者连接器,通过消费者连接器�以获得 Kafka 消��,然�通过消��就能获得消�从而使得客户端开始消费消�。
+
+以上三者之间的关系å�¯ä»¥æ¦‚括为:消费端使用消费者é…�置管ç�†åˆ›å»ºå‡ºäº†æ¶ˆè´¹è€…è¿žæŽ¥å™¨ï¼Œé€šè¿‡æ¶ˆè´¹è€…è¿žæŽ¥å™¨åˆ›å»ºé˜Ÿåˆ—ï¼ˆè¿™ä¸ªé˜Ÿåˆ—çš„ä½œç”¨ä¹Ÿæ˜¯ä¸ºäº†ç¼“å˜æ•°æ�®ï¼‰ï¼Œå…¶ä¸é˜Ÿåˆ—ä¸çš„æ¶ˆæ�¯ç”±ä¸“门的拉å�–线程从æœ�务端拉å�–ç„¶å�Žå†™å…¥ï¼Œæœ€å�Žç”±æ¶ˆè´¹è€…客户端轮询队列ä¸çš„æ¶ˆæ�¯è¿›è¡Œæ¶ˆè´¹ã€‚具体æ“�作æµ�程如下图所示。
+
+
+
+
+
+
+消费端工作�程
+
+
+
+我们在从消费者与 ZK 的角度æ�¥çœ‹çœ‹å…¶å·¥ä½œæµ�ç¨‹æ˜¯ä»€ä¹ˆæ ·çš„ï¼Ÿ
+
+
+
+
+
+
+消费端与ZK之间的工作�程
+
+
+
+从上图å�¯ä»¥çœ‹å‡ºï¼Œé¦–先拉å�–线程æ¯�拉å�–一次消æ�¯ï¼Œå�Œæ¥æ›´æ–°ä¸€æ¬¡æ‹‰å�–状æ€�,其作用是为了下一次拉å�–消æ�¯æ—¶èƒ½å¤Ÿæ‹‰å�–到最新产生的消æ�¯ï¼›æ‹‰å�–线程将拉å�–到的消æ�¯å†™å…¥åˆ°é˜Ÿåˆ—ä¸ç‰å¾…消费消费线程去真æ£è¯»å�–处ç�†ã€‚消费线程以轮询的方å¼�æŒ�ç»è¯»å�–队列ä¸çš„æ¶ˆæ�¯ï¼Œå�ªè¦�å�‘çŽ°é˜Ÿåˆ—ä¸æœ‰æ¶ˆæ�¯å°±å¼€å§‹æ¶ˆè´¹ï¼Œæ¶ˆè´¹å®Œæ¶ˆæ�¯å�Žæ›´æ–°æ¶ˆè´¹è¿›åº¦ï¼Œæ¤å¤„需è¦�注æ„�的是,消费线程ä¸�是æ¯�次都和 ZK å�Œæ¥æ¶ˆè´¹è¿›åº¦ï¼Œè€Œæ˜¯å°†æ¶ˆè´¹è¿›åº¦æš‚æ—¶å†™å…¥æœ¬åœ°ã€‚è¿™æ ·å�šçš„目的是为了å‡�少消费者与 ZK 的频ç¹�å�Œæ¥æ¶ˆæ�¯ï¼Œä»Žè€Œé™�低 ZK 的压力。
+
+## **消费者的三�消费情况**
+
+消费者从�务端的 Partition 上拉�到消�,消费消�有三�情况,分别如下:
+
+1. 至少一次。�一�消�至少被消费一次,消���能丢失,但是�能会被��消费。
+2. 至多一次。�一�消�最多�以被消费一次,消���能被��消费,但是消�有�能丢失。
+3. æ£å¥½ä¸€æ¬¡ã€‚å�³ä¸€æ�¡æ¶ˆæ�¯æ£å¥½è¢«æ¶ˆè´¹ä¸€æ¬¡ï¼Œæ¶ˆæ�¯ä¸�å�¯èƒ½ä¸¢å¤±ä¹Ÿä¸�å�¯èƒ½è¢«é‡�å¤�消费。
+
+### **1.至少一次**
+
+消费者读å�–消æ�¯ï¼Œå…ˆå¤„ç�†æ¶ˆæ�¯ï¼Œåœ¨ä¿�å˜æ¶ˆè´¹è¿›åº¦ã€‚消费者拉å�–到消æ�¯ï¼Œå…ˆæ¶ˆè´¹æ¶ˆæ�¯ï¼Œç„¶å�Žåœ¨ä¿�å˜å��ç§»é‡�,当消费者消费消æ�¯å�Žè¿˜æ²¡æ�¥å¾—å�Šä¿�å˜å��ç§»é‡�ï¼Œåˆ™ä¼šé€ æˆ�消æ�¯è¢«é‡�å¤�消费。如下图所示:
+
+
+
+
+
+
+先消费å�Žä¿�å˜æ¶ˆè´¹è¿›åº¦
+
+
+
+### **2.至多一次**
+
+消费者读å�–消æ�¯ï¼Œå…ˆä¿�å˜æ¶ˆè´¹è¿›åº¦ï¼Œåœ¨å¤„ç�†æ¶ˆæ�¯ã€‚消费者拉å�–到消æ�¯ï¼Œå…ˆä¿�å˜äº†å��ç§»é‡�,当ä¿�å˜äº†å��ç§»é‡�å�Žè¿˜æ²¡æ¶ˆè´¹å®Œæ¶ˆæ�¯ï¼Œæ¶ˆè´¹è€…æŒ‚äº†ï¼Œåˆ™ä¼šé€ æˆ�未消费的消æ�¯ä¸¢å¤±ã€‚如下图所示:
+
+
+
+
+
+
+å…ˆä¿�å˜æ¶ˆè´¹è¿›åº¦å�Žæ¶ˆè´¹æ¶ˆæ�¯
+
+
+
+### **3.æ£å¥½ä¸€æ¬¡**
+
+æ£å¥½æ¶ˆè´¹ä¸€æ¬¡çš„办法å�¯ä»¥é€šè¿‡å°†æ¶ˆè´¹è€…的消费进度和消æ�¯å¤„ç�†ç»“æžœä¿�å˜åœ¨ä¸€èµ·ã€‚å�ªè¦�能ä¿�è¯�两个æ“�作是一个原å�æ“�作,就能达到æ£å¥½æ¶ˆè´¹ä¸€æ¬¡çš„目的。通常å�¯ä»¥å°†ä¸¤ä¸ªæ“�作ä¿�å˜åœ¨ä¸€èµ·ï¼Œæ¯”如 HDFS ä¸ã€‚æ£å¥½æ¶ˆè´¹ä¸€æ¬¡æµ�程如下图所示。
+
+
+
+
+
+
+æ£å¥½æ¶ˆè´¹ä¸€æ¬¡
+
+
+
+## Partition�Replica�Log 和 LogSegment 的关系
+
+�设有一个 Kafka 集群,Broker 个数为 3,Topic 个数为 1,Partition 个数为 3,Replica 个数为 2。Partition 的物�分布如下图所示。
+
+
+
+
+
+
+Partition分布图
+
+
+
+从上图å�¯ä»¥çœ‹å‡ºï¼Œè¯¥ Topic 由三个 Partition æž„æˆ�,并且æ¯�个 Partition 由主从两个副本构æˆ�。æ¯�个 Partition 的主从副本分布在ä¸�å�Œçš„ Broker 上,通过这点也å�¯ä»¥çœ‹å‡ºï¼Œå½“æŸ�个 Broker 宕机时,å�¯ä»¥å°†åˆ†å¸ƒåœ¨å…¶ä»– Broker ä¸Šçš„ä»Žå‰¯æœ¬è®¾ç½®ä¸ºä¸»å‰¯æœ¬ï¼Œå› ä¸ºå�ªæœ‰ä¸»å‰¯æœ¬å¯¹å¤–æ��供读写请求,当然在最新的 2.x 版本ä¸ä»Žå‰¯æœ¬ä¹Ÿå�¯ä»¥å¯¹å¤–读请求了。将主从副本分布在ä¸�å�Œçš„ Broker 上从而æ��高系统的å�¯ç”¨æ€§ã€‚
+
+Partition 的实际物ç�†å˜å‚¨æ˜¯ä»¥ Log 文件的形å¼�展示的,而æ¯�个 Log 文件å�ˆä»¥å¤šä¸ª LogSegment 组æˆ�。Kafka 为什么è¦�è¿™ä¹ˆè®¾è®¡å‘¢ï¼Ÿå…¶å®žåŽŸå› æ¯”è¾ƒç®€å�•,éš�ç�€æ¶ˆæ�¯çš„ä¸�æ–写入,Log 文件肯定是越æ�¥è¶Šå¤§ï¼ŒKafka 为了方便管ç�†ï¼Œå°†ä¸€ä¸ªå¤§æ–‡ä»¶åˆ‡å‰²æˆ�一个一个的 LogSegment æ�¥è¿›è¡Œç®¡ç�†ï¼›æ¯�个 LogSegment 由数æ�®æ–‡ä»¶å’Œç´¢å¼•文件构æˆ�,数æ�®æ–‡ä»¶æ˜¯ç”¨æ�¥å˜å‚¨å®žé™…的消æ�¯å†…å®¹ï¼Œè€Œç´¢å¼•æ–‡ä»¶æ˜¯ä¸ºäº†åŠ å¿«æ¶ˆæ�¯å†…容的读å�–。
+
+å�¯èƒ½å�ˆæœ‰æœ‹å�‹ä¼šé—®ï¼ŒKafka 本身消费是以 Partition 维度顺åº�消费消æ�¯çš„,ç£�盘在顺åº�读的时候效率很高完全没有必è¦�使用索引啊。其实 Kafka 为了满足一些特殊业务需求,比如è¦�éš�机消费 Partition ä¸çš„æ¶ˆæ�¯ï¼Œæ¤æ—¶å�¯ä»¥å…ˆé€šè¿‡ç´¢å¼•文件快速定ä½�到消æ�¯çš„实际å˜å‚¨ä½�置,然å�Žè¿›è¡Œå¤„ç�†ã€‚
+
+总结一下 Partitionã€�Replicaã€�Log å’Œ LogSegment 之间的关系。消æ�¯æ˜¯ä»¥ Partition 维度进行管ç�†çš„,为了æ��高系统的å�¯ç”¨æ€§ï¼Œæ¯�个 Partition 都å�¯ä»¥è®¾ç½®ç›¸åº”çš„ Replica 副本数,一般在创建 Topic 的时候å�Œæ—¶æŒ‡å®š Replica 的个数;Partition å’Œ Replica 的实际物ç�†å˜å‚¨å½¢å¼�是通过 Log æ–‡ä»¶å±•çŽ°çš„ï¼Œä¸ºäº†é˜²æ¢æ¶ˆæ�¯ä¸�æ–写入,导致 Log 文件大å°�æŒ�ç»å¢žé•¿ï¼Œæ‰€ä»¥å°† Log 切割æˆ�一个一个的 LogSegment 文件。
+
+**注æ„�:** 在å�Œä¸€æ—¶åˆ»ï¼Œæ¯�个主 Partition 䏿œ‰ä¸”å�ªæœ‰ä¸€ä¸ª LogSegment è¢«æ ‡è¯†ä¸ºå�¯å†™å…¥çжæ€�,当一个 LogSegment 文件大å°�超过一定大å°�å�Žï¼ˆæ¯”如当文件大å°�超过 1G,这个就类似于 HDFS å˜å‚¨çš„æ•°æ�®æ–‡ä»¶ï¼ŒHDFS 䏿•°æ�®æ–‡ä»¶è¾¾åˆ° 128M 的时候就会被分出一个新的文件æ�¥å˜å‚¨æ•°æ�®ï¼‰ï¼Œå°±ä¼šæ–°åˆ›å»ºä¸€ä¸ª LogSegment æ�¥ç»§ç»æŽ¥æ”¶æ–°å†™å…¥çš„æ¶ˆæ�¯ã€‚
+
+## 写入消��程分�
+
+
+
+
+
+
+消�写入��盘�程
+
+
+
+�程解�
+
+在第 3 ç¯‡æ–‡ç« è®²è¿‡ï¼Œç”Ÿäº§è€…å®¢æˆ·ç«¯å¯¹äºŽæ¯�个 Partition 一次会å�‘é€�一批消æ�¯åˆ°æœ�务端,æœ�务端收到一批消æ�¯å�Žå†™å…¥ç›¸åº”çš„ Partition 上。上图æµ�程主è¦�åˆ†ä¸ºå¦‚ä¸‹å‡ æ¥ï¼š
+
+1. **客户端消æ�¯æ”¶é›†å™¨æ”¶é›†å±žäºŽå�Œä¸€ä¸ªåˆ†åŒºçš„æ¶ˆæ�¯ï¼Œå¹¶å¯¹æ¯�æ�¡æ¶ˆæ�¯è®¾ç½®ä¸€ä¸ªå��ç§»é‡�,且æ¯�一批消æ�¯æ€»æ˜¯ä»Ž 0 开始å�•调递增。比如第一次å�‘é€� 3 æ�¡æ¶ˆæ�¯ï¼Œåˆ™å¯¹ä¸‰æ�¡æ¶ˆæ�¯ä¾�次编å�· [0,1,2],第二次å�‘é€� 4 æ�¡æ¶ˆæ�¯ï¼Œåˆ™æ¶ˆæ�¯ä¾�次编å�·ä¸º [0,1,2,3]。注æ„�æ¤å¤„设置的消æ�¯å��ç§»é‡�是相对å��ç§»é‡�。**
+2. **客户端将消æ�¯å�‘é€�ç»™æœ�务端,æœ�务端拿到下一æ�¡æ¶ˆæ�¯çš„ç»�对å��ç§»é‡�ï¼Œå°†ä¼ åˆ°æœ�务端的这批消æ�¯çš„相对å��ç§»é‡�修改æˆ�ç»�对å��ç§»é‡�。**
+3. **将修改å�Žçš„æ¶ˆæ�¯ä»¥è¿½åŠ çš„æ–¹å¼�è¿½åŠ åˆ°å½“å‰�活跃的 LogSegment å�Žé�¢ï¼Œç„¶å�Žæ›´æ–°ç»�对å��ç§»é‡�。**
+4. **将消�集写入到文件通�。**
+5. **文件通�将消�集 flush 到�盘,完�消�的写入�作。**
+
+了解以上过程�,我们在�看看消�的具体构�情况。
+
+
+
+
+
+
+消�构�细节图
+
+
+
+一�消�由如下三部分构�:
+
+* **OffSet:å��ç§»é‡�,消æ�¯åœ¨å®¢æˆ·ç«¯å�‘é€�å‰�将相对å��ç§»é‡�å˜å‚¨åˆ°è¯¥ä½�置,当消æ�¯å˜å‚¨åˆ° LogSegment å‰�,先将其修改为ç»�对å��ç§»é‡�在写入ç£�盘。**
+* **Size:本� Message 的内容大�**
+* **Message:消æ�¯çš„具体内容,其具体å�ˆç”± 7 部分组æˆ�,crc ç”¨äºŽæ ¡éªŒæ¶ˆæ�¯ï¼ŒAttribute 代表了属性,key-length å’Œ value-length 分别代表 key å’Œ value 的长度,key å’Œ value 分别代表了其对应的内容。**
+
+### 消��移�的计算过程
+
+通过以上æµ�程å�¯ä»¥çœ‹å‡ºï¼Œæ¯�æ�¡æ¶ˆæ�¯åœ¨è¢«å®žé™…å˜å‚¨åˆ°ç£�盘时都会被分é…�一个ç»�对å��ç§»é‡�å�Žæ‰�能被写入ç£�盘。在å�Œä¸€ä¸ªåˆ†åŒºå†…,消æ�¯çš„ç»�对å��ç§»é‡�都是从 0 开始,且å�•调递增;在ä¸�å�Œåˆ†åŒºå†…,消æ�¯çš„ç»�对å��ç§»é‡�是没有任何关系的。接下æ�¥è®¨è®ºä¸‹æ¶ˆæ�¯çš„ç»�对å��ç§»é‡�的计算规则。
+
+确定消æ�¯å��ç§»é‡�有两ç§�æ–¹å¼�,一ç§�是顺åº�读å�–æ¯�一æ�¡æ¶ˆæ�¯æ�¥ç¡®å®šï¼Œæ¤ç§�æ–¹å¼�代价比较大,实际上我们并ä¸�想知é�“消æ�¯çš„内容,而å�ªæ˜¯æƒ³çŸ¥é�“消æ�¯çš„å��ç§»é‡�;第二ç§�是读å�–æ¯�æ�¡æ¶ˆæ�¯çš„ Size 属性,然å�Žè®¡ç®—出下一æ�¡æ¶ˆæ�¯çš„èµ·å§‹å��ç§»é‡�。比如第一æ�¡æ¶ˆæ�¯å†…容为 “abcâ€�,写入ç£�盘å�Žçš„å��ç§»é‡�为:8(OffSet)+ 4(Message 大å°�)+ 3(Message 内容的长度)= 15。第二æ�¡å†™å…¥çš„æ¶ˆæ�¯å†…容为“defgâ€�,其起始å��ç§»é‡�为 15,下一æ�¡æ¶ˆæ�¯çš„èµ·å§‹å��ç§»é‡�应该是:15+8+4+4=31,以æ¤ç±»æŽ¨ã€‚
+
+## 消费消æ�¯å�Šå‰¯æœ¬å�Œæ¥æµ�程分æž�
+
+和写入消æ�¯æµ�程ä¸�å�Œï¼Œè¯»å�–消æ�¯æµ�程分为两ç§�情况,分别是消费端消费消æ�¯å’Œä»Žå‰¯æœ¬ï¼ˆå¤‡ä»½å‰¯æœ¬ï¼‰å�Œæ¥ä¸»å‰¯æœ¬çš„æ¶ˆæ�¯ã€‚在开始分æž�读å�–æµ�程之å‰�,需è¦�å…ˆæ˜Žç™½å‡ ä¸ªç”¨åˆ°çš„å�˜é‡�,ä¸�ç„¶æµ�程分æž�å�¯èƒ½ä¼šçœ‹çš„æ¯”较糊涂。
+
+* **BaseOffSet**:基准å��ç§»é‡�,æ¯�个 Partition ç”± N 个 LogSegment 组æˆ�,æ¯�个 LogSegment 都有基准å��ç§»é‡�,大概由如下构æˆ�ï¼Œæ•°ç»„ä¸æ¯�个数代表一个 LogSegment 的基准å��ç§»é‡�:[0,200,400,600, ...]。
+* **StartOffSet**:起始�移�,由消费端�起读�消�请求时,指定从哪个�置开始消费消�。
+* **MaxLength**:拉�大�,由消费端�起读�消�请求时,指定本次最大拉�消�内容的数�大�。该�数�以通过[max.partition.fetch.bytes](https://link.zhihu.com/?target=https%3A//xie.infoq.cn/draft/3020%23)�指定,默认大�为 1M。
+* **MaxOffSet**:最大å��ç§»é‡�,消费端拉å�–消æ�¯æ—¶ï¼Œæœ€é«˜å�¯æ‹‰å�–消æ�¯çš„ä½�置,å�³ä¿—称的“高水ä½�â€�。该å�‚æ•°ç”±æœ�务端指定,其作用是为了防æ¢ç”Ÿäº§ç«¯è¿˜æœªå†™å…¥çš„æ¶ˆæ�¯å°±è¢«æ¶ˆè´¹ç«¯è¿›è¡Œæ¶ˆè´¹ã€‚æ¤å�‚数对于从副本å�Œæ¥ä¸»å‰¯æœ¬ä¸�会用到。
+* **MaxPosition**:LogSegment 的最大�置,确定了起始�移�在�个 LogSegment 上开始,读� MaxLength �,�能超过 MaxPosition。MaxPosition 是一个实际的物��置,而��移�。
+
+å�‡è®¾æ¶ˆè´¹ç«¯ä»Ž 000000621 ä½�置开始消费消æ�¯ï¼Œå…³äºŽå‡ 个å�˜é‡�的关系如下图所示。
+
+
+
+
+
+
+�置关系图
+
+
+
+消费端和从副本拉��程如下:
+
+1. **客户端确定拉�的�置,� StartOffSet 的值,找到主副本对应的 LogSegment。**
+2. **LogSegment 由索引文件和数æ�®æ–‡ä»¶æž„æˆ�,由于索引文件是从å°�到大排列的,首先从索引文件确定一个å°�于ç‰äºŽ StartOffSet 最近的索引ä½�置。**
+3. **æ ¹æ�®ç´¢å¼•ä½�置找到对应的数æ�®æ–‡ä»¶ä½�置,由于数æ�®æ–‡ä»¶ä¹Ÿæ˜¯ä»Žå°�到大排列的,从找到的数æ�®æ–‡ä»¶ä½�置顺åº�å�‘å�Žé��历,直到找到和 StartOffSet 相ç‰çš„ä½�置,å�³ä¸ºæ¶ˆè´¹æˆ–拉å�–消æ�¯çš„ä½�置。**
+4. **从 StartOffSet 开始��拉� MaxLength 大�的数�,返回给消费端或者从副本进行消费或备份�作。**
+
+�设拉�消�起始�置为 00000313,消�拉��程图如下:
+
+
+
+
+
+
+消�拉��程图
+
+
+
+## kafka 如何ä¿�è¯�系统的高å�¯ç”¨ã€�æ•°æ�®çš„å�¯é� 性和数æ�®çš„一致性的?
+
+### kafka 的高�用性:
+
+1. **Kafka 本身是一个分布å¼�系统,å�Œæ—¶é‡‡ç”¨äº† Zookeeper å˜å‚¨å…ƒæ•°æ�®ä¿¡æ�¯ï¼Œæ��高了系统的高å�¯ç”¨æ€§ã€‚**
+2. **Kafka 使用多副本机制,当状æ€�为 Leader çš„ Partition 对应的 Broker 宕机或者网络异常时,Kafka 会通过选举机制从对应的 Replica 列表ä¸é‡�新选举出一个 Replica 当å�š Leader,从而继ç»å¯¹å¤–æ��供读写æœ�务(当然,需è¦�注æ„�的一点是,在新版本的 Kafka ä¸ï¼ŒReplica 也å�¯ä»¥å¯¹å¤–æ��供读请求了),利用多副本机制在一定程度上æ��高了系统的容错性,从而æ��å�‡äº†ç³»ç»Ÿçš„高å�¯ç”¨ã€‚**
+
+### Kafka çš„å�¯é� 性:
+
+1. **从 Producer 端æ�¥çœ‹ï¼Œå�¯é� 性是指生产的消æ�¯èƒ½å¤Ÿæ£å¸¸çš„被å˜å‚¨åˆ° Partition 上且消æ�¯ä¸�会丢失。Kafka 通过 [request.required.acks](https://link.zhihu.com/?target=https%3A//xie.infoq.cn/edit/49a133ad2b2f2671aa60706b0%23)å’Œ[min.insync.replicas](https://link.zhihu.com/?target=https%3A//xie.infoq.cn/edit/49a133ad2b2f2671aa60706b0%23) 两个å�‚æ•°é…�å�ˆï¼Œåœ¨ä¸€å®šç¨‹åº¦ä¸Šä¿�è¯�消æ�¯ä¸�会丢失。**
+2. **[request.required.acks](https://link.zhihu.com/?target=https%3A//xie.infoq.cn/edit/49a133ad2b2f2671aa60706b0%23) �设置为 1�0�-1 三�情况。**
+
+
+
+
+
+
+request.required.acks=1
+
+
+
+设置为 1 时代表当 Leader 状æ€�çš„ Partition 接收到消æ�¯å¹¶æŒ�久化时就认为消æ�¯å�‘é€�æˆ�功,如果 ISR 列表的 Replica 还没æ�¥å¾—å�Šå�Œæ¥æ¶ˆæ�¯ï¼ŒLeader 状æ€�çš„ Partition 对应的 Broker 宕机,则消æ�¯æœ‰å�¯èƒ½ä¸¢å¤±ã€‚
+
+
+
+
+
+
+request.required.acks=0
+
+
+
+设置为 0 时代表 Producer ��消��就认为�功,消�有�能丢失。
+
+
+
+
+
+
+request.required.acks=-1
+
+
+
+设置为-1 时,代表 ISR 列表ä¸çš„æ‰€æœ‰ Replica 将消æ�¯å�Œæ¥å®Œæˆ�å�Žæ‰�认为消æ�¯å�‘é€�æˆ�功;但是如果å�ªå˜åœ¨ä¸» Partition 的时候,Broker 异常时å�Œæ ·ä¼šå¯¼è‡´æ¶ˆæ�¯ä¸¢å¤±ã€‚æ‰€ä»¥æ¤æ—¶å°±éœ€è¦�[min.insync.replicas](https://link.zhihu.com/?target=https%3A//xie.infoq.cn/edit/49a133ad2b2f2671aa60706b0%23)å�‚æ•°çš„é…�å�ˆï¼Œè¯¥å�‚数需è¦�设定值大于ç‰äºŽ 2,当 Partition 的个数å°�于设定的值时,Producer å�‘é€�消æ�¯ä¼šç›´æŽ¥æŠ¥é”™ã€‚
+
+上é�¢è¿™ä¸ªè¿‡ç¨‹çœ‹ä¼¼å·²ç»�很完美了,但是å�‡è®¾å¦‚果消æ�¯åœ¨å�Œæ¥åˆ°éƒ¨åˆ†ä»Ž Partition 上时,主 Partition å®•æœºï¼Œæ¤æ—¶æ¶ˆæ�¯ä¼šé‡�ä¼ ï¼Œè™½ç„¶æ¶ˆæ�¯ä¸�ä¼šä¸¢å¤±ï¼Œä½†æ˜¯ä¼šé€ æˆ�å�Œä¸€æ�¡æ¶ˆæ�¯ä¼šå˜å‚¨å¤šæ¬¡ã€‚åœ¨æ–°ç‰ˆæœ¬ä¸ Kafka æ��å‡ºäº†å¹‚ç‰æ€§çš„æ¦‚念,通过给æ¯�æ�¡æ¶ˆæ�¯è®¾ç½®ä¸€ä¸ªå”¯ä¸€ ID,并且该 ID å�¯ä»¥å”¯ä¸€æ˜ 射到 Partition 的一个固定ä½�置,从而é�¿å…�消æ�¯é‡�å¤�å˜å‚¨çš„问题(作者到目å‰�还没有使用过该特性,感兴趣的朋å�‹å�¯ä»¥è‡ªè¡Œåœ¨æ·±å…¥ç ”究一下)。
+
+### Kafka 的一致性:
+
+1. **从 Consumer 端�看,�一�消�在多个 Partition 上读�到的消�是一直的,Kafka 通过引入 HW(High Water)�实现这一特性。**
+
+
+
+
+
+
+消æ�¯å�Œæ¥å›¾
+
+
+
+从上图å�¯ä»¥çœ‹å‡ºï¼Œå�‡è®¾ Consumer 从主 Partition1 上消费消æ�¯ï¼Œç”±äºŽ Kafka 规定å�ªå…�许消费 HW 之å‰�的消æ�¯ï¼Œæ‰€ä»¥æœ€å¤šæ¶ˆè´¹åˆ° Message2。å�‡è®¾å½“ Partition1 异常å�Žï¼ŒPartition2 被选举为 Leaderï¼Œæ¤æ—¶ä¾�æ—§å�¯ä»¥ä»Ž Partition2 上读å�–到 Message2。其实 HW çš„æ„�æ€�利用了木桶效应,始终ä¿�æŒ�æœ€çŸæ�¿çš„那个ä½�置。
+
+从上é�¢æˆ‘们也å�¯ä»¥çœ‹å‡ºï¼Œä½¿ç”¨ HW 特性å�Žä¼šä½¿å¾—消æ�¯å�ªæœ‰è¢«æ‰€æœ‰å‰¯æœ¬å�Œæ¥å�Žæ‰�能被消费,所以在一定程度上é™�低了消费端的性能,å�¯ä»¥é€šè¿‡è®¾ç½®[replica.lag.time.max.ms](https://link.zhihu.com/?target=https%3A//xie.infoq.cn/edit/49a133ad2b2f2671aa60706b0%23)å�‚æ•°æ�¥ä¿�è¯�消æ�¯å�Œæ¥çš„æœ€å¤§æ—¶é—´ã€‚
+
+## kafka 为什么那么快?
+
+kafka 使用了顺�写入和“零拷��技术,�达到�秒钟 200w(Apache 官方给出的数�) 的�盘数�写入�,�外 Kafka 通过压缩数�,�低 I/O 的负担。
+
+1. **顺�写入**
+
+大家都知�,对于�盘而已,如果是�机写入数�的�,�次数�在写入时�先进行寻��作,该�作是通过移动�头完�的,�其耗费时间,而顺�读写就能够��该�作。
+
+1. **“零拷��技术**
+
+
+
+
+
+
+普通数�拷��程图
+
+
+
+普通的数æ�®æ‹·è´�æµ�程如上图所示,数æ�®ç”±ç£�盘 copy åˆ°å†…æ ¸æ€�,然å�Žåœ¨æ‹·è´�到用户æ€�,然å�Žå†�由用户æ€�æ‹·è´�到 socket,然å�Žç”± socket å��议引擎,最å�Žç”±å��议引擎将数æ�®å�‘é€�到网络ä¸ã€‚
+
+
+
+
+
+
+"零拷�"�程图
+
+
+
+采用了“零拷è´�â€�技术å�Žå�¯ä»¥çœ‹å‡ºï¼Œæ•°æ�®ä¸�在ç»�过用户æ€�ä¼ è¾“ï¼Œè€Œæ˜¯ç›´æŽ¥åœ¨å†…æ ¸æ€�完æˆ�æ“�作,å‡�少了两次 copy æ“�作。从而大大æ��高了数æ�®ä¼ 输速度。
+
+1. **压缩**
+
+Kafka 官方æ��供了多ç§�压缩å��议,包括 gzipã€�snappyã€�lz4 ç‰ç‰ï¼Œä»Žè€Œé™�低了数æ�®ä¼ 输的æˆ�本。
+
+## Kafka ä¸çš„æ¶ˆæ�¯æ˜¯å�¦ä¼šä¸¢å¤±å’Œé‡�å¤�消费?
+
+1. **Kafka 是å�¦ä¼šä¸¢æ¶ˆæ�¯ï¼Œç”案相信仔细看过å‰�é�¢ä¸¤ä¸ªé—®é¢˜çš„å�Œå¦éƒ½æ¯”较清楚了,这里就ä¸�在赘述了。**
+2. **在低版本ä¸ï¼Œæ¯”如作者公å�¸åœ¨ä½¿ç”¨çš„ Kafka0.8 版本ä¸ï¼Œè¿˜æ²¡æœ‰å¹‚ç‰æ€§çš„特性的时候,消æ�¯æœ‰å�¯èƒ½ä¼šé‡�å¤�被å˜å‚¨åˆ° Kafka ä¸Šï¼ˆåŽŸå› è§�上一个问题的),在这ç§�情况下消æ�¯è‚¯å®šæ˜¯ä¼šè¢«é‡�å¤�消费的。**
+
+**这里给大家一个解决é‡�å¤�消费的æ€�路,作者公å�¸ä½¿ç”¨äº† Redis 记录了被消费的 key,并设置了过期时间,在 key 还没有过期内,对于å�Œä¸€ä¸ª key 的消æ�¯å…¨éƒ¨å½“å�šé‡�å¤�消æ�¯ç›´æŽ¥æŠ›å¼ƒæŽ‰ã€‚** 在网上看到过å�¦å¤–一ç§�解决方案,使用 HDFS å˜å‚¨è¢«æ¶ˆè´¹è¿‡çš„æ¶ˆæ�¯ï¼Œæ˜¯å�¦å…·æœ‰å�¯è¡Œæ€§å˜ç–‘(需è¦�读者朋å�‹è‡ªè¡ŒæŽ¢ç´¢ï¼‰ï¼Œè¯»è€…朋å�‹ä»¬å�¯ä»¥æ ¹æ�®è‡ªå·±çš„实际情况选择相应的ç–略,如果朋å�‹ä»¬è¿˜æœ‰å…¶ä»–比较好的方案,欢迎留言交æµ�。
+
+## 为什么�使用 kafka,为什么�使用消�队列?
+
+### 先�说说为什么�使用消�队列?
+
+è¿™é�“é¢˜æ¯”è¾ƒä¸»è§‚ä¸€äº›ï¼ˆè‡ªè®¤ä¸ºæ²¡æœ‰ç½‘ä¸Šå…¶ä»–æ–‡ç« å†™å¾—è¯�,轻喷),但是都相信大家使用消æ�¯é˜Ÿåˆ—æ— é�žå°±æ˜¯ä¸ºäº† **解耦**ã€�**异æ¥**ã€�**消峰**。
+
+
+
+
+
+
+系统调用图
+
+
+
+éš�ç�€ä¸šåŠ¡çš„å�‘展,相信有ä¸�少朋å�‹å…¬å�¸é�‡åˆ°è¿‡å¦‚上图所示的情况,系统 A 处ç�†çš„结构被 Bã€�Cã€�D 系统所ä¾�赖,当新增系统 E 时,也需è¦�系统 A é…�å�ˆè¿›è¡Œè�”è°ƒå’Œä¸Šçº¿ç‰æ“�作;还有当系统 A å�‘生å�˜æ›´æ—¶å�Œæ ·éœ€è¦�告知 Bã€�Cã€�Dã€�E 系统需è¦�å�Œæ¥å�‡çº§æ”¹é€ 。
+
+
+
+
+
+
+引入消�队列图
+
+
+
+引入消�队列�有两个好处:
+
+1. **å�„个系统进行了解耦,从上图也å�¯ä»¥çœ‹å‡ºï¼Œå½“系统 A çª�ç„¶å�‘生çƒç‚¹äº‹ä»¶æ—¶ï¼Œå�Œä¸€æ—¶é—´äº§ç”Ÿå¤§é‡�结果,MQ 充当了消æ�¯æš‚å˜çš„æ•ˆæžœï¼Œé˜²æ¢ Bã€�Cã€�Dã€�E 系统也跟ç�€å´©æºƒã€‚**
+2. **当新系统 E 需è¦�接入系统 A 的数æ�®ï¼Œå�ªéœ€è¦�å’Œ MQ 对接就å�¯ä»¥äº†ï¼Œä»Žè€Œé�¿å…�了与系统 A çš„è°ƒè¯•ä¸Šçº¿ç‰æ“�作。**
+
+引入消�队列的�处:
+
+万事皆具备两é�¢æ€§ï¼Œçœ‹ä¼¼å¼•入消æ�¯é˜Ÿåˆ—这件事情很美好,但是å�Œæ—¶ä¹Ÿå¢žåŠ äº†ç³»ç»Ÿçš„å¤�æ�‚度ã€�系统的维护æˆ�本æ��高(如果 MQ 挂了怎么办)ã€�引入了一致性ç‰ç‰é—®é¢˜éœ€è¦�去解决。
+
+## 为什么�使用 Kafka?
+
+作者认为采用 Kafka çš„åŽŸå› æœ‰å¦‚ä¸‹å‡ ç‚¹ï¼š
+
+1. **Kafka ç›®å‰�在业界被广泛使用,社区活跃度高,版本更新è¿ä»£é€Ÿåº¦ä¹Ÿå¿«ã€‚**
+2. **Kafka 的生产者和消费者都用 Java è¯è¨€è¿›è¡Œäº†é‡�写,在一定程度é™�低了系统的维护æˆ�本(作者的主观æ„�è§�ï¼Œå› ä¸ºå½“ä¸‹ Java 的使用群体相当庞大)。**
+3. **Kafka 系统的���高,达到了�秒 10w 级别的处�速度。**
+4. **Kafka å�¯ä»¥å’Œå¾ˆå¤šå½“下优秀的大数æ�®ç»„件进行集æˆ�,包括 Sparkã€�Flinkã€�Flumeã€�Storm ç‰ç‰ã€‚**
+
+## 为什么 Kafka �支�读写分离?
+
+这个问题有个先决�件,我们�讨论 Kafka0.9 版本的情况。对于高版本,从 Partition 也�以承担读请求了,这里�多赘述。
+
+Kafka 如果支æŒ�读写分离的è¯�ï¼Œæœ‰å¦‚ä¸‹å‡ ä¸ªé—®é¢˜ã€‚
+
+1. **系统设计的��度会比较大,当然这个比较牵强,毕竟高版本的 Kafka 已�实现了。**
+
+
+
+
+
+
+
+
+**2\. 从上图å�¯ä»¥çœ‹å‡ºï¼Œä»Žä»Ž Partition 上读å�–æ•°æ�®ä¼šæœ‰ä¸¤ä¸ªé—®é¢˜ã€‚一ã€�æ•°æ�®ä»Žä¸» Partition 上å�Œæ¥åˆ°ä»Ž Partition 有数æ�®å»¶è¿Ÿé—®é¢˜ï¼Œå› 为数æ�®ä»Žç”Ÿäº§åˆ°æ¶ˆè´¹ä¼šç»�历 3 æ¬¡ç½‘ç»œä¼ è¾“æ‰�能够被消费,对于时效性è¦�求比较高的场景本身就ä¸�适å�ˆäº†ã€‚二ã€�æ•°æ�®ä¸€è‡´æ€§é—®é¢˜ï¼Œå�‡è®¾ä¸» Partition 将数æ�®ç¬¬ä¸€æ¬¡ä¿®æ”¹æˆ�了 A,然å�Žå�ˆå°†è¯¥æ•°æ�®ä¿®æ”¹æˆ�了 B,由于从主 Partition å�Œæ¥åˆ°ä»Ž Partition 会有延迟问题,所以也就会产生数æ�®ä¸€è‡´æ€§é—®é¢˜ã€‚**
+
+分�得出,通过解决以上问题���从 Partition 承担读请求,�本�想而知,而且对于写入压力大,读�压力�的场景,本身也就没有什么�义了。
+
+## 总结
+
+本文介ç»�äº†å‡ ä¸ªå¸¸è§�çš„ Kafka çš„é�¢è¯•题
+
+### 常��试题一览
+
+#### 1.1 Kafka ä¸çš„ ISR(InSyncRepli)ã€� OSR(OutSyncRepli)ã€� AR(AllRepli)代表什么?
+
+ISR:速率和leader相差低于10s的follower的集�
+
+OSR:速率和leader相差大于10s的follwer
+
+AR:所有分区的follower
+
+#### 1.2 Kafka ä¸çš„ HWã€� LEO ç‰åˆ†åˆ«ä»£è¡¨ä»€ä¹ˆï¼Ÿ
+
+HW:High Water高水ä½�ï¼Œæ ¹æ�®å�Œä¸€åˆ†åŒºä¸æœ€ä½Žçš„LEO决定(Log End Offset)
+
+LEO:�个分区最大的Offset
+
+#### 1.3 Kafka 䏿˜¯æ€Žä¹ˆä½“现消æ�¯é¡ºåº�性的?
+
+在æ¯�个分区内,æ¯�æ�¡æ¶ˆæ�¯éƒ½æœ‰offset,所以消æ�¯åœ¨å�Œä¸€åˆ†åŒºå†…有åº�ï¼Œæ— æ³•å�šåˆ°å…¨å±€æœ‰åº�性
+
+#### 1.4 Kafka ä¸çš„分区器ã€�åº�列化器ã€�拦截器是å�¦äº†è§£ï¼Ÿå®ƒä»¬ä¹‹é—´çš„处ç�†é¡ºåº�是什么?
+
+分区器Partitioner用�对分区进行处�的,�消���到哪一个分区的问题。�列化器,这个是对数�进行�列化和��列化的工具。拦截器,�对于消���进行一个��处�和收尾处�的类Interceptor,处�顺利首先通过拦截器=>�列化器=>分区器
+
+#### 1.5 Kafka ç”Ÿäº§è€…å®¢æˆ·ç«¯çš„æ•´ä½“ç»“æž„æ˜¯ä»€ä¹ˆæ ·å�çš„ï¼Ÿä½¿ç”¨äº†å‡ ä¸ªçº¿ç¨‹æ�¥å¤„ç�†ï¼Ÿåˆ†åˆ«æ˜¯ä»€ä¹ˆï¼Ÿ
+
+使用两个线程:mainå’Œsender 线程,main线程会一次ç»�过拦截器ã€�åº�列化器ã€�分区器将数æ�®å�‘é€�到RecoreAccumulator线程共享å�˜é‡�,å†�ç”±sender线程从共享å�˜é‡�䏿‹‰å�–æ•°æ�®å�‘é€�到kafka broker
+
+batch.size达到æ¤è§„模消æ�¯æ‰�å�‘é€�,linger.ms未达到规模,ç‰å¾…当å‰�æ—¶é•¿å°±å�‘é€�æ•°æ�®ã€‚
+
+#### 1.6 消费组ä¸çš„æ¶ˆè´¹è€…个数如果超过 topic 的分区,那么就会有消费者消费ä¸�到数æ�®â€�è¿™å�¥ è¯�是å�¦æ£ç¡®ï¼Ÿ
+
+è¿™å�¥è¯�是对的,超过分区个数的消费者ä¸�会在接收数æ�®ï¼Œä¸»è¦�åŽŸå› æ˜¯ä¸€ä¸ªåˆ†åŒºçš„æ¶ˆæ�¯å�ªèƒ½å¤Ÿè¢«ä¸€ä¸ªæ¶ˆè´¹è€…组ä¸çš„一个消费者消费。
+
+#### 1.7 消费者�交消费�移时�交的是当�消费到的最新消�的 offset 还是 offset+1?
+
+生产者��数�的offset是从0开始的,消费者消费的数�的offset是从1开始,故最新消�是offset+1
+
+#### 1.8 æœ‰å“ªäº›æƒ…å½¢ä¼šé€ æˆ�é‡�å¤�消费?
+
+先消费å�Žæ��交offsetï¼Œå¦‚æžœæ¶ˆè´¹å®Œå®•æœºäº†ï¼Œåˆ™ä¼šé€ æˆ�é‡�å¤�消费
+
+#### 1.9 é‚£äº›æƒ…æ™¯ä¼šé€ æˆ�消æ�¯æ¼�消费?
+
+å…ˆæ��交offsetï¼Œè¿˜æ²¡æ¶ˆè´¹å°±å®•æœºäº†ï¼Œåˆ™ä¼šé€ æˆ�æ¼�消费
+
+#### 1.10 å½“ä½ ä½¿ç”¨ kafka-topics.sh åˆ›å»ºï¼ˆåˆ é™¤ï¼‰äº†ä¸€ä¸ª topic 之å�Žï¼Œ Kafka 背å�Žä¼šæ‰§è¡Œä»€ä¹ˆé€»è¾‘?
+
+会在 zookeeper ä¸çš„/brokers/topics 节点下创建一个新的 topic 节点,如:/brokers/topics/first 触å�‘ Controller 的监å�¬ç¨‹åº� kafka Controller è´Ÿè´£ topic 的创建工作,并更新 metadata cache
+
+#### 1.11 topic 的分区数å�¯ä¸�å�¯ä»¥å¢žåŠ ï¼Ÿå¦‚æžœå�¯ä»¥æ€Žä¹ˆå¢žåŠ ï¼Ÿå¦‚æžœä¸�å�¯ä»¥ï¼Œé‚£å�ˆæ˜¯ä¸ºä»€ä¹ˆï¼Ÿ
+
+å�¯ä»¥å¢žåŠ ï¼Œä¿®æ”¹åˆ†åŒºä¸ªæ•°--alterå�¯ä»¥ä¿®æ”¹åˆ†åŒºä¸ªæ•°
+
+#### 1.12 topic 的分区数���以�少?如果�以怎么�少?如果��以,那�是为什么?
+
+ä¸�å�¯ä»¥å‡�少,å‡�少了分区之å�Žï¼Œä¹‹å‰�的分区ä¸çš„æ•°æ�®ä¸�好处ç�†
+
+#### 1.13 Kafka 有内部的 topic �?如果有是什么?有什么所用?
+
+有,__consumer_offsets主è¦�用æ�¥åœ¨0.9版本以å�Žä¿�å˜æ¶ˆè´¹è€…消费的offset
+
+#### 1.14 Kafka 分区分�的概念?
+
+Kafka分区对于Kafka集群�说,分区�以�到负载�衡,对于消费者�说分区�以�高并�度,�高读�效率
+
+#### 1.15 简述 Kafka 的日志目录结构?
+
+�一个分区对应�一个文件夹,命�为topic-0/topic-1…,�个文件夹内有.index和.log文件。
+
+#### 1.16 如果我指定了一个 offset, Kafka Controller 怎么查找到对应的消�?
+
+offset表示当å‰�消æ�¯çš„ç¼–å�·ï¼Œé¦–å…ˆå�¯ä»¥é€šè¿‡äºŒåˆ†æ³•定ä½�当å‰�消æ�¯å±žäºŽå“ªä¸ª.index文件ä¸ï¼Œéš�å�Žé‡‡ç”¨seek定ä½�的方法查找到当å‰�offset在.indexä¸çš„ä½�ç½®ï¼Œæ¤æ—¶å�¯ä»¥æ‹¿åˆ°åˆ�å§‹çš„å��ç§»é‡�。通过åˆ�å§‹çš„å��ç§»é‡�å†�通过seek定ä½�到.logä¸çš„æ¶ˆæ�¯å�³å�¯æ‰¾åˆ°ã€‚
+
+#### 1.17 �一� Kafka Controller 的作用?
+
+Kafkaé›†ç¾¤ä¸æœ‰ä¸€ä¸ªbroker会被选举为Controller,负责管ç�†é›†ç¾¤broker的上下线ã€�所有topic的分区副本分é…�å’Œleader的选举ç‰å·¥ä½œã€‚Controller的工作管ç�†æ˜¯ä¾�赖于zookeeper的。
+
+#### 1.18 Kafka 䏿œ‰é‚£äº›åœ°æ–¹éœ€è¦�选举?这些地方的选举ç–ç•¥å�ˆæœ‰å“ªäº›ï¼Ÿ
+
+在ISRä¸éœ€è¦�选举出Leader,选择ç–略为先到先得。在分区ä¸éœ€è¦�选举,需è¦�选举出Leaderå’Œfollower。
+
+#### 1.19 失效副本是指什么?有那些应对措施?
+
+失效副本为速率比leader相差大于10sçš„follower,ISR会将这些失效的follower踢出,ç‰é€ŸçŽ‡æŽ¥è¿‘leaderçš„10s内,会é‡�æ–°åŠ å…¥ISR
+
+#### 1.20 Kafka 的哪些设计让它有如æ¤é«˜çš„æ€§èƒ½ï¼Ÿ
+
+1. Kafka天生的分布�架构
+2. 对log文件进行了分segment,并对segment建立了索引
+3. 对于å�•节点使用了顺åº�读写,顺åº�读写是指的文件的顺åº�è¿½åŠ ï¼Œå‡�少了ç£�盘寻å�€çš„开销,相比éš�机写速度æ��å�‡å¾ˆå¤š
+4. 使用了零拷è´�技术,ä¸�需è¦�切æ�¢åˆ°ç”¨æˆ·æ€�ï¼Œåœ¨å†…æ ¸æ€�å�³å�¯å®Œæˆ�读写æ“�作,且数æ�®çš„æ‹·è´�次数也更少。
+
+## å�‚考文ç«
+https://blog.csdn.net/cao131502
+https://zhuanlan.zhihu.com/p/137811719
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232\345\246\202\344\275\225\345\256\236\347\216\260\345\273\266\350\277\237\351\230\237\345\210\227.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232\345\246\202\344\275\225\345\256\236\347\216\260\345\273\266\350\277\237\351\230\237\345\210\227.md"
new file mode 100644
index 0000000..584cb61
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232\345\246\202\344\275\225\345\256\236\347\216\260\345\273\266\350\277\237\351\230\237\345\210\227.md"
@@ -0,0 +1,173 @@
+KafkaÊÇÒ»¸ö·Ö²¼Ê½ÏûϢϵͳ£¬±»¹ã·ºÓ¦ÓÃÓÚ»¥ÁªÍøºÍ´óÊý¾ÝÁìÓò¡£ÔÚʵ¼ÊÓ¦ÓÃÖУ¬¾³£ÐèҪʵÏÖÑÓ³Ù¶ÓÁеŦÄÜ£¬ÒÔ±ãÔÚÒ»¶¨Ê±¼äºóÖ´ÐÐijЩÈÎÎñ»òÕß·¢ËÍijЩÏûÏ¢¡£KafkaÌṩÁ˶àÖÖ·½Ê½À´ÊµÏÖÑÓ³Ù¶ÓÁУ¬±¾ÎĽ«½éÉÜÆäÖÐÒ»ÖÖ³£¼ûµÄʵÏÖ·½·¨¡£
+
+
+
+
+
+### Ò»¡¢ÑÓ³Ù¶ÓÁиÅÊö
+
+
+
+
+
+ÑÓ³Ù¶ÓÁÐÊÇÒ»ÖÖÓÃÓÚÔÚÒ»¶¨Ê±¼äºóÖ´ÐÐÈÎÎñ»ò·¢ËÍÏûÏ¢µÄ»úÖÆ¡£³£¼ûµÄÓ¦Óó¡¾°°üÀ¨¶¨Ê±ÈÎÎñ¡¢ÏûÏ¢ÍÆËÍ¡¢¶©µ¥³¬Ê±µÈµÈ¡£ÑÓ³Ù¶ÓÁеÄʵÏÖ·½Ê½ÓжàÖÖ£¬ÆäÖÐÒ»ÖֱȽϳ£¼ûµÄʵÏÖ·½·¨ÊÇ»ùÓÚÏûÏ¢¶ÓÁеÄÑÓ³ÙÏûÏ¢»úÖÆ¡£
+
+
+
+
+
+ÔÚKafkaÖУ¬ÑÓ³ÙÏûÏ¢ÊÇÖ¸ÔÚ·¢ËÍÏûϢʱ£¬Ö¸¶¨Ò»¸öÑÓ³Ùʱ¼ä£¬ÏûÏ¢½«ÔÚÑÓ³Ùʱ¼äµ½´ïºó²Å±»Ïû·ÑÕßÏû·Ñ¡£KafkaÌṩÁËÒ»Ð©ÌØÊâµÄTopicÓÃÓÚ´æ´¢ÑÓ³ÙÏûÏ¢£¬ÀýÈç"delayed-messages"¡£Ïû·ÑÕß½ø³Ì¿ÉÒÔ¶¨ÆÚ´ÓÕâЩTopicÖÐÏû·ÑÏûÏ¢£¬²¢½«ÏûÏ¢ÖØÐ·¢Ë͵½Ä¿±êTopicÖУ¬´Ó¶øÊµÏÖÑÓ³Ù¶ÓÁеŦÄÜ¡£
+
+
+
+
+
+### ¶þ¡¢KafkaÖеÄÑÓ³ÙÏûϢʵÏÖÔÀí
+
+
+
+
+
+KafkaµÄÑÓ³ÙÏûϢʵÏÖÔÀí±È½Ï¼òµ¥£¬Ö÷񻃾¼°µ½ÏûÏ¢µÄkeyºÍʱ¼ä´Á¡£ÔÚÏûÏ¢µÄkeyÖУ¬¿ÉÒÔÉèÖÃÒ»¸öʱ¼ä´Á£¬±íʾÏûÏ¢µÄÑÓ³Ùʱ¼ä¡£ÔÚÉú²úÕß·¢ËÍÏûϢʱ£¬½«ÏûÏ¢·¢Ë͵½"delayed-messages" TopicÖУ¬²¢ÉèÖÃÏûÏ¢µÄkeyÖеÄʱ¼ä´Á¡£Ïû·ÑÕß½ø³Ì»á¶¨ÆÚ´Ó"delayed-messages" TopicÖÐÏû·ÑÏûÏ¢£¬¼ì²éÏûÏ¢µÄkeyÖеÄʱ¼ä´ÁÊÇ·ñÒѾ¹ýÆÚ¡£Èç¹ûʱ¼ä´ÁÒѾ¹ýÆÚ£¬Ôò½«ÏûÏ¢ÖØÐ·¢Ë͵½Ä¿±êTopicÖУ¬ÀýÈç"target-messages"¡£Èç¹ûʱ¼ä´Á»¹Î´¹ýÆÚ£¬Ôò½«ÏûÏ¢ÖØÐ·¢Ë͵½"delayed-messages" TopicÖУ¬²¢ÉèÖÃÒ»¸öеÄÑÓ³Ùʱ¼ä´Á¡£ÕâÑù£¬¾Í¿ÉÒÔʵÏÖÑÓ³Ù¶ÓÁеŦÄÜ¡£
+
+
+
+
+
+
+
+
+
+### Èý¡¢KafkaÖÐÑÓ³Ù¶ÓÁеÄʵÏÖ²½Öè
+
+
+
+
+
+ʵÏÖKafkaÖеÄÑÓ³Ù¶ÓÁУ¬¿ÉÒÔ°´ÕÕÒÔϲ½Öè½øÐУº
+
+
+
+
+
+1.´´½¨Ò»¸öרÃŵÄTopicÓÃÓÚ´æ´¢ÑÓ³ÙÏûÏ¢£¬ÀýÈç"delayed-messages"¡£¿ÉÒÔʹÓÃKafkaÃüÁîÐй¤¾ß»òKafka API½øÐд´½¨¡£
+
+
+
+
+
+2.ÔÚÏûÏ¢µÄkeyÖÐÉèÖÃÑÓ³Ùʱ¼ä´Á¡£¿ÉÒÔʹÓõ±Ç°Ê±¼ä´Á¼ÓÉÏÑÓ³Ùʱ¼ä×÷Ϊkey£¬ÀýÈ磺"key":"message_body"¡£¿ÉÒÔʹÓÃKafka API·¢ËÍÏûÏ¢µ½"delayed-messages" TopicÖС£
+
+
+
+
+
+3.Æô¶¯Ò»¸öÏû·ÑÕß½ø³Ì£¬ÓÃÓÚÏû·Ñ"delayed-messages" TopicÖеÄÏûÏ¢¡£¿ÉÒÔʹÓÃKafka APIʵÏÖÏû·ÑÕß½ø³Ì¡£
+
+
+
+
+
+4.ÔÚÏû·ÑÕß½ø³ÌÖУ¬¼ì²éÏûÏ¢µÄkeyÖеÄʱ¼ä´ÁÊÇ·ñÒѾ¹ýÆÚ¡£¿ÉÒÔʹÓõ±Ç°Ê±¼ä´ÁÓëÏûÏ¢µÄkeyÖеÄʱ¼ä´Á½øÐбȽϡ£Èç¹ûʱ¼ä´ÁÒѾ¹ýÆÚ£¬Ôò½«ÏûÏ¢ÖØÐ·¢Ë͵½Ä¿±êTopicÖУ¬ÀýÈç"target-messages"¡£¿ÉÒÔʹÓÃKafka APIʵÏÖÏûÏ¢µÄÖØÐ·¢ËÍ¡£
+
+
+
+
+
+5.Èç¹ûʱ¼ä´Á»¹Î´¹ýÆÚ£¬Ôò½«ÏûÏ¢ÖØÐ·¢Ë͵½"delayed-messages" TopicÖУ¬²¢ÉèÖÃÒ»¸öеÄÑÓ³Ùʱ¼ä´Á¡£¿ÉÒÔʹÓÃKafka APIʵÏÖÏûÏ¢µÄÖØÐ·¢ËÍ£¬²¢ÔÚÏûÏ¢µÄkeyÖÐÉèÖÃеÄÑÓ³Ùʱ¼ä´Á¡£
+
+
+
+
+
+6.µÈ´ýÒ»¶¨Ê±¼äºó£¬Öظ´Ö´ÐеÚ4ºÍµÚ5²½£¬Ö±µ½ÏûÏ¢µÄkeyÖеÄʱ¼ä´ÁÒѾ¹ýÆÚ¡£
+
+
+
+
+
+ͨ¹ýÒÔÉϲ½Ö裬¾Í¿ÉÒÔʵÏÖKafkaÖеÄÑÓ³Ù¶ÓÁй¦ÄÜ¡£ÐèҪעÒâµÄÊÇ£¬Ïû·ÑÕß½ø³ÌÐèÒª¶¨ÆÚ´Ó"delayed-messages" TopicÖÐÏû·ÑÏûÏ¢£¬²¢¼ì²éÏûÏ¢µÄkeyÖеÄʱ¼ä´ÁÊÇ·ñÒѾ¹ýÆÚ¡£¿ÉÒÔ¸ù¾Ý¾ßÌåµÄÓ¦Óó¡¾°ÉèÖò»Í¬µÄÑÓ³Ùʱ¼ä¡£
+
+
+
+
+
+
+
+
+
+
+
+### ËÄ¡¢ÑÓ³ÙÏûϢʵÏÖµÄÓÅȱµã
+
+
+
+
+
+
+
+
+
+
+
+KafkaÖÐʵÏÖÑÓ³Ù¶ÓÁеķ½·¨¾ßÓÐÒÔÏÂÓŵ㣺
+
+
+
+
+
+1.¿ÉÒÔÔÚ·Ö²¼Ê½ÏµÍ³ÖÐʵÏÖÑÓ³Ù¶ÓÁй¦ÄÜ£¬¾ßÓнϸߵĿÉÀ©Õ¹ÐԺͿɿ¿ÐÔ¡£
+
+
+
+
+
+2.ʵÏÖ¼òµ¥£¬Ö»ÐèҪʹÓÃKafka API¼´¿É£¬ÎÞÐè¶îÍâµÄ×é¼þ»ò¹¤¾ß¡£
+
+
+
+
+
+3.Ö§³ÖÏûÏ¢µÄÅúÁ¿·¢ËͺÍÏû·Ñ£¬¿ÉÒÔÌá¸ßÐÔÄܺÍÍÌÍÂÁ¿¡£
+
+
+
+
+
+4.¿ÉÒÔÁé»îµØµ÷ÕûÑÓ³Ùʱ¼äºÍÄ¿±êTopic£¬ÊÊÓÃÓÚ²»Í¬µÄÓ¦Óó¡¾°¡£
+
+
+
+
+
+µ«ÊÇ£¬KafkaÖÐʵÏÖÑÓ³Ù¶ÓÁÐÒ²´æÔÚһЩȱµã£º
+
+
+
+
+
+1.ÐèÒªÏû·ÑÕß½ø³Ì¶¨ÆÚ´Ó"delayed-messages" TopicÖÐÏû·ÑÏûÏ¢£¬Èç¹ûÏû·ÑÕß½ø³Ìå´»ú»òÕßÍ£Ö¹¹¤×÷£¬Ôò»áÓ°ÏìÑÓ³Ù¶ÓÁеŦÄÜ¡£
+
+
+
+
+
+2.Ïû·ÑÕß½ø³ÌÐèÒª¶ÔÏûÏ¢½øÐÐÖØÐ·¢Ëͺͼì²é£¬ÐèÒªÏûºÄÒ»¶¨µÄ×ÊÔ´ºÍʱ¼ä¡£
+
+
+
+
+
+3.ÑÓ³Ùʱ¼ä¾«¶ÈÓÐÏÞ£¬×îСֻÄÜ´ïµ½ºÁÃë¼¶±ð¡£
+
+
+
+
+
+### ËÄ¡¢×ܽá
+
+
+
+
+
+KafkaÊÇÒ»¸ö¹¦ÄÜÇ¿´óµÄ·Ö²¼Ê½ÏûϢϵͳ£¬¿ÉÒÔʵÏÖÑÓ³Ù¶ÓÁеŦÄÜ¡£Í¨¹ýÔÚÏûÏ¢µÄkeyÖÐÉèÖÃÑÓ³Ùʱ¼ä´Á£¬½áºÏÏû·ÑÕß½ø³ÌµÄ¶¨ÆÚÏû·ÑºÍÖØÐ·¢ËÍ£¬¿ÉÒÔʵÏÖÑÓ³Ù¶ÓÁеŦÄÜ¡£KafkaÖÐʵÏÖÑÓ³Ù¶ÓÁеķ½·¨¾ßÓÐʵÏÖ¼òµ¥¡¢¿ÉÀ©Õ¹ÐԸߡ¢ÐÔÄܺõÈÓŵ㣬µ«Ò²´æÔÚһЩȱµã¡£ÔÚʵ¼ÊÓ¦ÓÃÖУ¬ÐèÒª¸ù¾Ý¾ßÌåµÄÓ¦Óó¡¾°ºÍÐèÇóÑ¡ÔñºÏÊʵÄÑÓ³Ù¶ÓÁÐʵÏÖ·½·¨¡£
\ No newline at end of file
diff --git "a/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232\345\246\202\344\275\225\345\256\236\347\216\260\346\255\273\344\277\241\351\230\237\345\210\227.md" "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232\345\246\202\344\275\225\345\256\236\347\216\260\346\255\273\344\277\241\351\230\237\345\210\227.md"
new file mode 100644
index 0000000..5617b88
--- /dev/null
+++ "b/docs/mq/kafka/\346\266\210\346\201\257\351\230\237\345\210\227kafka\350\257\246\350\247\243\357\274\232\345\246\202\344\275\225\345\256\236\347\216\260\346\255\273\344\277\241\351\230\237\345\210\227.md"
@@ -0,0 +1,578 @@
+### Apache Kafka ÖÐÓÃÓÚ´íÎó´¦ÀíµÄËÀÐŶÓÁУºÀ´×Ô Uber ºÍ Crowdstrike µÄÌæ´ú·½°¸¡¢×î¼Ñʵ¼ùºÍ°¸ÀýÑо¿¡£
+
+
+
+
+
+ʶ±ðºÍ´¦Àí´íÎó¶ÔÓÚÈκοɿ¿µÄÊý¾ÝÁ÷¹ÜµÀ¶¼ÊDZز»¿ÉÉٵġ£ÕâÆª²©ÎÄ̽ÌÖÁË** ÔÚ Apache Kafka »ù´¡¼Ü¹¹ÖÐ****ʹÓÃËÀÐŶÓÁÐʵÏÖ´íÎó´¦ÀíµÄ×î¼Ñʵ¼ù**¡£ÕâЩѡÏî°üÀ¨×Ô¶¨ÒåʵÏÖ¡¢Kafka Streams¡¢Kafka Connect¡¢Spring ¿ò¼ÜºÍ²¢ÐÐÏû·ÑÕß¡£ÕæÊµ°¸ÀýÑо¿Õ¹Ê¾ÁË Uber¡¢CrowdStrike ºÍɣ̹µÂÒøÐÐÈçºÎÒÔ¼«¶Ë¹æÄ£¹¹½¨¿É¿¿µÄʵʱ´íÎó´¦Àí¡£
+
+
+
+
+
+Apache Kafka ³ÉΪÐí¶àÆóÒµ¼Ü¹¹×îϲ»¶µÄ¼¯³ÉÖмä¼þ¡£¼´Ê¹¶ÔÓÚÔÆÓÅÏÈÕ½ÂÔ£¬ÆóÒµÒ²¿ÉÒÔÀûÓà Kafka µÄÊý¾ÝÁ÷×÷ÎªÔÆÔÉú¼¯³Éƽ̨¼´·þÎñ (iPaaS)¡£
+
+
+
+
+
+### Apache Kafka Êý¾ÝÁ÷ÖеÄÏûÏ¢¶ÓÁÐģʽ
+
+
+
+
+
+ÔÚÎÒ¿ªÊ¼ÕâÆªÎÄÕÂ֮ǰ£¬ÎÒÏëÈÃÄãÖªµÀÕâ¸öÄÚÈÝÊÇ**¹ØÓÚ¡°JMS¡¢ÏûÏ¢¶ÓÁÐºÍ Apache Kafka¡±µÄ²©¿ÍϵÁÐ**µÄÒ»²¿·Ö£º
+
+
+
+
+
+* JMS ÏûÏ¢´úÀíÓë Apache Kafka Êý¾ÝÁ÷µÄ**10 ¸ö±È½Ï±ê×¼**
+* _**ÕâÆªÎÄÕÂ**_**¨C ͨ¹ýApache Kafka ÖеÄËÀÐŶÓÁÐ (DQL)**½øÐдíÎó´¦ÀíµÄÌæ´ú·½·¨
+* ʹÓà Apache KafkaʵÏÖ**ÇëÇó-»Ø¸´Ä£Ê½**
+* _¼´½«_ÍÆ³ö¡ª¡ª**ÓÃÓÚÑ¡ÔñÕýÈ·ÏûϢϵͳµÄ¾ö²ßÊ÷**£¨JMS Óë Apache Kafka£©
+* _¼´½«ÍƳö_¡ª¡ª´Ó JMS ÏûÏ¢´úÀíµ½ Apache Kafka£º**¼¯³É¡¢Ç¨ÒƺÍ/»òÌæ»»**
+
+
+
+
+
+### ʲôÊÇËÀÐŶÓÁм¯³Éģʽ£¨ÔÚ Apache Kafka ÖУ©£¿
+
+
+
+
+
+**ËÀÐŶÓÁÐ (DLQ)**ÊÇÏûϢϵͳ»òÊý¾ÝÁ÷ƽ̨ÄÚµÄÒ»ÖÖ·þÎñʵÏÖ£¬ÓÃÓÚ**´æ´¢Î´³É¹¦´¦ÀíµÄÏûÏ¢**¡£ÏµÍ³²»ÊDZ»¶¯µØ×ª´¢ÏûÏ¢£¬¶øÊǽ«ÆäÒÆ¶¯µ½ËÀÐŶÓÁС£
+
+
+
+
+
+ÆóÒµ**¼¯³Éģʽ (EIP)**¸ÄΪµ÷ÓÃÉè¼ÆÄ£Ê½ËÀÐÅͨµÀ¡£ÎÒÃÇ¿ÉÒÔ½«Á½ÕßÓÃ×÷ͬÒå´Ê¡£
+
+
+
+
+
+
+
+
+
+
+
+±¾ÎÄÖØµã½éÉÜÊý¾ÝÁ÷ƽ̨ Apache Kafka¡£**ÔÚ Kafka Öн«ÏûÏ¢·ÅÈë DLQ µÄ**Ö÷ÒªÔÒòͨ³£ÊÇÏûÏ¢¸ñʽ´íÎó»òÏûÏ¢ÄÚÈÝÎÞЧ/ȱʧ¡£ÀýÈ磬Èç¹ûÔ¤ÆÚÖµÊÇÕûÊý£¬µ«Éú²úÕß·¢ËÍÁË×Ö·û´®£¬Ôò»á·¢ÉúÓ¦ÓóÌÐò´íÎó¡£ÔÚ¸ü¶¯Ì¬µÄ»·¾³ÖУ¬¡°Ö÷Ìâ²»´æÔÚ¡±Òì³£¿ÉÄÜÊÇÎÞ·¨´«µÝÏûÏ¢µÄÁíÒ»¸ö´íÎó¡£
+
+
+
+
+
+Òò´Ë£¬Í¨³£²»ÒªÊ¹ÓÃÏÖÓÐÖмä¼þ¾ÑéÖеÄ֪ʶ¡£Message Queue Öмä¼þ£¨Èç·ûºÏ JMS µÄ IBM MQ¡¢TIBCO EMS »ò RabbitMQ£©Óë·Ö²¼Ê½Ìá½»ÈÕÖ¾£¨Èç Kafka£©µÄ¹¤×÷·½Ê½²»Í¬¡£ÓÉÓÚÐí¶àÆäËûÔÒò£¬ÏûÏ¢¶ÓÁÐÖÐµÄ DLQ ÓÃÓÚÏûÏ¢¶ÓÁÐϵͳ£¬ÕâЩÔÒò²»ÄÜÒ»¶ÔÒ»µØÓ³Éäµ½ Kafka¡£ÀýÈ磬MQ ϵͳÖеÄÏûÏ¢ÓÉÓÚÿÌõÏûÏ¢µÄ TTL£¨Éú´æÊ±¼ä£©¶ø¹ýÆÚ¡£
+
+
+
+
+
+Òò´Ë£¬**ÔÚ Kafka Öн«ÏûÏ¢·ÅÈë DLQ µÄÖ÷ÒªÔÒòÊÇÏûÏ¢¸ñʽ´íÎó»òÏûÏ¢ÄÚÈÝÎÞЧ/ȱʧ**¡£
+
+
+
+
+
+### Apache Kafka ÖÐËÀÐŶÓÁеÄÌæ´ú·½°¸
+
+
+
+
+
+Kafka ÖеÄËÀÐŶÓÁÐÊÇÒ»¸ö»ò¶à¸ö Kafka Ö÷Ì⣬ËüÃÇ**½ÓÊպʹ洢ÓÉÓÚ´íÎó¶øÎÞ·¨ÔÚÁíÒ»¸öÁ÷¹ÜµÀÖд¦ÀíµÄÏûÏ¢**¡£´Ë¸ÅÄîÔÊÐíʹÓÃÒÔÏ´«ÈëÏûÏ¢¼ÌÐøÏûÏ¢Á÷£¬¶ø²»»áÓÉÓÚÎÞЧÏûÏ¢µÄ´íÎó¶øÍ£Ö¹¹¤×÷Á÷¡£
+
+
+
+
+
+### Kafka Broker ºÜ±¿¡ª¡ªÖÇÄܶ˵ãÌṩ´íÎó´¦Àí
+
+
+
+
+
+**Kafka ¼Ü¹¹²»Ö§³Ö broker** r ÖеÄDLQ¡£ÓÐÒâµØ£¬Kafka ½¨Á¢ÔÚÓëÏÖ´ú΢·þÎñÏàͬµÄÔÔòÉÏ£¬Ê¹Óá°ÑƹܵÀºÍÖÇÄܶ˵㡱ÔÔò¡£Õâ¾ÍÊÇΪʲôÓ봫ͳÏûÏ¢´úÀíÏà±È£¬Kafka µÄÀ©Õ¹ÐÔÈç´ËÖ®ºÃ¡£¹ýÂ˺ʹíÎó´¦Àí·¢ÉúÔÚ¿Í»§¶ËÓ¦ÓóÌÐòÖС£
+
+
+
+
+
+Êý¾ÝÁ÷ƽ̨µÄÕæÕý½âñî¿ÉÒÔʵÏÖ¸ü¸É¾»µÄÁìÓòÇý¶¯Éè¼Æ¡£**ÿ¸ö΢·þÎñ»òÓ¦ÓóÌÐò¶¼Í¨¹ý×Ô¼ºÑ¡ÔñµÄ¼¼Êõ¡¢Í¨ÐÅ·¶Ê½ºÍ´íÎó´¦ÀíÀ´ÊµÏÖÆäÂß¼**¡£
+
+
+
+
+
+ÔÚ´«Í³µÄÖмä¼þºÍÏûÏ¢¶ÓÁÐÖУ¬´úÀíÌṩÁËÕâÖÖÂß¼¡£½á¹ûÊÇÓòÖеĿÉÀ©Õ¹ÐÔºÍÁé»îÐԽϲÒòΪֻÓÐÖмä¼þÍŶӲÅÄÜʵÏÖ¼¯³ÉÂß¼¡£
+
+
+
+
+
+### ÓÃÈκαà³ÌÓïÑÔ×Ô¶¨ÒåʵÏÖ Kafka ËÀÐŶÓÁÐ
+
+
+
+
+
+Kafka ÖеÄËÀÐŶÓÁжÀÁ¢ÓÚÄúʹÓõĿò¼Ü¡£Ò»Ð©×é¼þΪ´íÎó´¦ÀíºÍËÀÐŶÓÁÐÌṩÁË¿ªÏä¼´ÓõŦÄÜ¡£µ«ÊÇ£¬Ê¹ÓÃJava¡¢Go¡¢C++¡¢Python µÈ**Èκαà³ÌÓïÑÔΪ Kafka Ó¦ÓóÌÐò±àдËÀÐŶÓÁÐÂß¼**Ò²ºÜÈÝÒס£
+
+
+
+
+
+**ËÀÐŶÓÁÐʵÏÖ**µÄÔ´´úÂë°üº¬Ò»¸ö try-catch ¿éÀ´´¦ÀíÔ¤ÆÚ»òÒâÍâÒì³£¡£Èç¹ûûÓз¢Éú´íÎó£¬Ôò´¦Àí¸ÃÏûÏ¢¡£Èç¹û·¢ÉúÈκÎÒì³££¬Ç뽫ÏûÏ¢·¢Ë͵½×¨ÓÃµÄ DLQ Kafka Ö÷Ìâ¡£
+
+
+
+
+
+**ʧ°ÜÔÒòÓ¦Ìí¼Óµ½ Kafka ÏûÏ¢µÄ±êÍ·**ÖС£²»Ó¦¸ü¸Ä¼üºÍÖµ£¬ÒԱ㽫À´¶ÔÀúʷʼþ½øÐÐÖØÐ´¦ÀíºÍ¹ÊÕÏ·ÖÎö¡£
+
+
+
+
+
+### ËÀÐŶÓÁеĿªÏä¼´Óà Kafka ʵÏÖ
+
+
+
+
+
+Äã²¢²»×ÜÊÇÐèҪʵÏÖÄãµÄËÀÐŶÓÁС£**Ðí¶à×é¼þºÍ¿ò¼ÜÒѾÌṩÁËËüÃÇµÄ DLQ ʵÏÖ**¡£
+
+
+
+
+
+ʹÓÃÄú×Ô¼ºµÄÓ¦ÓóÌÐò£¬Äúͨ³£¿ÉÒÔ¿ØÖÆ´íÎó»òÔÚ³öÏÖ´íÎóʱÐÞ¸´´úÂë¡£µ«ÊÇ£¬**Óë 3rd ·½Ó¦ÓóÌÐòµÄ¼¯³É²¢²»Ò»¶¨ÔÊÐíÄú´¦Àí¿ÉÄܿ缯³ÉÕϰÒýÈëµÄ´íÎó**¡£Òò´Ë£¬DLQ ±äµÃ¸ü¼ÓÖØÒª£¬²¢±»°üº¬ÔÚijЩ¿ò¼ÜÖС£
+
+
+
+
+
+### Kafka Connect ÄÚÖÃËÀÐŶÓÁÐ
+
+
+
+
+
+**Kafka Connect ÊÇ Kafka µÄ¼¯³É¿ò¼Ü**¡£Ëü°üº¬ÔÚ¿ªÔ´ Kafka ÏÂÔØÖС£²»ÐèÒªÆäËûÒÀÀµÏ³ýÁËÄú²¿Êðµ½ Connect ¼¯ÈºÖеÄÁ¬½ÓÆ÷±¾Éí£©¡£
+
+
+
+
+
+ĬÈÏÇé¿öÏ£¬Èç¹ûÓÉÓÚʹÓÃÎÞЧÏûÏ¢¶ø·¢Éú´íÎó£¨ÀýÈçʹÓôíÎóµÄ JSON ת»»Æ÷¶ø²»ÊÇÕýÈ·µÄ AVRO ת»»Æ÷ʱ£©£¬Kafka Connect ÈÎÎñ½«Í£Ö¹¡£É¾³ýÎÞЧÏûÏ¢ÊÇÁíÒ»ÖÖÑ¡Ôñ¡£ºóÕßÈÝÈÌ´íÎó¡£
+
+
+
+
+
+Kafka Connect ÖÐ DLQ µÄÅäÖúܼòµ¥¡£Ö»Ð轫Á½¸öÅäÖÃÑ¡Ïî ' errors.tolerance' ºÍ ' errors.deadletterqueue.topic.name' µÄÖµÉèÖÃΪÕýÈ·µÄÖµ£º
+
+
+
+
+
+
+
+
+
+
+
+²©¿ÍÎÄÕ¡° Kafka Connect Deep Dive ¨C ´íÎó´¦ÀíºÍËÀÐŶÓÁС±ÏÔʾÁËʹÓà DLQ µÄÏêϸ¶¯ÊÖ´úÂëʾÀý¡£
+
+
+
+
+
+**Kafka Connect ÉõÖÁ¿ÉÒÔÓÃÓÚ´¦Àí DLQ ÖеĴíÎóÏûÏ¢**¡£Ö»Ð貿ÊðÁíÒ»¸öʹÓà te DLQ Ö÷ÌâµÄÁ¬½ÓÆ÷¡£ÀýÈ磬Èç¹ûÄúµÄÓ¦ÓóÌÐò´¦Àí Avro ÏûÏ¢²¢ÇÒ´«ÈëÏûÏ¢ÊÇ JSON ¸ñʽ¡£È»ºóÁ¬½ÓÆ÷ʹÓà JSON ÏûÏ¢²¢½«Æäת»»Îª AVRO ÏûÏ¢ÒԳɹ¦ÖØÐ´¦Àí£º
+
+
+
+
+
+Çë×¢Ò⣬Kafka Connect **ûÓÐÓÃÓÚÔ´Á¬½ÓÆ÷µÄËÀÐŶÓÁÐ**¡£
+
+
+
+
+
+### Kafka Streams Ó¦ÓóÌÐòÖеĴíÎó´¦Àí
+
+
+
+
+
+**Kafka Streams ÊÇ Kafka µÄÁ÷´¦Àí¿â**¡£Ëü¿ÉÓëÆäËûÁ÷ʽ´«Êä¿ò¼ÜÏàæÇÃÀ£¬ÀýÈç Apache Flink¡¢Storm¡¢Beam ºÍÀàËÆ¹¤¾ß¡£µ«ÊÇ£¬ËüÊÇ Kafka ÔÉúµÄ¡£ÕâÒâζ×ÅÄú¿ÉÒÔÔÚµ¥¸ö¿ÉÀ©Õ¹ÇÒ¿É¿¿µÄ»ù´¡¼Ü¹¹Öй¹½¨ÍêÕûµÄ¶Ëµ½¶ËÊý¾ÝÁ÷¡£
+
+
+
+
+
+Èç¹ûÄú·Ö±ðʹÓà Java£¨JVM Éú̬ϵͳ£©À´¹¹½¨ Kafka Ó¦ÓóÌÐò£¬**½¨Ò鼸ºõ×ÜÊÇʹÓà Kafka Streams ¶ø²»ÊÇ Kafka µÄ±ê×¼ Java ¿Í»§¶Ë**¡£ÎªÊ²Ã´£¿
+
+
+
+
+
+* Kafka Streams¡°Ö»ÊÇ¡±Ò»¸öÎ§ÈÆ³£¹æ Java Éú²úÕߺÍÏû·ÑÕß API µÄ°ü×°Æ÷£¬ÒÔ¼°Ðí¶àÄÚÖõĸ½¼Ó¹¦ÄÜ¡£
+* Á½Õß¶¼Ö»ÊÇǶÈëµ½ Java Ó¦ÓóÌÐòÖеĿ⣨JAR Îļþ£©¡£
+* Á½Õß¶¼ÊÇ¿ªÔ´ Kafka ÏÂÔØµÄÒ»²¿·Ö - ûÓжîÍâµÄÒÀÀµÏî»òÐí¿ÉÖ¤¸ü¸Ä¡£
+* Ðí¶àÎÊÌâÒѾ¿ªÏä¼´Óõؽâ¾ö£¬ÒÔ¹¹½¨³ÉÊìµÄÁ÷´¦Àí·þÎñ£¨Á÷¹¦ÄÜ¡¢ÓÐ״̬µÄǶÈëʽ´æ´¢¡¢»¬¶¯´°¿Ú¡¢½»»¥Ê½²éѯ¡¢´íÎó´¦ÀíµÈµÈ£©¡£
+
+
+
+
+
+Kafka StreamsµÄ**ÄÚÖù¦ÄÜÖ®Ò»ÊÇĬÈϵķ´ÐòÁл¯Òì³£´¦Àí³ÌÐò**¡£ËüÔÊÐíÄú¹ÜÀíÎÞ·¨·´ÐòÁл¯µÄ**¼Ç¼Òì³£¡£**Ë𻵵ÄÊý¾Ý¡¢²»ÕýÈ·µÄÐòÁл¯Âß¼»òδ´¦ÀíµÄ¼Ç¼ÀàÐͶ¼¿ÉÄܵ¼Ö´íÎ󡣸ù¦Äܲ»³ÆÎªËÀÐŶÓÁУ¬µ«¿ªÏä¼´Óõؽâ¾öÁËÏàͬµÄÎÊÌâ¡£
+
+
+
+
+
+### Spring Kafka ºÍ Spring Cloud Stream µÄ´íÎó´¦Àí
+
+
+
+
+
+Spring ¿ò¼Ü¶Ô Apache Kafka ÓкܺõÄÖ§³Ö¡£ËüÌṩÁËÐí¶àÄ£°åÒÔ±ÜÃâ×Ô¼º±àдÑù°å´úÂë¡£**Spring-Kafka ºÍ Spring Cloud Stream Kafka Ö§³Ö¸÷ÖÖÖØÊԺʹíÎó´¦ÀíÑ¡Ïî**£¬°üÀ¨»ùÓÚʱ¼ä/¼ÆÊýµÄÖØÊÔ¡¢ËÀÐŶÓÁеȡ£
+
+
+
+
+
+¾¡¹Ü Spring ¿ò¼Ü¹¦Äܷdz£·á¸»£¬µ«ËüÓеãÖØ£¬²¢ÇÒÓÐÒ»¸öѧϰÇúÏß¡£Òò´Ë£¬Ëü·Ç³£ÊʺÏн¨ÏîÄ¿£¬»òÕßÈç¹ûÄúÒѾ½« Spring ÓÃÓÚÆäËû³¡¾°µÄÏîÄ¿¡£
+
+
+
+
+
+ÓкܶàºÜ°ôµÄ²©¿ÍÎÄÕÂչʾÁ˲»Í¬µÄʾÀýºÍÅäÖÃÑ¡Ïî¡£»¹ÓÐÓÃÓÚËÀÐŶÓÁеĹٷ½ Spring Cloud Stream ʾÀý¡£Spring ÔÊÐíʹÓüòµ¥µÄ×¢Ê͹¹½¨Âß¼£¬ÀýÈç DLQ¡£ÕâÖÖ±à³Ì·½·¨ÊÇһЩ¿ª·¢ÈËÔ±ÖÓ°®µÄ·¶Àý£¬¶øÁíһЩÔò²»Ï²»¶Ëü¡£Ö»ÐèÁ˽âÑ¡ÏΪ×Ô¼ºÑ¡ÔñºÏÊʵÄÑ¡Ïî¼´¿É¡£
+
+
+
+
+
+### Apache Kafka ²¢ÐÐÏû·ÑÕߵĿÉÀ©Õ¹´¦ÀíºÍ´íÎó´¦Àí
+
+
+
+
+
+ÔÚÐí¶à¿Í»§¶Ô»°ÖУ¬ÊÂʵ֤Ã÷£¬**ÇëÇóËÀÐŶÓÁеÄÖ÷ÒªÔÒòͨ³£ÊÇ´¦ÀíÁ¬½Óµ½Íⲿ Web ·þÎñ»òÊý¾Ý¿âµÄʧ°Ü**¡£³¬Ê±»ò Kafka ÎÞ·¨²¢Ðз¢Ë͸÷ÖÖÇëÇó»áµ¼ÖÂijЩӦÓóÌÐò̱»¾¡£Õâ¸öÎÊÌâÓÐÒ»¸öºÜºÃµÄ½â¾ö·½°¸£º
+
+
+
+
+
+Apache KafkaµÄ**²¢ÐÐÏû·ÑÕß**ÊÇApache 2.0 Ðí¿ÉÏÂ**µÄ¿ªÔ´ÏîÄ¿¡£**ËüÌṩÁËÒ»¸ö´øÓпͻ§¶Ë¶ÓÁеIJ¢ÐÐ Apache Kafka ¿Í»§¶Ë°ü×°Æ÷¡¢Ò»¸ö¾ßÓÐ**¹Ø¼ü²¢·¢ÐԵĸü¼òµ¥µÄÏû·ÑÕß/Éú²úÕß API£¬**ÒÔ¼°**¿ÉÀ©Õ¹µÄ·Ç×èÈû IO**´¦Àí¡£
+
+
+
+
+
+¸Ã¿âÔÊÐíÄú**ͨ¹ýµ¥¸ö Kafka Consumer ²¢Ðд¦ÀíÏûÏ¢£¬ÕâÒâζ×ÅÄú¿ÉÒÔÔÚ²»Ôö¼Ó**Òª´¦ÀíµÄÖ÷ÌâÖеķÖÇøÊýÁ¿µÄÇé¿öÏÂÔö¼Ó Kafka Consumer ²¢Ðжȡ£**¶ÔÓÚÐí¶àÓÃÀý£¬Õâͨ¹ý¼õÉÙ Kafka ´úÀíµÄ¸ºÔØÀ´**Ìá¸ßÍÌÍÂÁ¿ºÍÑÓ³Ù¡£Ëü»¹¿ª±ÙÁËеÄÓÃÀý£¬ÀýÈ缫¶Ë²¢ÐÐÐÔ¡¢ÍⲿÊý¾Ý·á¸»ºÍÅŶӡ£
+
+
+
+
+
+Ò»¸ö¹Ø¼üÌØÐÔÊÇ**ÔÚµ¥¸ö Kafka Ïû·ÑÕßÓ¦ÓóÌÐòÖд¦Àí/ÖØ¸´ Web ·þÎñºÍÊý¾Ý¿âµ÷ÓÃ**¡£²¢Ðл¯±ÜÃâÁËÒ»´Î·¢Ë͵¥¸ö Web ÇëÇóµÄÐèÒª£º
+
+
+
+
+
+
+
+
+
+
+
+**Parallel Consumer ¿Í»§¶Ë¾ßÓÐÇ¿´óµÄÖØÊÔ**Âß¼¡£Õâ°üÀ¨¿ÉÅäÖõÄÑӳٺͶ¯Ì¬´íÎó»ò´¦Àí¡£´íÎóÒ²¿ÉÒÔ·¢Ë͵½ËÀÐŶÓÁС£
+
+
+
+
+
+### ʹÓÃËÀÐŶÓÁÐÖеÄÏûÏ¢
+
+
+
+
+
+**½«´íÎó·¢Ë͵½ËÀÐŶÓÁкó£¬Äú»¹Ã»ÓÐÍê³É£¡»µÏûÏ¢ÐèÒª±»´¦Àí»òÖÁÉÙ±»¼à¿Ø£¡**
+
+
+
+
+
+ËÀÐŶÓÁÐÊÇ**´Óʼþ´¦ÀíÖдøÍâ´¦ÀíÊý¾Ý´íÎó´¦Àí**µÄ¾ø¼Ñ·½Ê½£¬ÕâÒâζ×Å´íÎó´¦Àí³ÌÐò¿ÉÒÔÓëʼþ´¦Àí´úÂë·Ö¿ª´´½¨»òÑݱ䡣
+
+
+
+
+
+´æÔÚ´óÁ¿Ê¹ÓÃËÀÐŶÓÁеĴíÎó´¦Àí²ßÂÔ¡£DO ºÍ DONT ̽Ë÷×î¼Ñʵ¼ùºÍ¾Ñé½Ìѵ¡£
+
+
+
+
+
+### ´íÎó´¦Àí²ßÂÔ
+
+
+
+
+
+Óм¸¸öÑ¡Ïî¿ÉÓÃÓÚ´¦Àí´æ´¢ÔÚËÀÐŶÓÁÐÖеÄÏûÏ¢£º
+
+
+
+
+
+* **ÖØÐ´¦Àí**£ºDLQÖеÄһЩÏûÏ¢ÐèÒªÖØÐ´¦Àí¡£µ«ÊÇ£¬Ê×ÏÈ£¬ÐèÒª½â¾öÕâ¸öÎÊÌâ¡£½â¾ö·½°¸¿ÉÒÔÊÇ×Ô¶¯½Å±¾¡¢±à¼ÏûÏ¢µÄÈ˹¤½»»¥£¬»òÏòÉú²úÕß·µ»Ø´íÎó£¬ÒªÇóÖØÐ·¢ËÍ£¨¸üÕýµÄ£©ÏûÏ¢¡£
+* **ɾ³ý´íÎóÏûÏ¢£¨¾¹ý½øÒ»²½·ÖÎö£©**£º¸ù¾ÝÄúµÄÉèÖ㬿ÉÄÜ»á³öÏÖ´íÎóÏûÏ¢¡£µ«ÊÇ£¬ÔÚɾ³ýËüÃÇ֮ǰ£¬ÒµÎñÁ÷³ÌÓ¦¸Ã¼ì²éËüÃÇ¡£ÀýÈ磬ÒDZí°åÓ¦ÓóÌÐò¿ÉÒÔʹÓôíÎóÏûÏ¢²¢½«ËüÃÇ¿ÉÊÓ»¯¡£
+* **¸ß¼¶·ÖÎö**£ºÁíÒ»ÖÖÑ¡ÔñÊÇ·ÖÎö´«ÈëÊý¾ÝÒÔ»ñȡʵʱ¶´²ì»òÎÊÌ⣬¶ø²»ÊÇ´¦Àí DLQ ÖеÄÿÌõÏûÏ¢¡£ÀýÈ磬һ¸ö¼òµ¥µÄ ksqlDB Ó¦ÓóÌÐò¿ÉÒÔÓ¦ÓÃÁ÷´¦Àí½øÐмÆË㣬ÀýÈçÿСʱ´íÎóÏûÏ¢µÄƽ¾ùÊýÁ¿»òÈÎºÎÆäËûÓÐÖúÓÚÈ·¶¨ Kafka Ó¦ÓóÌÐòÖеĴíÎóµÄ¼û½â¡£
+* **Í£Ö¹¹¤×÷Á÷**£ºÈç¹ûºÜÉÙ»á³öÏÖ»µÏûÏ¢£¬½á¹û¿ÉÄÜÊÇÍ£Ö¹Õû¸öÒµÎñÁ÷³Ì¡£¸Ã¶¯×÷¿ÉÒÔÊÇ×Ô¶¯µÄ£¬Ò²¿ÉÒÔÓÉÈ˾ö¶¨¡£µ±È»£¬Í£Ö¹¹¤×÷Á÷Ò²¿ÉÒÔÔÚÅ׳ö´íÎóµÄ Kafka Ó¦ÓóÌÐòÖÐÍê³É¡£Èç¹ûÐèÒª£¬DLQ ½«ÎÊÌâºÍ¾ö²ßÍⲿ»¯¡£
+* **ºöÂÔ**£ºÕâÌýÆðÀ´¿ÉÄÜÊÇ×îÔã¸âµÄÑ¡Ôñ¡£Ö»ÊÇÈÃËÀÐŶÓÁÐÌîÂú£¬Ê²Ã´¶¼²»×ö¡£È»¶ø£¬¼´Ê¹ÕâÑùÔÚijЩÓÃÀýÖÐÒ²ºÜºÃ£¬±ÈÈç¼à¿Ø Kafka Ó¦ÓóÌÐòµÄÕûÌåÐÐΪ¡£Çë¼Çס£¬Kafka Ö÷Ìâ¾ßÓб£Áôʱ¼ä£¬²¢ÇÒÔÚ¸Ãʱ¼äÖ®ºó´ÓÖ÷ÌâÖÐɾ³ýÏûÏ¢¡£Ö»ÐèΪÄúÉèÖÃÕýÈ·µÄ·½Ê½¼´¿É¡£²¢¼à¿Ø DQL Ö÷ÌâÊÇ·ñ´æÔÚÒâÍâÐÐΪ£¨ÀýÈçÌî³äÌ«¿ì£©¡£
+
+
+
+
+
+### Apache Kafka ÖÐËÀÐŶÓÁеÄ×î¼Ñʵ¼ù
+
+
+
+
+
+ÒÔÏÂÊÇÔÚ Kafka Ó¦ÓóÌÐòÖÐʹÓÃËÀÐŶÓÁнøÐдíÎó´¦ÀíµÄһЩ**×î¼Ñʵ¼ùºÍ¾Ñé½Ìѵ£º**
+
+
+
+
+
+* ¶¨Òå**´¦ÀíÎÞЧÏûÏ¢µÄÒµÎñÁ÷³Ì**£¨×Ô¶¯ÓëÈ˹¤£©
+ * ÏÖʵ£ºÍ¨³££¬¸ù±¾Ã»ÓÐÈË´¦Àí DLQ ÏûÏ¢
+ * ±¸Ñ¡·½°¸ 1£ºÊý¾ÝËùÓÐÕßÐèÒª½ÓÊÕ¾¯±¨£¬¶ø²»½ö½öÊÇ»ù´¡¼Ü¹¹ÍŶÓ
+ * ±¸Ñ¡·½°¸ 2£º¾¯±¨Ó¦Í¨Öª¼Ç¼ÍŶÓϵͳÊý¾Ý´íÎó£¬ËûÃǽ«ÐèÒª´Ó¼ÇÂ¼ÏµÍ³ÖØÐ·¢ËÍ/ÐÞ¸´Êý¾Ý¡£
+ * Èç¹ûûÓÐÈ˹ØÐÄ»ò±§Ô¹£¬Ç뿼ÂÇÖÊÒɺÍÉó²é DLQ ´æÔڵıØÒªÐÔ¡£Ïà·´£¬ÕâЩÏûÏ¢Ò²¿ÉÒÔÔÚ³õʼ Kafka Ó¦ÓóÌÐòÖб»ºöÂÔ¡£Õâ½ÚÊ¡ÁË´óÁ¿µÄÍøÂç¸ºÔØ¡¢»ù´¡ÉèÊ©ºÍ×ʽð¡£
+* ¹¹½¨**´øÓÐÊʵ±¾¯±¨µÄÒDZí°å**²¢ÕûºÏÏà¹ØÍŶӣ¨ÀýÈ磬ͨ¹ýµç×ÓÓʼþ»ò Slack ¾¯±¨£©
+* ¶¨Òåÿ¸ö Kafka Ö÷ÌâµÄ**´íÎó´¦ÀíÓÅÏȼ¶£¨Í£Ö¹¡¢É¾³ýºÍÖØÐ´¦Àí£©**
+* **½ö½«²»¿ÉÖØÊԵĴíÎóÏûÏ¢ÍÆË͵½ DLQ** - Á¬½ÓÎÊÌâÊÇÏû·ÑÕßÓ¦ÓóÌÐòµÄÔðÈΡ£
+* **±£ÁôÔʼÏûÏ¢**²¢½«ËüÃÇ´æ´¢ÔÚ DLQ ÖУ¨´øÓжîÍâµÄ±êÍ·£¬ÀýÈç´íÎóÏûÏ¢¡¢´íÎóʱ¼ä¡¢·¢Éú´íÎóµÄÓ¦ÓóÌÐòÃû³ÆµÈ£©¡ª¡ªÕâʹµÃÖØÐ´¦ÀíºÍ¹ÊÕÏÅųý±äµÃ¸ü¼ÓÈÝÒס£
+* **ÏëÏëÄãÐèÒª¶àÉÙ Dead Letter Queue Kafka Ö÷Ìâ**¡£×ÜÊÇÓÐÈ¡Éá¡£µ«Êǽ«ËùÓдíÎó´æ´¢ÔÚµ¥¸ö DLQ ÖпÉÄܶԽøÒ»²½·ÖÎöºÍÖØÐ´¦ÀíûÓÐÒâÒå¡£
+
+
+
+
+
+Çë¼Çס£¬**DLQ »áÒÔÓб£Ö¤µÄ˳ÐòÖÕÖ¹´¦Àí£¬²¢Ê¹ÈκÎÀàÐ͵ÄÀëÏß´¦Àí±äµÃ¸ü¼ÓÀ§ÄÑ**¡£Òò´Ë£¬Kafka DQL ²¢²»ÊʺÏÿ¸öÓÃÀý¡£
+
+
+
+
+
+### ºÎʱ²»ÔÚ Kafka ÖÐʹÓÃËÀÐŶÓÁУ¿
+
+
+
+
+
+ÈÃÎÒÃÇ̽ÌÖһϲ»Ó¦¸Ã½«ÄÄЩÀàÐ͵ÄÏûÏ¢·ÅÈë Kafka µÄËÀÐŶÓÁÐÖУº
+
+
+
+
+
+* **DLQ ÓÃÓÚ±³Ñ¹´¦Àí£¿**ÓÉÓÚ´óÁ¿ÏûÏ¢µÄ·åÖµ¶øÊ¹Óà DLQ ½øÐнÚÁ÷²¢²»ÊÇÒ»¸öºÃÖ÷Òâ¡£Kafka ÈÕÖ¾±³ºóµÄ´æ´¢»á×Ô¶¯´¦Àí±³Ñ¹¡£Ïû·ÑÕßÒÔËü¿ÉÒÔ°´×Ô¼ºµÄËÙ¶È»ñÈ¡Êý¾ÝµÄ·½Ê½ÌáÈ¡Êý¾Ý£¨»òÕßÅäÖôíÎ󣩡£Èç¹û¿ÉÄܵϰ£¬µ¯ÐÔµØÀ©Õ¹Ïû·ÑÕß¡£¼´Ê¹ÄúµÄ´æ´¢¿Õ¼äÒÑÂú£¬DLQ Ò²ÎÞ¼ÃÓÚÊ¡£ÕâÊÇËüµÄÎÊÌ⣬ÓëÊÇ·ñʹÓà DLQ Î޹ء£
+* **Á¬½Óʧ°ÜµÄDLQ£¿**ÓÉÓÚÁ¬½Óʧ°Ü¶ø½«ÏûÏ¢·ÅÈë DQL ÎÞ¼ÃÓÚÊ£¨¼´Ê¹ÔÚ¶à´ÎÖØÊÔÖ®ºó£©¡£ÒÔÏÂÏûÏ¢Ò²ÎÞ·¨Á¬½Óµ½¸Ãϵͳ¡£ÄúÐèÒª½â¾öÁ¬½ÓÎÊÌâ¡£ÏûÏ¢¿ÉÒÔ¸ù¾ÝÐèÒª´æ´¢ÔÚ³£¹æÖ÷ÌâÖУ¨È¡¾öÓÚ±£Áôʱ¼ä£©¡£
+
+
+
+
+
+### ÓÃÓÚÊý¾ÝÖÎÀíºÍ´íÎóÔ¤·ÀµÄģʽע²á±í
+
+
+
+
+
+×îºóµ«Í¬ÑùÖØÒªµÄÊÇ£¬ÈÃÎÒÃÇ̽ÌÖÔÚijЩÇé¿öÏÂ**¼õÉÙÉõÖÁÏû³ý¶ÔËÀÐŶÓÁеÄÐèÇóµÄ¿ÉÄÜÐÔ¡£**
+
+
+
+
+
+**¿¨·ò¿¨**µÄSchema Registry**ÊÇÒ»ÖÖÈ·±£Êý¾ÝÇåÀíÒÔ·ÀÖ¹Éú²úÕßÔÚ¸ºÔØÖгö´íµÄ·½·¨**¡£ËüÔÚ Kafka Éú²úÕßÖÐÇ¿ÖÆÖ´ÐÐÕýÈ·µÄÏûÏ¢½á¹¹£º
+
+
+
+
+
+
+
+ģʽע²á±íÊÇģʽµÄ¿Í»§¶Ë¼ì²é¡£Confluent Server µÈһЩʵÏÖÔÚ´úÀí¶ËÌṩÁ˶îÍâµÄģʽ¼ì²é£¬ÒԾܾøÀ´×ÔδʹÓÃģʽע²á±íµÄÉú²úÕßµÄÎÞЧ»ò¶ñÒâÏûÏ¢¡£
+
+
+
+
+
+### Kafka ËÀÐŶÓÁеݸÀýÑо¿
+
+
+
+
+
+ÈÃÎÒÃÇ¿´¿´**Uber¡¢CrowdStrike ºÍ Santander Bank µÄÈý¸ö°¸ÀýÑо¿£¬ËüÃÇÔÚ Kafka »ù´¡ÉèÊ©ÖÐʵ¼Ê²¿ÊðËÀÐŶÓÁÐ**¡£Çë¼Çס£¬ÕâЩ¶¼ÊǷdz£³ÉÊìµÄÀý×Ó¡£²»ÊÇÿ¸öÏîÄ¿¶¼ÐèÒªÄÇô¸´ÔÓ¡£
+
+
+
+
+
+### Uber - ¹¹½¨¿É¿¿µÄÔÙ´¦ÀíºÍËÀÐŶÓÁÐ
+
+
+
+
+
+ÔÚ·Ö²¼Ê½ÏµÍ³ÖУ¬ÖØÊÔÊDz»¿É±ÜÃâµÄ¡£´ÓÍøÂç´íÎ󵽸´ÖÆÎÊÌ⣬ÉõÖÁÏÂÓÎÒÀÀµ¹ØÏµµÄÖжϣ¬´ó¹æÄ£ÔËÐеķþÎñ±ØÐë×¼±¸ºÃ¾¡¿ÉÄÜÓÅÑŵØÓöµ½¡¢Ê¶±ðºÍ´¦Àí¹ÊÕÏ¡£
+
+
+
+
+
+¼øÓÚ Uber µÄÔËÓª·¶Î§ºÍËÙ¶È£¬ËüµÄϵͳ±ØÐë¾ßÓÐ**ÈÝ´íÄÜÁ¦£¬²¢ÇÒÔÚÖÇÄÜʧ°ÜʱºÁ²»Í×Ð**¡£Uber ½« Apache Kafka ÓÃÓÚ¸÷ÖÖ¼«¶Ë¹æÄ£µÄÓÃÀýÒÔʵÏÖÕâһĿ±ê¡£
+
+
+
+
+
+ÀûÓÃÕâÐ©ÌØÐÔ£¬Uber ±£ÏÕ¹¤³ÌÍŶÓÀ©Õ¹ÁË Kafka ÔÚÆäÏÖÓÐʼþÇý¶¯¼Ü¹¹ÖеÄ×÷Óã¬Í¨¹ýʹÓà n**¸ö×èÈûÇëÇóÖØÐ´¦ÀíºÍËÀÐŶÓÁÐÀ´ÊµÏÖ½âñî¡¢¿É¹Û²ìµÄ´íÎó´¦Àí£¬¶ø²»»áÖжÏʵʱÁ÷Á¿**¡£¸Ã²ßÂÔÓÐÖúÓÚËûÃÇÑ¡Ôñ¼ÓÈëµÄ¼ÝʻԱÉ˺¦±£»¤¼Æ»®ÔÚ 200 ¶à¸ö³ÇÊпɿ¿ÔËÐУ¬²¢Îª×¢²á¼ÝʻԱ¿Û³ýÿ´ÎÐг̵ÄÿӢÀï±£·Ñ¡£
+
+
+
+
+
+ÕâÊÇ Uber ´íÎó´¦ÀíµÄʾÀý¡£´íÎó»á½µµÍÖØÊÔÖ÷ÌâµÄ¼¶±ð£¬Ö±µ½µÇ½ DLQ£º
+
+
+
+
+
+
+
+
+
+
+
+Óйظü¶àÐÅÏ¢£¬ÇëÔĶÁ Uber ·Ç³£ÏêϸµÄ¼¼ÊõÎÄÕ£º¡°Ê¹Óà Apache Kafka ¹¹½¨¿É¿¿µÄÔÙ´¦ÀíºÍËÀÐŶÓÁС±¡£
+
+
+
+
+
+### CrowdStrike - ´¦ÀíÊýÍòÒÚʼþµÄ´íÎó
+
+
+
+
+
+CrowdStrike ÊÇÒ»¼ÒλÓڵ¿ËÈøË¹ÖݰÂ˹͡µÄ**ÍøÂ簲ȫ¼¼Êõ¹«Ë¾¡£**ËüÌṩ**ÔÆ¹¤×÷¸ºÔغͶ˵㰲ȫ¡¢ÍþвÇ鱨ºÍÍøÂç¹¥»÷ÏìÓ¦·þÎñ**¡£
+
+
+
+
+
+CrowdStrike µÄ»ù´¡ÉèÊ©** ÿÌìʹÓà Apache Kafka ´¦ÀíÊýÍòÒÚ¸öʼþ**¡£ÔÚÎҵġ° Apache Kaka ÍøÂ簲ȫ²©¿ÍϵÁС±ÖУ¬ÎÒ½éÉÜÁËÒÔÈκιæÄ£ÊµÊ±´´½¨Ì¬ÊƸÐÖªºÍÍþвÇ鱨µÄÏà¹ØÓÃÀý¡£
+
+
+
+
+
+CrowdStrike ¶¨ÒåÁËÈý¸ö×î¼Ñʵ¼ù À´³É¹¦ÊµÏÖËÀÐŶÓÁкʹíÎó´¦Àí£º
+
+
+
+
+
+* **ÔÚÕýÈ·µÄϵͳÖд洢´íÎóÏûÏ¢**£º¶¨Òå»ù´¡ÉèÊ©ºÍ´úÂëÒÔ²¶»ñºÍ¼ìË÷ËÀÐÅ¡£CrowdStrike ʹÓà S3 ¶ÔÏó´æ´¢À´´æ´¢Ç±ÔڵĴóÁ¿´íÎóÏûÏ¢¡£Çë×¢Ò⣬Kafka µÄ·Ö²ã´æ´¢¿ªÏä¼´Óõؽâ¾öÁËÕâ¸öÎÊÌ⣬ÎÞÐèÆäËû´æ´¢½Ó¿Ú£¨ÀýÈ磬ÀûÓà Confluent Cloud ÖеÄÎÞÏÞ´æ´¢£©¡£
+* **ʹÓÃ×Ô¶¯»¯**£º·ÅÖù¤¾ßÒÔʹÐÞ¸´ÍòÎÞһʧ£¬ÒòΪÊÖ¶¯Íê³É´íÎó´¦Àí¿ÉÄܷdz£ÈÝÒ׳ö´í¡£
+* **¼Ç¼ҵÎñÁ÷³Ì²¢Æ¸ÇëÏà¹ØÍŶÓ**£º±ê×¼»¯ºÍ¼Ç¼Á÷³ÌÒÔÈ·±£Ò×ÓÚʹÓᣲ¢·ÇËùÓй¤³Ìʦ¶¼ÊìϤ×éÖ¯´¦ÀíËÀÐÅÏûÏ¢µÄ²ßÂÔ¡£
+
+
+
+
+
+ÔÚ**Ïñ CrowdStrike ÕâÑùµÄÍøÂ簲ȫƽ̨ÖУ¬´ó¹æÄ£ÊµÊ±Êý¾Ý´¦ÀíÖÁ¹ØÖØÒª**¡£´ËÒªÇóÒ²ÊÊÓÃÓÚ´íÎó´¦Àí¡£**ÏÂÒ»´ÎÍøÂç¹¥»÷¿ÉÄÜÊǹÊÒâ°üº¬²»Êʵ±»òÎÞЧÄÚÈݵĶñÒâÏûÏ¢**£¨Èç JavaScript ©¶´ÀûÓã©¡£Òò´Ë£¬±ØÐëͨ¹ýËÀÐŶÓÁÐʵʱ´¦Àí´íÎó¡£
+
+
+
+
+
+### ɣ̹µÂÒøÐÐ - ÓÃÓÚÖØÊÔºÍ DLQ ×éºÏµÄÓÊÏä 2.0
+
+
+
+
+
+ɣ̹µÂÒøÐÐ**ÔÚÓÊÏäÓ¦ÓóÌÐòÖд¦Àíº£Á¿Êý¾ÝµÄͬ²½Êý¾Ý´¦ÀíÃæÁÙ¾Þ´óÌôÕ½**¡£ËûÃÇÖØÐ¼ܹ¹ÁËËûÃǵĻù´¡¼Ü¹¹²¢¹¹½¨ÁËÒ»¸ö½âñîÇÒ¿ÉÀ©Õ¹µÄ¼Ü¹¹£¬³ÆÎª¡°Santander Mailbox 2.0¡±¡£
+
+
+
+
+
+Santander µÄ¹¤×÷¸ºÔز¢×ªÒƵ½**ÓÉ Apache Kafka Ìṩ֧³ÖµÄʼþËÝÔ´**£º
+
+
+
+
+
+
+
+
+
+
+
+еĻùÓÚÒ첽ʼþµÄ¼Ü¹¹ÖеÄÒ»¸ö¹Ø¼üÌôÕ½ÊÇ´íÎó´¦Àí¡£** Santander ʹÓÃÖØÊÔºÍ DQL Kafka Ö÷Ìâ¹¹½¨µÄ´íÎó´¦Àí**½â¾öÁËÕâЩÎÊÌ⣺
+
+
+
+
+
+
+
+
+
+
+
+²é¿´À´×Ô Santander µÄ¼¯³ÉºÏ×÷»ï°é ConsdataµÄ Kafka ·å»áÑݽ²¡°»ùÓÚÖØÊÔ²ßÂÔºÍËÀÐÅÖ÷ÌâµÄ Apache Kafka ÖеĿɿ¿Ê¼þ´«µÝ¡±ÖеÄÏêϸÐÅÏ¢¡£
+
+
+
+
+
+### Apache Kafka Öпɿ¿ÇÒ¿ÉÀ©Õ¹µÄ´íÎó´¦Àí
+
+
+
+
+
+**´íÎó´¦Àí¶ÔÓÚ¹¹½¨¿É¿¿µÄÊý¾ÝÁ÷¹ÜµÀºÍƽ̨ÖÁ¹ØÖØÒª**¡£´æÔÚ²»Í¬µÄÌæ´ú·½°¸À´½â¾öÕâ¸öÎÊÌâ¡£¸Ã½â¾ö·½°¸°üÀ¨ËÀÐŶÓÁеÄ×Ô¶¨ÒåʵÏÖ»òÀûÓÃÕýÔÚʹÓõĿò¼Ü£¬ÀýÈç Kafka Streams¡¢Kafka Connect¡¢Spring ¿ò¼Ü»ò Kafka µÄ²¢ÐÐÏû·ÑÕß¡£
+
+
+
+
+
+ÓŲ½¡¢CrowdStrike ºÍɣ̹µÂÒøÐеݸÀýÑо¿±íÃ÷£¬´íÎó´¦Àí²¢²»×ÜÊǺÜÈÝÒ×ʵÏÖ¡£µ±ÄúÉè¼ÆÐµÄÓ¦ÓóÌÐò»ò¼Ü¹¹Ê±£¬ÐèÒª´ÓÒ»¿ªÊ¼¾Í¿¼Âǵ½ÕâÒ»µã¡£**ʹÓà Apache Kafka ½øÐÐʵʱÊý¾ÝÁ÷´«ÊäºÜÓÐÎüÒýÁ¦£¬µ«Ö»ÓÐÔÚÄúÄܹ»´¦ÀíÒâÍâÐÐΪʱ²ÅÄܳɹ¦**¡£ËÀÐŶÓÁÐÊÇÐí¶à³¡¾°µÄ¾ø¼ÑÑ¡Ôñ¡£
\ No newline at end of file