From 8aa85dd33915575a5290e82e104095a99b2bfb24 Mon Sep 17 00:00:00 2001 From: h2pl <362294931@qq.com> Date: Sat, 29 Apr 2023 17:06:37 +0800 Subject: [PATCH 01/10] add reference --- .../SpringCloud/SpringCloudConfig.md" | 11 ++++++++++- .../SpringCloud/SpringCloudConsul.md" | 7 +++++++ .../SpringCloud/SpringCloudEureka.md" | 10 +++++++++- .../SpringCloud/SpringCloudGateway.md" | 13 +++++++++++-- .../SpringCloud/SpringCloudHystrix.md" | 10 +++++++++- .../SpringCloud/SpringCloudLoadBalancer.md" | 8 ++++++++ .../SpringCloud/SpringCloudOpenFeign.md" | 9 ++++++++- .../SpringCloud/SpringCloudRibbon.md" | 10 +++++++++- .../SpringCloud/SpringCloudSleuth.md" | 10 +++++++++- .../SpringCloud/SpringCloudZuul.md" | 6 ++++++ .../SpringCloud\346\246\202\350\277\260.md" | 8 +++++++- ...\234\215\345\212\241\346\263\250\345\206\214.md" | 10 +++++++++- ...\236\220\357\274\232\346\246\202\350\247\210.md" | 9 ++++++++- ...\205\215\347\275\256\344\270\255\345\277\203.md" | 9 ++++++++- ...\272\220\347\240\201\345\210\206\346\236\220.md" | 9 ++++++++- ...\272\220\347\240\201\345\210\206\346\236\220.md" | 10 +++++++++- ...\272\220\347\240\201\345\210\206\346\236\220.md" | 7 +++++++ ...\272\220\347\240\201\345\210\206\346\236\220.md" | 10 +++++++++- ...\272\220\347\240\201\345\210\206\346\236\220.md" | 10 +++++++++- ...\272\220\347\240\201\345\210\206\346\236\220.md" | 10 +++++++++- ...\272\220\347\240\201\345\210\206\346\236\220.md" | 9 +++++++-- ...\272\220\347\240\201\345\210\206\346\236\220.md" | 10 +++++++++- ...\272\220\347\240\201\345\210\206\346\236\220.md" | 7 +++++++ ...\272\220\347\240\201\345\210\206\346\236\220.md" | 10 +++++++++- 24 files changed, 201 insertions(+), 21 deletions(-) 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”,结果如下图。 ![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/10194222Y-15.png) -图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”,结果如下图。 ![自定义全局网关过滤器](http://c.biancheng.net/uploads/allimg/211210/101P43096-6.png) -图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 监控页面,如下图。 ![Hystrix 监控 8004 运行情况](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/10162345J-15.png) -图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 { ![定制负载均衡策略](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/10122152E-5.gif) 图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、提高性能 -![image.png](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/e27c8e72b30845c3ab9346b89932fb42.png "image.png") \ No newline at end of file +![image.png](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/e27c8e72b30845c3ab9346b89932fb42.png "image.png") + +# 参考文章 +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);![SpringCloud Alibaba系列——17Seata AT模式源码分析(下)-开源基础软件社区](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/4842a0701546824cf2720855d8310a1274c576.jpg "SpringCloud Alibaba系列——17Seata AT模式源码分析(下)-开源基础软件社区")判断undolog是否存在,存在则删除对应undolog,并一起提交,到此seata的AT模式源码解析完毕。 \ No newline at end of file +最终回滚方法调用的是UndoLogManager.undo(dataSourceProxy, xid, branchId);![SpringCloud Alibaba系列——17Seata AT模式源码分析(下)-开源基础软件社区](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/4842a0701546824cf2720855d8310a1274c576.jpg "SpringCloud Alibaba系列——17Seata AT模式源码分析(下)-开源基础软件社区")判断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 { ![image-20220509003807968](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/c72e3f02f7e0d5d3343f8ae9c464b69c.png) -![image-20220509003927550](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/59796bbbd6b3524e32759d42b622f1bc.png) \ No newline at end of file +![image-20220509003927550](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/59796bbbd6b3524e32759d42b622f1bc.png) + +# 参考文章 +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 From 84e574939817d4c3e42e95c322ccf755791146e0 Mon Sep 17 00:00:00 2001 From: h2pl <362294931@qq.com> Date: Thu, 25 May 2023 21:47:10 +0800 Subject: [PATCH 02/10] kafka series --- ...57\274\210Java\347\211\210\357\274\211.md" | 173 +++++ ...er\347\232\204\350\277\207\347\250\213.md" | 112 +++ ...7\274\232Kafka\344\273\213\347\273\215.md" | 122 ++++ ...20\346\200\273\347\273\223\347\257\207.md" | 636 ++++++++++++++++++ ...15\347\275\256\346\200\273\347\273\223.md" | 517 ++++++++++++++ ...66\346\236\204\344\273\213\347\273\215.md" | 298 ++++++++ ...45\344\275\234\345\216\237\347\220\206.md" | 127 ++++ ...25\351\242\230\345\244\247\345\205\250.md" | 518 ++++++++++++++ 8 files changed, 2503 insertions(+) create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" 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鐨勯厤缃枃妗h鏄 + +# 閰嶇疆鐜鍙橀噺锛屾柟渚垮湪浠绘剰鐩綍涓嬭繍琛宬afka鍛戒护 +# 鍗氫富浣跨敤鐨凪ac锛屾墍浠ラ厤缃湪浜 ~/.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锛屽洜涓簁afka鐨勫厓鏁版嵁闇瑕佷繚瀛樺埌zookeeper涓 +$ bin/zookeeper-server-start.sh config/zookeeper.properties + +# 鑻ュ嚭鐜板涓嬩俊鎭紝鍒欒瘉鏄巣ookeeper鍚姩鎴愬姛浜 +[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 鍙傛暟鍒欏叧闂綋鍓嶇獥鍙f湇鍔$鑷姩閫鍑 +$ bin/kafka-server-start.sh -daemon config/server.properties + +``` + + + +### **3.3 kafka 鍩虹鍛戒护浣跨敤** + + + +``` +# 1\. 鍒涘缓涓涓猼opic +# --replication-factor锛氭寚瀹氬壇鏈釜鏁 +# --partition锛氭寚瀹歱artition涓暟 +# --topic锛氭寚瀹歵opic鐨勫悕瀛 +$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partition 1 --topic mytopic + +# 2\. 鏌ョ湅鍒涘缓鎴愬姛鐨則opic +$ 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 + +``` + + + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-a1e0c6db02c2822b2ad88db1c3b0b8a7_720w.webp) + +
+ +### **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 娑堣垂鑰呯浠g爜** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-5e9876ca0dc733fe8c2df51d2e42d1ce_720w.webp) + +
+ +### **4.3 鐢熶骇鑰呯浠g爜** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-d1e6bfdf23c2b42e23f30d4430c587e2_720w.webp) + +
+ +### **4.4 娑堣垂鑰呯鏁堟灉鍥** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-1912f5b2b12ac766d746d88a04b9bd28_720w.webp) + +
+ +### **5.鎬荤粨** + +鏈枃浠嬬粛浜 kafka 鍗曟満鐗堝畨瑁呭強绠鍗曞懡浠や娇鐢紝鐒跺悗浣跨敤 Java 瀹炵幇浜嗙敓浜ц呭拰娑堣垂鑰呯殑绠鍗曞姛鑳斤紝铏界劧鍐呭鍙兘姣旇緝绠鍗曪紝浣嗚繕鏄**寮虹儓寤鸿澶у鎵嬪姩鍘诲疄璺典竴涓**锛屼粠鑰屽 kafka 鐨勬灦鏋勬湁涓涓洿娣卞叆鐨勭悊瑙c \ 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锛 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-7d57acd1d7dc5942e999e6ffebb28679_720w.webp) + +
+ +浠ヤ笂涓哄彂閫佹秷鎭殑涓绘祦绋嬶紝闄勪笂閮ㄥ垎婧愮爜渚涘ぇ瀹跺弬鑰冿紝鎺ヤ笅鏉ュ垎鏋愪笅鍑犱釜闈炲父閲嶈娴佺▼鐨勫叿浣撳疄鐜板師鐞嗐 + +* * * + +## **瀹㈡埛绔紦瀛樺瓨鍌ㄦā鍨** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-5da65c5f9f8c0c9082e07c6431e78cd2_720w.webp) + +
+ +浠庝笂鍥惧彲浠ョ湅鍑猴紝涓鏉℃秷鎭鍏堥渶瑕佺‘瀹氳琚瓨鍌ㄥ埌閭d釜 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 鏄笉鑳藉杩涜鏁版嵁鍐欏叆鐨勩 + +绋嶅井瑙i噴涓涓嬶紝涓诲壇 partition 鐨勬満鍒舵槸涓轰簡鎻愰珮 kafka 绯荤粺鐨勫閿欐х殑锛屽嵆褰撴煇涓 Broker 鎰忓瀹曟満鏃讹紝鍦ㄦ Broker 涓婄殑涓 partition 鐘舵佷负涓嶅彲璇诲啓鏃讹紙鍙湁涓 partition 鍙澶栨彁渚涜鍐欐湇鍔★紝鍓 partition 鍙湁鏁版嵁澶囦唤鐨勫姛鑳斤級锛宬afka 浼氫粠涓 partition 瀵瑰簲鐨 N 涓壇 partition 涓寫閫変竴涓紝骞跺皢鍏剁姸鎬佹敼涓轰富 partition锛屼粠鑰岀户缁澶栨彁渚涜鍐欐搷浣溿 + +娑堟伅琚‘瀹氬垎閰嶅埌鏌愪釜 partition 瀵瑰簲璁板綍鏀堕泦鍣紙鍗冲弻绔槦鍒楋級鍚庯紝鎺ヤ笅鏉ワ紝鍙戦佺嚎绋嬶紙Sender锛変粠璁板綍鏀堕泦鍣ㄤ腑鏀堕泦婊¤冻鏉′欢鐨勬壒鏁版嵁鍙戦佺粰 Broker锛岄偅涔堝彂閫佺嚎绋嬫槸濡備綍鏀堕泦婊¤冻鏉′欢鐨勬壒鏁版嵁鐨勶紵鎵规暟鎹槸鎸夌収 partition 缁村害鍙戦佺殑杩樻槸鎸夌収 Broker 缁村害鍙戦佹暟鎹殑锛 + +* * * + +## **鍙戦佺嚎绋嬬殑宸ヤ綔鍘熺悊** + +Sender 绾跨▼鐨勪富瑕佸伐浣滄槸鏀堕泦婊¤冻鏉′欢鐨勬壒鏁版嵁锛屼綍涓烘弧瓒虫潯浠剁殑鎵规暟鎹紵缂撳瓨鏁版嵁鏄互鎵圭淮搴﹀瓨鍌ㄧ殑锛屽綋涓鎵规暟鎹噺杈惧埌鎸囧畾鐨 N 鏉℃椂锛屽氨婊¤冻鍙戦佺粰 Broker 鐨勬潯浠朵簡銆 + +partition 缁村害鍜 Broker 缁村害鍙戦佹秷鎭ā鍨嬪姣斻 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-36b7c2761f17fb2d6481747523999011_720w.webp) + +
+ +浠庡浘涓彲浠ョ湅鍑猴紝宸︿晶鎸夌収 partition 缁村害鍙戦佹秷鎭紝姣忎釜 partition 閮介渶瑕佸拰 Broker 寤鸿繛锛屾诲叡鍙戠敓浜嗗洓娆$綉缁滆繛鎺ャ傝屽彸渚у皢鍒嗗竷鍦ㄥ悓涓涓 Broker 鐨 partition 鎸夌粍鑱氬悎鍚庡湪涓 Broker 寤鸿繛锛屽彧闇瑕佷袱娆$綉缁滆繛鎺ュ嵆鍙傛墍浠 Kafka 閫夋嫨鍙充晶鐨勬柟寮忋 + +### **Sender 鐨勪富瑕佸伐浣** + +绗竴姝ワ細鎵弿璁板綍鏀堕泦鍣ㄤ腑婊¤冻鏉′欢鐨勬壒鏁版嵁锛岀劧鍚庡皢 partition -> 鎵规暟鎹槧灏勮浆鎹㈡垚 BrokerId -> N 鎵规暟鎹殑鏄犲皠銆傜浜屾锛歋ender 绾跨▼浼氫负姣忎釜 BrokerId 鍒涘缓涓涓鎴风璇锋眰锛岀劧鍚庡皢璇锋眰浜ょ粰 NetWorkClient锛岀敱 NetWrokClient 鍘荤湡姝e彂閫佺綉缁滆姹傚埌 Broker銆 + +### **NetWorkClient 鐨勫伐浣滃唴瀹** + +Sender 绾跨▼鍑嗗濂借鍙戦佺殑鏁版嵁鍚庯紝浜ょ敱 NetWorkClient 鏉ヨ繘琛岀綉缁滅浉鍏虫搷浣溿備富瑕佸寘鎷鎴风涓庢湇鍔$鐨勫缓杩炪佸彂閫佸鎴风璇锋眰銆佹帴鍙楁湇鍔$鍝嶅簲銆傚畬鎴愬涓婁竴绯诲垪鐨勫伐浣滀富瑕佺敱濡備笅鏂规硶瀹屾垚銆 + +1. reday()鏂规硶銆備粠璁板綍鏀堕泦鍣ㄨ幏鍙栧噯澶囧畬姣曠殑鑺傜偣锛屽苟杩炴帴鎵鏈夊噯澶囧ソ鐨勮妭鐐广 +2. send()鏂规硶銆備负姣忎釜鑺傜偣鍒涘缓涓涓鎴风璇锋眰锛岀劧鍚庡皢璇锋眰鏆傛椂瀛樺埌鑺傜偣瀵瑰簲鐨 Channel锛堥氶亾锛変腑銆 +3. poll()鏂规硶銆傝鏂规硶浼氱湡姝h疆璇㈢綉缁滆姹傦紝鍙戦佽姹傜粰鏈嶅姟绔妭鐐瑰拰鎺ュ彈鏈嶅姟绔殑鍝嶅簲銆 + +* * * + +## **鎬荤粨** + +浠ヤ笂锛屽嵆涓虹敓浜ц呭鎴风鐨勪竴鏉℃秷鎭粠鐢熶骇鍒板彂閫佸埌 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 浠涔堟槸浜嬩欢娴? + +浜嬩欢娴佹槸鐩稿綋浜庝汉浣撲腑鏋㈢缁忕郴缁熺殑鏁板瓧绯荤粺銆傚畠鏄滄案杩滃湪绾库濅笘鐣岀殑鎶鏈熀纭锛屽湪杩欎釜涓栫晫閲岋紝浼佷笟瓒婃潵瓒婂鍦扮敱杞欢瀹氫箟鍜岃嚜鍔ㄥ寲锛岃蒋浠剁殑鐢ㄦ埛涔熸洿澶氬湴鏄蒋浠躲 + +浠庢妧鏈笂璁诧紝浜嬩欢娴佹槸鎸囦互浜嬩欢娴佺殑褰㈠紡浠庢暟鎹簱銆佷紶鎰熷櫒銆佺Щ鍔ㄨ澶囥佷簯鏈嶅姟鍜岃蒋浠跺簲鐢ㄧ瓑浜嬩欢婧愬疄鏃舵崟鑾锋暟鎹殑瀹炶返;鎸佷箙鍦板瓨鍌ㄨ繖浜涗簨浠舵祦浠ュ浠ュ悗妫绱;瀹炴椂鍜屽洖椤炬у湴鎿嶄綔銆佸鐞嗗拰鍝嶅簲浜嬩欢娴;骞舵牴鎹渶瑕佸皢浜嬩欢娴佽矾鐢卞埌涓嶅悓鐨勭洰鐨勫湴鎶鏈傚洜姝わ紝浜嬩欢娴佺‘淇濅簡鏁版嵁鐨勮繛缁祦鍔ㄥ拰瑙i噴锛屼粠鑰屼娇姝g‘鐨勪俊鎭湪姝g‘鐨勫湴鐐广佹纭殑鏃堕棿鍑虹幇銆 + +## 1.2 鎴戝彲浠ヤ娇鐢ㄤ簨浠舵祦鍋氫粈涔? + +浜嬩欢娴佸簲鐢ㄤ簬浼楀琛屼笟鍜岀粍缁囩殑鍚勭鐢ㄤ緥銆傚畠鐨勮澶氫緥瀛愬寘鎷: 1. 瀹炴椂澶勭悊鏀粯鍜岄噾铻嶄氦鏄擄紝濡傝偂绁ㄤ氦鏄撴墍銆侀摱琛屽拰淇濋櫓銆 2. 瀹炴椂璺熻釜鍜岀洃鎺ф苯杞︺佸崱杞︺佽溅闃熷拰杩愯緭锛屽鐗╂祦鍜屾苯杞﹁涓氥 3. 鎸佺画鎹曡幏鍜屽垎鏋愭潵鑷墿鑱旂綉璁惧鎴栧叾浠栬澶囩殑浼犳劅鍣ㄦ暟鎹紝濡傚伐鍘傚拰椋庣數鍦恒 4. 鏀堕泦骞剁珛鍗冲搷搴斿鎴风殑浜掑姩鍜岃鍗曪紝濡傞浂鍞侀厭搴楀拰鏃呮父琛屼笟锛屼互鍙婄Щ鍔ㄥ簲鐢ㄧ▼搴忋 5. 鐩戞祴浣忛櫌鐥呬汉锛岄娴嬬梾鎯呭彉鍖栵紝纭繚鍦ㄧ揣鎬ユ儏鍐典笅鍙婃椂娌荤枟銆 6. 杩炴帴銆佸瓨鍌ㄥ叕鍙镐笉鍚岄儴闂ㄤ骇鐢熺殑鏁版嵁骞朵娇鍏跺彲鐢ㄣ 7. 浣滀负鏁版嵁骞冲彴銆佷簨浠堕┍鍔ㄦ灦鏋勫拰寰湇鍔$殑鍩虹銆 + +## 1.3 Apache Kafka庐鏄竴涓簨浠舵祦骞冲彴銆傝繖鏄粈涔堟剰鎬? + +Kafka缁撳悎浜嗕笁涓叧閿殑鍔熻兘锛屾墍浠ヤ綘鍙互鐢ㄤ竴涓崟涓鐨勬垬鏂楁祴璇曡В鍐虫柟妗堟潵瀹炵幇绔埌绔簨浠舵祦鐨勭敤渚: 1. 鍙戝竷(鍐)鍜岃闃(璇)浜嬩欢娴侊紝鍖呮嫭浠庡叾浠栫郴缁熻繛缁鍏/瀵煎嚭鏁版嵁銆 2. 鎸佷箙鎬у拰鍙潬鍦板瓨鍌ㄤ簨浠舵祦锛屽彧瑕佷綘鎯炽 3. 鍦ㄤ簨浠跺彂鐢熸垨鍥為【鏃跺鐞嗕簨浠舵祦銆 + +鎵鏈夎繖浜涘姛鑳介兘鏄互鍒嗗竷寮忋侀珮搴﹀彲浼哥缉銆佸脊鎬с佸閿欏拰瀹夊叏鐨勬柟寮忔彁渚涚殑銆侹afka鍙互閮ㄧ讲鍦ㄨ8閲戝睘纭欢銆佽櫄鎷熸満鍜屽鍣ㄤ笂锛屼篃鍙互閮ㄧ讲鍦ㄤ簯涓娿傛偍鍙互閫夋嫨鑷鐞嗘偍鐨凨afka鐜鍜屼娇鐢ㄧ敱鍚勭渚涘簲鍟嗘彁渚涚殑瀹屽叏绠$悊鐨勬湇鍔° + +## 1.4 绠鑰岃█涔嬶紝Kafka鏄浣曞伐浣滅殑? + +Kafka鏄竴涓垎甯冨紡绯荤粺锛岀敱鏈嶅姟鍣ㄥ拰瀹㈡埛绔粍鎴愶紝閫氳繃楂樻ц兘鐨凾CP缃戠粶鍗忚杩涜閫氫俊銆傚畠鍙互閮ㄧ讲鍦ㄨ8閲戝睘纭欢銆佽櫄鎷熸満鍜屽唴閮ㄧ幆澧冧腑鐨勫鍣ㄤ笂锛屼篃鍙互閮ㄧ讲鍦ㄤ簯鐜涓 + +**鏈嶅姟鍣:**Kafka浣滀负涓涓泦缇よ繍琛屼竴涓垨澶氫釜鏈嶅姟鍣紝鍙互璺ㄨ秺澶氫釜鏁版嵁涓績鎴栦簯鍖哄煙銆傚叾涓竴浜涙湇鍔″櫒鏋勬垚瀛樺偍灞傦紝绉颁负浠g悊銆傚叾浠栨湇鍔″櫒杩愯Kafka Connect鏉ユ寔缁鍏ュ拰瀵煎嚭鏁版嵁浣滀负浜嬩欢娴侊紝灏咾afka涓庢偍鐜版湁鐨勭郴缁熼泦鎴愶紝濡傚叧绯绘暟鎹簱浠ュ強鍏朵粬Kafka闆嗙兢銆備负浜嗚浣犲疄鐜板叧閿换鍔$殑鐢ㄤ緥锛孠afka闆嗙兢鍏锋湁楂樺害鐨勫彲鎵╁睍鎬у拰瀹归敊鎬:濡傛灉瀹冪殑浠讳綍涓涓湇鍔″櫒鍙戠敓鏁呴殰锛屽叾浠栨湇鍔″櫒灏嗘帴绠″畠浠殑宸ヤ綔锛屼互纭繚鎸佺画鐨勬搷浣滆屼笉涓㈠け浠讳綍鏁版嵁銆 + +**瀹㈡埛鏈:**瀹冧滑鍏佽鎮ㄧ紪鍐欏垎甯冨紡搴旂敤绋嬪簭鍜屽井鏈嶅姟锛岃繖浜涘簲鐢ㄧ▼搴忓拰寰湇鍔″彲浠ュ苟琛屽湴銆佸ぇ瑙勬ā鍦拌鍙栥佸啓鍏ュ拰澶勭悊浜嬩欢娴侊紝鐢氳嚦鍦ㄥ嚭鐜扮綉缁滈棶棰樻垨鏈哄櫒鏁呴殰鐨勬儏鍐典笅涔熷彲浠ュ閿欍侹afka闄勫甫浜嗕竴浜涜繖鏍风殑瀹㈡埛绔紝杩欎簺瀹㈡埛绔Kafka绀惧尯鎻愪緵鐨勫嚑鍗佷釜瀹㈡埛绔寮轰簡:瀹㈡埛绔彲浠ョ敤浜嶫ava鍜孲cala锛屽寘鎷洿楂樼骇鍒殑Kafka Streams搴擄紝鐢ㄤ簬Go銆丳ython銆丆/ c++鍜岃澶氬叾浠栫紪绋嬭瑷浠ュ強REST api銆 + +## 1.5 涓昏姒傚康鍜屾湳璇 + +浜嬩欢璁板綍浜嗗湪涓栫晫涓婃垨浣犵殑浼佷笟涓滃彂鐢熶簡鏌愪簨鈥濈殑浜嬪疄銆傚湪鏂囨。涓篃绉颁负璁板綍鎴栨秷鎭傚綋浣犺鎴栧啓鏁版嵁鍒癒afka鏃讹紝浣犱互浜嬩欢鐨勫舰寮忓仛杩欎欢浜嬨備粠姒傚康涓婅锛屼簨浠跺叿鏈夐敭銆佸笺佹椂闂存埑鍜屽彲閫夌殑鍏冩暟鎹ご銆備笅闈㈡槸涓涓緥瀛: 1. 娲诲姩閲嶇偣:鈥滅埍涓戒笣鈥 2. 浜嬩欢鍊:鈥滃悜Bob鏀粯200缇庡厓鈥 3. 浜嬩欢鏃堕棿鎴:鈥2020骞6鏈25鏃ヤ笅鍗2:06銆傗 + +鐢熶骇鑰呮槸閭d簺鍚慘afka鍙戝竷(鍐)浜嬩欢鐨勫鎴风搴旂敤绋嬪簭锛岃屾秷璐硅呮槸閭d簺璁㈤槄(璇诲拰澶勭悊)杩欎簺浜嬩欢鐨勫簲鐢ㄧ▼搴忋傚湪Kafka涓紝鐢熶骇鑰呭拰娑堣垂鑰呮槸瀹屽叏瑙h︾殑锛屽郊姝ゆ槸涓嶅彲鐭ョ殑锛岃繖鏄疄鐜癒afka闂诲悕鐨勯珮鍙墿灞曟х殑涓涓叧閿璁″厓绱犮備緥濡傦紝鐢熶骇鑰呬粠涓嶉渶瑕佺瓑寰呮秷璐硅呫侹afka鎻愪緵浜嗗悇绉嶅悇鏍风殑淇濊瘉锛屾瘮濡傜簿纭鐞嗕竴娆′簨浠剁殑鑳藉姏銆 + +浜嬩欢琚粍缁囧苟鎸佷箙鍦板瓨鍌ㄥ湪涓婚涓傚緢绠鍗曪紝涓涓富棰樼被浼间簬鏂囦欢绯荤粺涓殑涓涓枃浠跺す锛屼簨浠跺氨鏄鏂囦欢澶逛腑鐨勬枃浠躲備竴涓ず渚嬩富棰樺悕绉板彲浠ユ槸鈥減ayments鈥濄侹afka涓殑涓婚鎬绘槸澶氱敓浜ц呭拰澶氳闃呰:涓涓富棰樺彲浠ユ湁0涓1涓垨澶氫釜鐢熶骇鑰呭悜瀹冨啓鍏ヤ簨浠讹紝涔熷彲浠ユ湁0涓1涓垨澶氫釜娑堣垂鑰呰闃呰繖浜涗簨浠躲備富棰樹腑鐨勪簨浠跺彲浠ユ牴鎹渶瑕佺粡甯歌鍙栤斺斾笌浼犵粺娑堟伅浼犻掔郴缁熶笉鍚岋紝浜嬩欢鍦ㄤ娇鐢ㄥ悗涓嶄細鍒犻櫎銆傜浉鍙嶏紝浣犲彲浠ラ氳繃姣忎釜涓婚鐨勯厤缃缃潵瀹氫箟Kafka搴旇淇濈暀浣犵殑浜嬩欢澶氶暱鏃堕棿锛屼箣鍚庢棫鐨勪簨浠跺皢琚涪寮冦侹afka鐨勬ц兘鐩稿浜庢暟鎹ぇ灏忔潵璇存槸涓嶅彉鐨勶紝鎵浠ラ暱鏃堕棿瀛樺偍鏁版嵁鏄畬鍏ㄥ彲浠ョ殑銆 + +涓婚鏄垎鍖虹殑锛岃繖鎰忓懗鐫涓涓富棰樺垎鏁e湪浣嶄簬涓嶅悓Kafka broker涓婄殑澶氫釜鈥滄《鈥濅笂銆傝繖绉嶆暟鎹殑鍒嗗竷寮忎綅缃浜庡彲浼哥缉鎬ч潪甯搁噸瑕侊紝鍥犱负瀹冨厑璁稿鎴锋満搴旂敤绋嬪簭鍚屾椂浠/鍚戝涓唬鐞嗚鍙栧拰鍐欏叆鏁版嵁銆傚綋涓涓柊浜嬩欢琚彂甯冨埌涓涓富棰樻椂锛屽畠瀹為檯涓婅闄勫姞鍒颁富棰樼殑涓涓垎鍖轰腑銆傚叿鏈夌浉鍚屼簨浠堕敭(渚嬪锛屽鎴锋垨杞﹁締ID)鐨勪簨浠惰鍐欏叆鍚屼竴涓垎鍖猴紝Kafka淇濊瘉浠讳綍缁欏畾涓婚鍒嗗尯鐨勬秷璐硅呴兘灏嗗缁堜互鍐欏叆鐨勫畬鍏ㄧ浉鍚岀殑椤哄簭璇诲彇璇ュ垎鍖虹殑浜嬩欢銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-39059344afb24ff7436bf7fb06bddde4_720w.webp) + +
+ +璁╀綘鐨勬暟鎹閿欏拰鍙敤鎬,姣忎竴涓富棰樺彲浠ヨ澶嶅埗,鐢氳嚦璺╣eo-regions鎴栨暟鎹腑蹇,杩欐牱鎬绘湁澶氫釜缁忕邯浜烘湁涓浠芥暟鎹互闃插嚭閿,浣犳兂鍋氫唬鐞嗙淮鎶,绛夌瓑銆備竴涓父瑙佺殑鐢熶骇璁剧疆鏄鍒跺洜瀛3锛屼篃灏辨槸璇达紝鎮ㄧ殑鏁版嵁鎬绘槸鏈変笁涓壇鏈傝繖涓鍒舵槸鍦ㄤ富棰樺垎鍖虹骇鍒墽琛岀殑銆 + +## 浜.Kafka绠浠 + +Kafka鏄竴绉嶆秷鎭槦鍒楋紝涓昏鐢ㄦ潵澶勭悊澶ч噺鏁版嵁鐘舵佷笅鐨勬秷鎭槦鍒楋紝涓鑸敤鏉ュ仛鏃ュ織鐨勫鐞嗐傛棦鐒舵槸娑堟伅闃熷垪锛岄偅涔圞afka涔熷氨鎷ユ湁娑堟伅闃熷垪鐨勭浉搴旂殑鐗规т簡銆 + +**娑堟伅闃熷垪鐨勫ソ澶** 1. 瑙h﹀悎 鑰﹀悎鐨勭姸鎬佽〃绀哄綋浣犲疄鐜版煇涓姛鑳界殑鏃跺欙紝鏄洿鎺ユ帴鍏ュ綋鍓嶆帴鍙o紝鑰屽埄鐢ㄦ秷鎭槦鍒楋紝鍙互灏嗙浉搴旂殑娑堟伅鍙戦佸埌娑堟伅闃熷垪锛岃繖鏍风殑璇濓紝濡傛灉鎺ュ彛鍑轰簡闂锛屽皢涓嶄細褰卞搷鍒板綋鍓嶇殑鍔熻兘銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-e37a18ea7eddc69582d634cc881eb257_720w.webp) + +
+ +1. 寮傛澶勭悊 寮傛澶勭悊鏇夸唬浜嗕箣鍓嶇殑鍚屾澶勭悊锛屽紓姝ュ鐞嗕笉闇瑕佽娴佺▼璧板畬灏辫繑鍥炵粨鏋滐紝鍙互灏嗘秷鎭彂閫佸埌娑堟伅闃熷垪涓紝鐒跺悗杩斿洖缁撴灉锛屽墿涓嬭鍏朵粬涓氬姟澶勭悊鎺ュ彛浠庢秷鎭槦鍒椾腑鎷夊彇娑堣垂澶勭悊鍗冲彲銆 + +2. 娴侀噺鍓婂嘲 楂樻祦閲忕殑鏃跺欙紝浣跨敤娑堟伅闃熷垪浣滀负涓棿浠跺彲浠ュ皢娴侀噺鐨勯珮宄颁繚瀛樺湪娑堟伅闃熷垪涓紝浠庤岄槻姝簡绯荤粺鐨勯珮璇锋眰锛屽噺杞绘湇鍔″櫒鐨勮姹傚鐞嗗帇鍔涖 + +## 2.1 Kafka娑堣垂妯″紡 + +Kafka鐨勬秷璐规ā寮忎富瑕佹湁涓ょ锛氫竴绉嶆槸涓瀵逛竴鐨勬秷璐癸紝涔熷嵆鐐瑰鐐圭殑閫氫俊锛屽嵆涓涓彂閫佷竴涓帴鏀躲傜浜岀涓轰竴瀵瑰鐨勬秷璐癸紝鍗充竴涓秷鎭彂閫佸埌娑堟伅闃熷垪锛屾秷璐硅呮牴鎹秷鎭槦鍒楃殑璁㈤槄鎷夊彇娑堟伅娑堣垂銆 + +**涓瀵逛竴** + +
+ + +![image-20230525200024084](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230525200024084.png) + +
+ +娑堟伅鐢熶骇鑰呭彂甯冩秷鎭埌Queue闃熷垪涓紝閫氱煡娑堣垂鑰呬粠闃熷垪涓媺鍙栨秷鎭繘琛屾秷璐广傛秷鎭娑堣垂涔嬪悗鍒欏垹闄わ紝Queue鏀寔澶氫釜娑堣垂鑰咃紝浣嗗浜庝竴鏉℃秷鎭岃█锛屽彧鏈変竴涓秷璐硅呭彲浠ユ秷璐癸紝鍗充竴鏉℃秷鎭彧鑳借涓涓秷璐硅呮秷璐广 + +**涓瀵瑰** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-d97a2898f3bdc417262bc88be616281c_720w.webp) + +
+ +杩欑妯″紡涔熺О涓哄彂甯/璁㈤槄妯″紡锛屽嵆鍒╃敤Topic瀛樺偍娑堟伅锛屾秷鎭敓浜ц呭皢娑堟伅鍙戝竷鍒癟opic涓紝鍚屾椂鏈夊涓秷璐硅呰闃呮topic锛屾秷璐硅呭彲浠ヤ粠涓秷璐规秷鎭紝娉ㄦ剰鍙戝竷鍒癟opic涓殑娑堟伅浼氳澶氫釜娑堣垂鑰呮秷璐癸紝娑堣垂鑰呮秷璐规暟鎹箣鍚庯紝鏁版嵁涓嶄細琚竻闄わ紝Kafka浼氶粯璁や繚鐣欎竴娈垫椂闂达紝鐒跺悗鍐嶅垹闄ゃ + +## 2.2 Kafka鐨勫熀纭鏋舵瀯 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-ef94691300117c049301d88c6337c9c2_720w.webp) + +
+ +Kafka鍍忓叾浠朚q涓鏍凤紝涔熸湁鑷繁鐨勫熀纭鏋舵瀯锛屼富瑕佸瓨鍦ㄧ敓浜ц匬roducer銆並afka闆嗙兢Broker銆佹秷璐硅匔onsumer銆佹敞鍐屼腑蹇僙ookeeper. + +1. Producer锛氭秷鎭敓浜ц咃紝鍚慘afka涓彂甯冩秷鎭殑瑙掕壊銆 + +2. Consumer锛氭秷鎭秷璐硅咃紝鍗充粠Kafka涓媺鍙栨秷鎭秷璐圭殑瀹㈡埛绔 + +3. Consumer Group锛氭秷璐硅呯粍锛屾秷璐硅呯粍鍒欐槸涓缁勪腑瀛樺湪澶氫釜娑堣垂鑰咃紝娑堣垂鑰呮秷璐笲roker涓綋鍓峊opic鐨勪笉鍚屽垎鍖轰腑鐨勬秷鎭紝娑堣垂鑰呯粍涔嬮棿浜掍笉褰卞搷锛屾墍鏈夌殑娑堣垂鑰呴兘灞炰簬鏌愪釜娑堣垂鑰呯粍锛屽嵆娑堣垂鑰呯粍鏄昏緫涓婄殑涓涓闃呰呫傛煇涓涓垎鍖轰腑鐨勬秷鎭彧鑳藉涓涓秷璐硅呯粍涓殑涓涓秷璐硅呮墍娑堣垂 + +4. Broker锛氱粡绾汉锛屼竴鍙癒afka鏈嶅姟鍣ㄥ氨鏄竴涓狟roker锛屼竴涓泦缇ょ敱澶氫釜Broker缁勬垚锛屼竴涓狟roker鍙互瀹圭撼澶氫釜Topic銆 + +5. Topic锛氫富棰橈紝鍙互鐞嗚В涓轰竴涓槦鍒楋紝鐢熶骇鑰呭拰娑堣垂鑰呴兘鏄潰鍚戜竴涓猅opic + +6. Partition锛氬垎鍖猴紝涓轰簡瀹炵幇鎵╁睍鎬э紝涓涓潪甯稿ぇ鐨凾opic鍙互鍒嗗竷鍒板涓狟roker涓婏紝涓涓猅opic鍙互鍒嗕负澶氫釜Partition锛屾瘡涓狿artition鏄竴涓湁搴忕殑闃熷垪(鍒嗗尯鏈夊簭锛屼笉鑳戒繚璇佸叏灞鏈夊簭) + +7. Replica锛氬壇鏈琑eplication锛屼负淇濊瘉闆嗙兢涓煇涓妭鐐瑰彂鐢熸晠闅滐紝鑺傜偣涓婄殑Partition鏁版嵁涓嶄涪澶憋紝Kafka鍙互姝e父鐨勫伐浣滐紝Kafka鎻愪緵浜嗗壇鏈満鍒讹紝涓涓猅opic鐨勬瘡涓垎鍖烘湁鑻ュ共涓壇鏈紝涓涓狶eader鍜屽涓狥ollower + +8. Leader锛氭瘡涓垎鍖哄涓壇鏈殑涓昏鑹诧紝鐢熶骇鑰呭彂閫佹暟鎹殑瀵硅薄锛屼互鍙婃秷璐硅呮秷璐规暟鎹殑瀵硅薄閮芥槸Leader銆 + +9. Follower锛氭瘡涓垎鍖哄涓壇鏈殑浠庤鑹诧紝瀹炴椂鐨勪粠Leader涓悓姝ユ暟鎹紝淇濇寔鍜孡eader鏁版嵁鐨勫悓姝ワ紝Leader鍙戠敓鏁呴殰鐨勬椂鍊欙紝鏌愪釜Follower浼氭垚涓烘柊鐨凩eader銆 + +涓婅堪涓涓猅opic浼氫骇鐢熷涓垎鍖篜artition锛屽垎鍖轰腑鍒嗕负Leader鍜孎ollower锛屾秷鎭竴鑸彂閫佸埌Leader锛孎ollower閫氳繃鏁版嵁鐨勫悓姝ヤ笌Leader淇濇寔鍚屾锛屾秷璐圭殑璇濅篃鏄湪Leader涓彂鐢熸秷璐癸紝濡傛灉澶氫釜娑堣垂鑰咃紝鍒欏垎鍒秷璐筁eader鍜屽悇涓狥ollower涓殑娑堟伅锛屽綋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鍏徃寮鍙戠殑涓涓垎甯冨紡鐨勬秷鎭郴缁燂紝鍚庢垚涓篈pache鐨勪竴閮ㄥ垎锛屽畠浣跨敤Scala缂栧啓锛屼互鍙按骞虫墿灞曞拰楂樺悶鍚愮巼鑰岃骞挎硾浣跨敤銆傜洰鍓嶈秺鏉ヨ秺澶氱殑寮婧愬垎甯冨紡澶勭悊绯荤粺濡侰loudera銆丄pache Storm銆丼park绛夐兘鏀寔涓嶬afka闆嗘垚銆 + +Kafka鍑熺潃鑷韩鐨勪紭鍔匡紝瓒婃潵瓒婂彈鍒颁簰鑱旂綉浼佷笟鐨勯潚鐫愶紝鍞搧浼氫篃閲囩敤Kafka浣滀负鍏跺唴閮ㄦ牳蹇冩秷鎭紩鎿庝箣涓銆侹afka浣滀负涓涓晢涓氱骇娑堟伅涓棿浠讹紝娑堟伅鍙潬鎬х殑閲嶈鎬у彲鎯宠岀煡銆傚浣曠‘淇濇秷鎭殑绮剧‘浼犺緭?濡備綍纭繚娑堟伅鐨勫噯纭瓨鍌?濡備綍纭繚娑堟伅鐨勬纭秷璐?杩欎簺閮芥槸闇瑕佽冭檻鐨勯棶棰樸傛湰鏂囬鍏堜粠Kafka鐨勬灦鏋勭潃鎵嬶紝鍏堜簡瑙d笅Kafka鐨勫熀鏈師鐞嗭紝鐒跺悗閫氳繃瀵筴akfa鐨勫瓨鍌ㄦ満鍒躲佸鍒跺師鐞嗐佸悓姝ュ師鐞嗐佸彲闈犳у拰鎸佷箙鎬т繚璇佺瓑绛変竴姝ユ瀵瑰叾鍙潬鎬ц繘琛屽垎鏋愶紝鏈鍚庨氳繃benchmark鏉ュ寮哄Kafka楂樺彲闈犳х殑璁ょ煡銆 + + + + + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 浜屻並afka鐨勪娇鐢ㄥ満鏅 + +锛1锛夋棩蹇楁敹闆嗭細涓涓叕鍙稿彲浠ョ敤Kafka鍙互鏀堕泦鍚勭鏈嶅姟鐨刲og锛岄氳繃kafka浠ョ粺涓鎺ュ彛鏈嶅姟鐨勬柟寮忓紑鏀剧粰鍚勭consumer锛屼緥濡侶adoop銆丠base銆丼olr绛夛紱 + +锛2锛夋秷鎭郴缁燂細瑙h﹀拰鐢熶骇鑰呭拰娑堣垂鑰呫佺紦瀛樻秷鎭瓑锛 + +锛3锛夌敤鎴锋椿鍔ㄨ窡韪細Kafka缁忓父琚敤鏉ヨ褰晈eb鐢ㄦ埛鎴栬卆pp鐢ㄦ埛鐨勫悇绉嶆椿鍔紝濡傛祻瑙堢綉椤点佹悳绱€佺偣鍑荤瓑娲诲姩锛岃繖浜涙椿鍔ㄤ俊鎭鍚勪釜鏈嶅姟鍣ㄥ彂甯冨埌kafka鐨則opic涓紝鐒跺悗璁㈤槄鑰呴氳繃璁㈤槄杩欎簺topic鏉ュ仛瀹炴椂鐨勭洃鎺у垎鏋愶紝鎴栬呰杞藉埌Hadoop銆佹暟鎹粨搴撲腑鍋氱绾垮垎鏋愬拰鎸栨帢锛 + +锛4锛夎繍钀ユ寚鏍囷細Kafka涔熺粡甯哥敤鏉ヨ褰曡繍钀ョ洃鎺ф暟鎹傚寘鎷敹闆嗗悇绉嶅垎甯冨紡搴旂敤鐨勬暟鎹紝鐢熶骇鍚勭鎿嶄綔鐨勯泦涓弽棣堬紝姣斿鎶ヨ鍜屾姤鍛婏紱 + +锛5锛夋祦寮忓鐞嗭細姣斿spark streaming鍜宻torm锛 + +锛6锛変簨浠舵簮锛 + + + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 涓夈並afka鍩烘湰鏋舵瀯 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181201215942487-1393117307.png) + +濡備笂鍥炬墍绀猴紝涓涓吀鍨嬬殑Kafka浣撶郴鏋舵瀯鍖呮嫭锛 + +* 鑻ュ共Producer(鍙互鏄湇鍔″櫒鏃ュ織锛屼笟鍔℃暟鎹紝椤甸潰鍓嶇浜х敓鐨刾age view绛夌瓑)锛 +* 鑻ュ共broker(Kafka鏀寔姘村钩鎵╁睍锛屼竴鑸琤roker鏁伴噺瓒婂锛岄泦缇ゅ悶鍚愮巼瓒婇珮)锛 +* 鑻ュ共Consumer (Group)锛屼互鍙婁竴涓猌ookeeper闆嗙兢銆 + +Kafka閫氳繃Zookeeper绠$悊闆嗙兢閰嶇疆锛岄変妇leader锛屼互鍙婂湪consumer group鍙戠敓鍙樺寲鏃惰繘琛宺ebalance銆侾roducer浣跨敤push(鎺)妯″紡灏嗘秷鎭彂甯冨埌broker锛孋onsumer浣跨敤pull(鎷)妯″紡浠巄roker璁㈤槄骞舵秷璐规秷鎭 + + + +### 1銆乀opic & Partition + +涓涓猼opic鍙互璁や负涓涓竴绫绘秷鎭紝姣忎釜topic灏嗚鍒嗘垚澶氫釜partition锛屾瘡涓猵artition鍦ㄥ瓨鍌ㄥ眰闈㈡槸append log鏂囦欢銆備换浣曞彂甯冨埌姝artition鐨勬秷鎭兘浼氳杩藉姞鍒發og鏂囦欢鐨勫熬閮紝姣忔潯娑堟伅鍦ㄦ枃浠朵腑鐨勪綅缃О涓簅ffset(鍋忕Щ閲)锛宱ffset涓轰竴涓猯ong鍨嬬殑鏁板瓧锛屽畠鍞竴鏍囪涓鏉℃秷鎭傛瘡鏉℃秷鎭兘琚玜ppend鍒皃artition涓紝鏄『搴忓啓纾佺洏锛屽洜姝ゆ晥鐜囬潪甯搁珮(缁忛獙璇侊紝椤哄簭鍐欑鐩樻晥鐜囨瘮闅忔満鍐欏唴瀛樿繕瑕侀珮锛岃繖鏄疜afka楂樺悶鍚愮巼鐨勪竴涓緢閲嶈鐨勪繚璇)銆 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181201220820060-2075971944.png) + +姣忎竴鏉℃秷鎭鍙戦佸埌broker涓紝浼氭牴鎹畃artition瑙勫垯閫夋嫨琚瓨鍌ㄥ埌鍝竴涓猵artition銆俻artition鏈哄埗鍙互閫氳繃鎸囧畾producer鐨刾artition.class杩欎竴鍙傛暟鏉ユ寚瀹氾紝璇lass蹇呴』瀹炵幇kafka.producer.Partitioner鎺ュ彛銆傚鏋減artition瑙勫垯璁剧疆鐨勫悎鐞嗭紝鎵鏈夋秷鎭彲浠ュ潎鍖鍒嗗竷鍒颁笉鍚岀殑partition閲岋紝杩欐牱灏卞疄鐜颁簡姘村钩鎵╁睍銆(濡傛灉涓涓猼opic瀵瑰簲涓涓枃浠讹紝閭h繖涓枃浠舵墍鍦ㄧ殑鏈哄櫒I/O灏嗕細鎴愪负杩欎釜topic鐨勬ц兘鐡堕锛岃宲artition瑙e喅浜嗚繖涓棶棰)銆傚湪鍒涘缓topic鏃跺彲浠ュ湪$KAFKA_HOME/config/server.properties涓寚瀹氳繖涓猵artition鐨勬暟閲(濡備笅鎵绀)锛屽綋鐒跺彲浠ュ湪topic鍒涘缓涔嬪悗鍘讳慨鏀筽artition鐨勬暟閲忋 + + + +
# 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鍦ㄦц兘鍜屽彲闈犳т箣闂磋繍杞殑娓稿垉鏈変綑銆侹afka浠0.8.x鐗堟湰寮濮嬫彁渚沺artition绾у埆鐨勫鍒,replication鐨勬暟閲忓彲浠ュ湪$KAFKA_HOME/config/server.properties涓厤缃(default.replication.refactor)銆 + +杩欓噷鍏堜粠Kafka鏂囦欢瀛樺偍鏈哄埗鍏ユ墜锛屼粠鏈搴曞眰浜嗚ВKafka鐨勫瓨鍌ㄧ粏鑺傦紝杩涜屽鍏剁殑瀛樺偍鏈変釜寰鐨勮鐭ャ備箣鍚庨氳繃Kafka澶嶅埗鍘熺悊鍜屽悓姝ユ柟寮忔潵闃愯堪瀹忚灞傞潰鐨勬蹇点傛渶鍚庝粠ISR锛孒W锛宭eader閫変妇浠ュ強鏁版嵁鍙潬鎬у拰鎸佷箙鎬т繚璇佺瓑绛夊悇涓淮搴︽潵涓板瘜瀵筀afka鐩稿叧鐭ヨ瘑鐐圭殑璁ょ煡銆 + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 浜斻並afka鏂囦欢瀛樺偍鏈哄埗 + +Kafka涓秷鎭槸浠opic杩涜鍒嗙被鐨勶紝鐢熶骇鑰呴氳繃topic鍚慘afka broker鍙戦佹秷鎭紝娑堣垂鑰呴氳繃topic璇诲彇鏁版嵁銆傜劧鑰宼opic鍦ㄧ墿鐞嗗眰闈㈠張鑳戒互partition涓哄垎缁勶紝涓涓猼opic鍙互鍒嗘垚鑻ュ共涓猵artition锛岄偅涔坱opic浠ュ強partition鍙堟槸鎬庝箞瀛樺偍鐨勫憿?partition杩樺彲浠ョ粏鍒嗕负segment锛屼竴涓猵artition鐗╃悊涓婄敱澶氫釜segment缁勬垚锛岄偅涔堣繖浜泂egment鍙堟槸浠涔堝憿?涓嬮潰鎴戜滑鏉ヤ竴涓鎻檽銆 + +涓轰簡渚夸簬璇存槑闂锛屽亣璁捐繖閲屽彧鏈変竴涓狵afka闆嗙兢锛屼笖杩欎釜闆嗙兢鍙湁涓涓狵afka broker锛屽嵆鍙湁涓鍙扮墿鐞嗘満銆傚湪杩欎釜Kafka broker涓厤缃($KAFKA_HOME/config/server.properties涓)log.dirs=/tmp/kafka-logs锛屼互姝ゆ潵璁剧疆Kafka娑堟伅鏂囦欢瀛樺偍鐩綍锛屼笌姝ゅ悓鏃跺垱寤轰竴涓猼opic锛歵opic_zzh_test锛宲artition鐨勬暟閲忎负4($KAFKA_HOME/bin/kafka-topics.sh 鈥揷reate 鈥搝ookeeper localhost:2181 鈥損artitions 4 鈥搕opic topic_vms_test 鈥搑eplication-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  
+ + + + +鍦↘afka鏂囦欢瀛樺偍涓紝鍚屼竴涓猼opic涓嬫湁澶氫釜涓嶅悓鐨刾artition锛屾瘡涓猵artiton涓轰竴涓洰褰曪紝partition鐨勫悕绉拌鍒欎负锛歵opic鍚嶇О+鏈夊簭搴忓彿锛岀涓涓簭鍙蜂粠0寮濮嬭锛屾渶澶х殑搴忓彿涓簆artition鏁伴噺鍑1锛宲artition鏄疄闄呯墿鐞嗕笂鐨勬蹇碉紝鑰宼opic鏄昏緫涓婄殑姒傚康銆 + +涓婇潰鎻愬埌partition杩樺彲浠ョ粏鍒嗕负segment锛岃繖涓猻egment鍙堟槸浠涔?濡傛灉灏变互partition涓烘渶灏忓瓨鍌ㄥ崟浣嶏紝鎴戜滑鍙互鎯宠薄褰揔afka producer涓嶆柇鍙戦佹秷鎭紝蹇呯劧浼氬紩璧穚artition鏂囦欢鐨勬棤闄愭墿寮狅紝杩欐牱瀵逛簬娑堟伅鏂囦欢鐨勭淮鎶や互鍙婂凡缁忚娑堣垂鐨勬秷鎭殑娓呯悊甯︽潵涓ラ噸鐨勫奖鍝嶏紝鎵浠ヨ繖閲屼互segment涓哄崟浣嶅張灏唒artition缁嗗垎銆傛瘡涓猵artition(鐩綍)鐩稿綋浜庝竴涓法鍨嬫枃浠惰骞冲潎鍒嗛厤鍒板涓ぇ灏忕浉绛夌殑segment(娈)鏁版嵁鏂囦欢涓(姣忎釜segment 鏂囦欢涓秷鎭暟閲忎笉涓瀹氱浉绛)杩欑鐗规т篃鏂逛究old segment鐨勫垹闄わ紝鍗虫柟渚垮凡琚秷璐圭殑娑堟伅鐨勬竻鐞嗭紝鎻愰珮纾佺洏鐨勫埄鐢ㄧ巼銆傛瘡涓猵artition鍙渶瑕佹敮鎸侀『搴忚鍐欏氨琛岋紝segment鐨勬枃浠剁敓鍛藉懆鏈熺敱鏈嶅姟绔厤缃弬鏁(log.segment.bytes锛宭og.roll.{ms,hours}绛夎嫢骞插弬鏁)鍐冲畾銆 + + + + + +[![澶嶅埗浠g爜](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "澶嶅埗浠g爜") + +
 #鍦ㄥ己鍒跺埛鏂版暟鎹埌纾佺洏鍏佽鎺ユ敹娑堟伅鐨勬暟閲
+#log.flush.interval.messages=10000 # 鍦ㄥ己鍒跺埛鏂颁箣鍓嶏紝娑堟伅鍙互鍦ㄦ棩蹇椾腑鍋滅暀鐨勬渶闀挎椂闂
+#log.flush.interval.ms=1000 #涓涓棩蹇楃殑鏈灏忓瓨娲绘椂闂达紝鍙互琚垹闄
+log.retention.hours=168 #  涓涓熀浜庡ぇ灏忕殑鏃ュ織淇濈暀绛栫暐銆傛灏嗚浠庢棩蹇椾腑鍒犻櫎鍙鍓╀笅鐨勯儴鍒嗘涓嶄綆浜巐og.retention.bytes銆
+#log.retention.bytes=1073741824 #  姣忎竴涓棩蹇楁澶у皬鐨勬渶澶у笺傚綋鍒拌揪杩欎釜澶у皬鏃讹紝浼氱敓鎴愪竴涓柊鐨勭墖娈点
+log.segment.bytes=1073741824 # 妫鏌ユ棩蹇楁鐨勬椂闂撮棿闅旓紝鐪嬫槸鍚﹀彲浠ユ牴鎹繚鐣欑瓥鐣ュ垹闄ゅ畠浠
+log.retention.check.interval.ms=300000
+ + +[![澶嶅埗浠g爜](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "澶嶅埗浠g爜") + + + +segment鏂囦欢鐢变袱閮ㄥ垎缁勬垚锛屽垎鍒负鈥.index鈥濇枃浠跺拰鈥.log鈥濇枃浠讹紝鍒嗗埆琛ㄧず涓簊egment绱㈠紩鏂囦欢鍜屾暟鎹枃浠躲傝繖涓や釜鏂囦欢鐨勫懡浠よ鍒欎负锛歱artition鍏ㄥ眬鐨勭涓涓猻egment浠0寮濮嬶紝鍚庣画姣忎釜segment鏂囦欢鍚嶄负涓婁竴涓猻egment鏂囦欢鏈鍚庝竴鏉℃秷鎭殑offset鍊硷紝鏁板煎ぇ灏忎负64浣嶏紝20浣嶆暟瀛楀瓧绗﹂暱搴︼紝娌℃湁鏁板瓧鐢0濉厖锛屽涓嬶細 + + + + + + + +[![澶嶅埗浠g爜](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "澶嶅埗浠g爜") + +
00000000000000000000.index 00000000000000000000.log 00000000000000170410.index 00000000000000170410.log 00000000000000239430.index 00000000000000239430.log  
+ +[![澶嶅埗浠g爜](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "澶嶅埗浠g爜") + + + +浠ヤ笂闈㈢殑segment鏂囦欢涓轰緥锛屽睍绀哄嚭segment锛00000000000000170410鐨勨.index鈥濇枃浠跺拰鈥.log鈥濇枃浠剁殑瀵瑰簲鐨勫叧绯伙紝濡備笅鍥撅細 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181201224133022-2085407889.png) + + + + + +濡備笂鍥撅紝鈥.index鈥濈储寮曟枃浠跺瓨鍌ㄥぇ閲忕殑鍏冩暟鎹紝鈥.log鈥濇暟鎹枃浠跺瓨鍌ㄥぇ閲忕殑娑堟伅锛岀储寮曟枃浠朵腑鐨勫厓鏁版嵁鎸囧悜瀵瑰簲鏁版嵁鏂囦欢涓璵essage鐨勭墿鐞嗗亸绉诲湴鍧銆傚叾涓互鈥.index鈥濈储寮曟枃浠朵腑鐨勫厓鏁版嵁[3, 348]涓轰緥锛屽湪鈥.log鈥濇暟鎹枃浠惰〃绀虹3涓秷鎭紝鍗冲湪鍏ㄥ眬partition涓〃绀170410+3=170413涓秷鎭紝璇ユ秷鎭殑鐗╃悊鍋忕Щ鍦板潃涓348銆 + +閭d箞濡備綍浠巔artition涓氳繃offset鏌ユ壘message鍛? + +浠ヤ笂鍥句负渚嬶紝璇诲彇offset=170418鐨勬秷鎭紝棣栧厛鏌ユ壘segment鏂囦欢锛屽叾涓00000000000000000000.index涓烘渶寮濮嬬殑鏂囦欢锛岀浜屼釜鏂囦欢涓00000000000000170410.index(璧峰鍋忕Щ涓170410+1=170411)锛岃岀涓変釜鏂囦欢涓00000000000000239430.index(璧峰鍋忕Щ涓239430+1=239431)锛屾墍浠ヨ繖涓猳ffset=170418灏辫惤鍒颁簡绗簩涓枃浠朵箣涓傚叾浠栧悗缁枃浠跺彲浠ヤ緷娆$被鎺紝浠ュ叾瀹炲亸绉婚噺鍛藉悕骞舵帓鍒楄繖浜涙枃浠讹紝鐒跺悗鏍规嵁浜屽垎鏌ユ壘娉曞氨鍙互蹇熷畾浣嶅埌鍏蜂綋鏂囦欢浣嶇疆銆傚叾娆℃牴鎹00000000000000170410.index鏂囦欢涓殑[8,1325]瀹氫綅鍒00000000000000170410.log鏂囦欢涓殑1325鐨勪綅缃繘琛岃鍙栥 + +瑕佹槸璇诲彇offset=170418鐨勬秷鎭紝浠00000000000000170410.log鏂囦欢涓殑1325鐨勪綅缃繘琛岃鍙栵紝閭d箞鎬庝箞鐭ラ亾浣曟椂璇诲畬鏈潯娑堟伅锛屽惁鍒欏氨璇诲埌涓嬩竴鏉℃秷鎭殑鍐呭浜? + +杩欎釜灏遍渶瑕佽仈绯诲埌娑堟伅鐨勭墿鐞嗙粨鏋勪簡锛屾秷鎭兘鍏锋湁鍥哄畾鐨勭墿鐞嗙粨鏋勶紝鍖呮嫭锛歰ffset(8 Bytes)銆佹秷鎭綋鐨勫ぇ灏(4 Bytes)銆乧rc32(4 Bytes)銆乵agic(1 Byte)銆乤ttributes(1 Byte)銆乲ey length(4 Bytes)銆乲ey(K Bytes)銆乸ayload(N Bytes)绛夌瓑瀛楁锛屽彲浠ョ‘瀹氫竴鏉℃秷鎭殑澶у皬锛屽嵆璇诲彇鍒板摢閲屾埅姝€ + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 鍏佸鍒跺師鐞嗗拰鍚屾鏂瑰紡 + +Kafka涓璽opic鐨勬瘡涓猵artition鏈変竴涓鍐欏紡鐨勬棩蹇楁枃浠讹紝铏界劧partition鍙互缁х画缁嗗垎涓鸿嫢骞蹭釜segment鏂囦欢锛屼絾鏄浜庝笂灞傚簲鐢ㄦ潵璇村彲浠ュ皢partition鐪嬫垚鏈灏忕殑瀛樺偍鍗曞厓(涓涓湁澶氫釜segment鏂囦欢鎷兼帴鐨勨滃法鍨嬧濇枃浠)锛屾瘡涓猵artition閮界敱涓浜涘垪鏈夊簭鐨勩佷笉鍙彉鐨勬秷鎭粍鎴愶紝杩欎簺娑堟伅琚繛缁殑杩藉姞鍒皃artition涓 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181201231403669-958736996.png) + +涓婂浘涓湁涓や釜鏂板悕璇嶏細HW鍜孡EO銆傝繖閲屽厛浠嬬粛涓婰EO锛孡ogEndOffset鐨勭缉鍐欙紝琛ㄧず姣忎釜partition鐨刲og鏈鍚庝竴鏉essage鐨勪綅缃侶W鏄疕ighWatermark鐨勭缉鍐欙紝鏄寚consumer鑳藉鐪嬪埌鐨勬partition鐨勪綅缃紝杩欎釜娑夊強鍒板鍓湰鐨勬蹇碉紝杩欓噷鍏堟彁鍙婁竴涓嬶紝涓嬭妭鍐嶈琛ㄣ + +瑷褰掓浼狅紝涓轰簡鎻愰珮娑堟伅鐨勫彲闈犳э紝Kafka姣忎釜topic鐨刾artition鏈塏涓壇鏈(replicas)锛屽叾涓璑(澶т簬绛変簬1)鏄痶opic鐨勫鍒跺洜瀛(replica fator)鐨勪釜鏁般侹afka閫氳繃澶氬壇鏈満鍒跺疄鐜版晠闅滆嚜鍔ㄨ浆绉伙紝褰揔afka闆嗙兢涓竴涓猙roker澶辨晥鎯呭喌涓嬩粛鐒朵繚璇佹湇鍔″彲鐢ㄣ傚湪Kafka涓彂鐢熷鍒舵椂纭繚partition鐨勬棩蹇楄兘鏈夊簭鍦板啓鍒板叾浠栬妭鐐逛笂锛孨涓猺eplicas涓紝鍏朵腑涓涓猺eplica涓簂eader锛屽叾浠栭兘涓篺ollower, leader澶勭悊partition鐨勬墍鏈夎鍐欒姹傦紝涓庢鍚屾椂锛宖ollower浼氳鍔ㄥ畾鏈熷湴鍘诲鍒秎eader涓婄殑鏁版嵁銆 + +濡備笅鍥炬墍绀猴紝Kafka闆嗙兢涓湁4涓猙roker, 鏌恡opic鏈3涓猵artition,涓斿鍒跺洜瀛愬嵆鍓湰涓暟涔熶负3锛 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181201231724531-2038730622.png) + +Kafka鎻愪緵浜嗘暟鎹鍒剁畻娉曚繚璇侊紝濡傛灉leader鍙戠敓鏁呴殰鎴栨寕鎺夛紝涓涓柊leader琚変妇骞惰鎺ュ彈瀹㈡埛绔殑娑堟伅鎴愬姛鍐欏叆銆侹afka纭繚浠庡悓姝ュ壇鏈垪琛ㄤ腑閫変妇涓涓壇鏈负leader锛屾垨鑰呰follower杩借刀leader鏁版嵁銆俵eader璐熻矗缁存姢鍜岃窡韪狪SR(In-Sync Replicas鐨勭缉鍐欙紝琛ㄧず鍓湰鍚屾闃熷垪锛屽叿浣撳彲鍙傝冧笅鑺)涓墍鏈塮ollower婊炲悗鐨勭姸鎬併傚綋producer鍙戦佷竴鏉℃秷鎭埌broker鍚庯紝leader鍐欏叆娑堟伅骞跺鍒跺埌鎵鏈塮ollower銆傛秷鎭彁浜や箣鍚庢墠琚垚鍔熷鍒跺埌鎵鏈夌殑鍚屾鍓湰銆傛秷鎭鍒跺欢杩熷彈鏈鎱㈢殑follower闄愬埗锛岄噸瑕佺殑鏄揩閫熸娴嬫參鍓湰锛屽鏋渇ollower鈥滆惤鍚庘濆お澶氭垨鑰呭け鏁堬紝leader灏嗕細鎶婂畠浠嶪SR涓垹闄ゃ + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 涓冦侀浂鎷疯礉 + +Kafka涓瓨鍦ㄥぇ閲忕殑缃戠粶鏁版嵁鎸佷箙鍖栧埌纾佺洏锛圥roducer鍒癇roker锛夊拰纾佺洏鏂囦欢閫氳繃缃戠粶鍙戦侊紙Broker鍒癈onsumer锛夌殑杩囩▼銆傝繖涓杩囩▼鐨勬ц兘鐩存帴褰卞搷Kafka鐨勬暣浣撳悶鍚愰噺銆 + + + +### 1銆佷紶缁熸ā寮忎笅鐨勫洓娆℃嫹璐濅笌鍥涙涓婁笅鏂囧垏鎹 + +浠ュ皢纾佺洏鏂囦欢閫氳繃缃戠粶鍙戦佷负渚嬨備紶缁熸ā寮忎笅锛屼竴鑸娇鐢ㄥ涓嬩吉浠g爜鎵绀虹殑鏂规硶鍏堝皢鏂囦欢鏁版嵁璇诲叆鍐呭瓨锛岀劧鍚庨氳繃Socket灏嗗唴瀛樹腑鐨勬暟鎹彂閫佸嚭鍘汇 + + + +
buffer = File.read
+Socket.send(buffer)
+ + + + +杩欎竴杩囩▼瀹為檯涓婂彂鐢熶簡鍥涙鏁版嵁鎷疯礉銆傞鍏堥氳繃绯荤粺璋冪敤灏嗘枃浠舵暟鎹鍏ュ埌鍐呮牳鎬丅uffer锛圖MA鎷疯礉锛夛紝鐒跺悗搴旂敤绋嬪簭灏嗗唴瀛樻丅uffer鏁版嵁璇诲叆鍒扮敤鎴锋丅uffer锛圕PU鎷疯礉锛夛紝鎺ョ潃鐢ㄦ埛绋嬪簭閫氳繃Socket鍙戦佹暟鎹椂灏嗙敤鎴锋丅uffer鏁版嵁鎷疯礉鍒板唴鏍告丅uffer锛圕PU鎷疯礉锛夛紝鏈鍚庨氳繃DMA鎷疯礉灏嗘暟鎹嫹璐濆埌NIC Buffer銆傚悓鏃讹紝杩樹即闅忕潃鍥涙涓婁笅鏂囧垏鎹紝濡備笅鍥炬墍绀恒 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181227142339448-1209004133.png) + +### 2銆乻endfile鍜宼ransferTo瀹炵幇闆舵嫹璐 + +Linux 2.4+鍐呮牳閫氳繃`sendfile`绯荤粺璋冪敤锛屾彁渚涗簡闆舵嫹璐濄傛暟鎹氳繃DMA鎷疯礉鍒板唴鏍告丅uffer鍚庯紝鐩存帴閫氳繃DMA鎷疯礉鍒癗IC Buffer锛屾棤闇CPU鎷疯礉銆傝繖涔熸槸闆舵嫹璐濊繖涓璇存硶鐨勬潵婧愩傞櫎浜嗗噺灏戞暟鎹嫹璐濆锛屽洜涓烘暣涓鏂囦欢-缃戠粶鍙戦佺敱涓涓猔sendfile`璋冪敤瀹屾垚锛屾暣涓繃绋嬪彧鏈変袱娆′笂涓嬫枃鍒囨崲锛屽洜姝ゅぇ澶ф彁楂樹簡鎬ц兘銆傞浂鎷疯礉杩囩▼濡備笅鍥炬墍绀恒 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181227142423000-1025665055.png) + +浠庡叿浣撳疄鐜版潵鐪嬶紝Kafka鐨勬暟鎹紶杈撻氳繃TransportLayer鏉ュ畬鎴愶紝鍏跺瓙绫籤PlaintextTransportLayer`閫氳繃[Java NIO](http://www.jasongj.com/java/nio_reactor/)鐨凢ileChannel鐨刞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锛堝壇鏈悓姝ラ槦鍒楋級 + +涓婅妭鎴戜滑娑夊強鍒癐SR (In-Sync Replicas)锛岃繖涓槸鎸囧壇鏈悓姝ラ槦鍒椼傚壇鏈暟瀵筀afka鐨勫悶鍚愮巼鏄湁涓瀹氱殑褰卞搷锛屼絾鏋佸ぇ鐨勫寮轰簡鍙敤鎬с傞粯璁ゆ儏鍐典笅Kafka鐨剅eplica鏁伴噺涓1锛屽嵆姣忎釜partition閮芥湁涓涓敮涓鐨刲eader锛屼负浜嗙‘淇濇秷鎭殑鍙潬鎬э紝閫氬父搴旂敤涓皢鍏跺(鐢眀roker鐨勫弬鏁皁ffsets.topic.replication.factor鎸囧畾)澶у皬璁剧疆涓哄ぇ浜1锛屾瘮濡3銆 鎵鏈夌殑鍓湰(replicas)缁熺О涓篈ssigned Replicas锛屽嵆AR銆侷SR鏄疉R涓殑涓涓瓙闆嗭紝鐢眑eader缁存姢ISR鍒楄〃锛宖ollower浠巐eader鍚屾鏁版嵁鏈変竴浜涘欢杩(鍖呮嫭寤惰繜鏃堕棿replica.lag.time.max.ms鍜屽欢杩熸潯鏁皉eplica.lag.max.messages涓や釜缁村害, 褰撳墠鏈鏂扮殑鐗堟湰0.10.x涓彧鏀寔replica.lag.time.max.ms杩欎釜缁村害)锛屼换鎰忎竴涓秴杩囬槇鍊奸兘浼氭妸follower鍓旈櫎鍑篒SR, 瀛樺叆OSR(Outof-Sync Replicas)鍒楄〃锛屾柊鍔犲叆鐨刦ollower涔熶細鍏堝瓨鏀惧湪OSR涓侫R=ISR+OSR + +Kafka 0.10.x鐗堟湰鍚庣Щ闄や簡replica.lag.max.messages鍙傛暟锛屽彧淇濈暀浜唕eplica.lag.time.max.ms浣滀负ISR涓壇鏈鐞嗙殑鍙傛暟銆備负浠涔堣繖鏍峰仛鍛?replica.lag.max.messages琛ㄧず褰撳墠鏌愪釜鍓湰钀藉悗leaeder鐨勬秷鎭暟閲忚秴杩囦簡杩欎釜鍙傛暟鐨勫硷紝閭d箞leader灏变細鎶奻ollower浠嶪SR涓垹闄ゃ傚亣璁捐缃畆eplica.lag.max.messages=4锛岄偅涔堝鏋減roducer涓娆′紶閫佽嚦broker鐨勬秷鎭暟閲忛兘灏忎簬4鏉℃椂锛屽洜涓哄湪leader鎺ュ彈鍒皃roducer鍙戦佺殑娑堟伅涔嬪悗鑰宖ollower鍓湰寮濮嬫媺鍙栬繖浜涙秷鎭箣鍓嶏紝follower钀藉悗leader鐨勬秷鎭暟涓嶄細瓒呰繃4鏉℃秷鎭紝鏁呮娌℃湁follower绉诲嚭ISR锛屾墍浠ヨ繖鏃跺檙eplica.lag.max.message鐨勮缃技涔庢槸鍚堢悊鐨勩備絾鏄痯roducer鍙戣捣鐬椂楂樺嘲娴侀噺锛宲roducer涓娆″彂閫佺殑娑堟伅瓒呰繃4鏉℃椂锛屼篃灏辨槸瓒呰繃replica.lag.max.messages锛屾鏃秄ollower閮戒細琚涓烘槸涓巐eader鍓湰涓嶅悓姝ヤ簡锛屼粠鑰岃韪㈠嚭浜咺SR銆備絾瀹為檯涓婅繖浜沠ollower閮芥槸瀛樻椿鐘舵佺殑涓旀病鏈夋ц兘闂銆傞偅涔堝湪涔嬪悗杩戒笂leader,骞惰閲嶆柊鍔犲叆浜咺SR銆備簬鏄氨浼氬嚭鐜板畠浠笉鏂湴鍓斿嚭ISR鐒跺悗閲嶆柊鍥炲綊ISR锛岃繖鏃犵枒澧炲姞浜嗘棤璋撶殑鎬ц兘鎹熻椼傝屼笖杩欎釜鍙傛暟鏄痓roker鍏ㄥ眬鐨勩傝缃お澶т簡锛屽奖鍝嶇湡姝b滆惤鍚庘漟ollower鐨勭Щ闄;璁剧疆鐨勫お灏忎簡锛屽鑷磃ollower鐨勯绻佽繘鍑恒傛棤娉曠粰瀹氫竴涓悎閫傜殑replica.lag.max.messages鐨勫硷紝鏁呮锛屾柊鐗堟湰鐨凨afka绉婚櫎浜嗚繖涓弬鏁般傛敞锛欼SR涓寘鎷細leader鍜宖ollower銆 + + + +涓婇潰涓鑺傝繕娑夊強鍒颁竴涓蹇碉紝鍗矵W銆侶W淇楃О楂樻按浣嶏紝HighWatermark鐨勭缉鍐欙紝鍙栦竴涓猵artition瀵瑰簲鐨処SR涓渶灏忕殑LEO浣滀负HW锛宑onsumer鏈澶氬彧鑳芥秷璐瑰埌HW鎵鍦ㄧ殑浣嶇疆銆傚彟澶栨瘡涓猺eplica閮芥湁HW,leader鍜宖ollower鍚勮嚜璐熻矗鏇存柊鑷繁鐨凥W鐨勭姸鎬併傚浜巐eader鏂板啓鍏ョ殑娑堟伅锛宑onsumer涓嶈兘绔嬪埢娑堣垂锛宭eader浼氱瓑寰呰娑堟伅琚墍鏈塈SR涓殑replicas鍚屾鍚庢洿鏂癏W锛屾鏃舵秷鎭墠鑳借consumer娑堣垂銆傝繖鏍峰氨淇濊瘉浜嗗鏋渓eader鎵鍦ㄧ殑broker澶辨晥锛岃娑堟伅浠嶇劧鍙互浠庢柊閫変妇鐨刲eader涓幏鍙栥傚浜庢潵鑷唴閮╞roKer鐨勮鍙栬姹傦紝娌℃湁HW鐨勯檺鍒躲 + +涓嬪浘璇︾粏鐨勮鏄庝簡褰損roducer鐢熶骇娑堟伅鑷砨roker鍚庯紝ISR浠ュ強HW鍜孡EO鐨勬祦杞繃绋嬶細 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181202175002622-1830127657.png) + +鐢辨鍙锛孠afka鐨勫鍒舵満鍒舵棦涓嶆槸瀹屽叏鐨勫悓姝ュ鍒讹紝涔熶笉鏄崟绾殑寮傛澶嶅埗銆備簨瀹炰笂锛屽悓姝ュ鍒惰姹傛墍鏈夎兘宸ヤ綔鐨刦ollower閮藉鍒跺畬锛岃繖鏉℃秷鎭墠浼氳commit锛岃繖绉嶅鍒舵柟寮忔瀬澶х殑褰卞搷浜嗗悶鍚愮巼銆傝屽紓姝ュ鍒舵柟寮忎笅锛宖ollower寮傛鐨勪粠leader澶嶅埗鏁版嵁锛屾暟鎹彧瑕佽leader鍐欏叆log灏辫璁や负宸茬粡commit锛岃繖绉嶆儏鍐典笅濡傛灉follower閮借繕娌℃湁澶嶅埗瀹岋紝钀藉悗浜巐eader鏃讹紝绐佺劧leader瀹曟満锛屽垯浼氫涪澶辨暟鎹傝孠afka鐨勮繖绉嶄娇鐢↖SR鐨勬柟寮忓垯寰堝ソ鐨勫潎琛′簡纭繚鏁版嵁涓嶄涪澶变互鍙婂悶鍚愮巼銆 + +Kafka鐨処SR鐨勭鐞嗘渶缁堥兘浼氬弽棣堝埌Zookeeper鑺傜偣涓娿傚叿浣撲綅缃负锛/brokers/topics/[topic]/partitions/[partition]/state銆 + +鐩墠鏈変袱涓湴鏂逛細瀵硅繖涓猌ookeeper鐨勮妭鐐硅繘琛岀淮鎶わ細 + +Controller鏉ョ淮鎶わ細Kafka闆嗙兢涓殑鍏朵腑涓涓狟roker浼氳閫変妇涓篊ontroller锛屼富瑕佽礋璐artition绠$悊鍜屽壇鏈姸鎬佺鐞嗭紝涔熶細鎵ц绫讳技浜庨噸鍒嗛厤partition涔嬬被鐨勭鐞嗕换鍔°傚湪绗﹀悎鏌愪簺鐗瑰畾鏉′欢涓嬶紝Controller涓嬬殑LeaderSelector浼氶変妇鏂扮殑leader锛孖SR鍜屾柊鐨刲eader_epoch鍙奵ontroller_epoch鍐欏叆Zookeeper鐨勭浉鍏宠妭鐐逛腑銆傚悓鏃跺彂璧稬eaderAndIsrRequest閫氱煡鎵鏈夌殑replicas銆 + +leader鏉ョ淮鎶わ細leader鏈夊崟鐙殑绾跨▼瀹氭湡妫娴婭SR涓璮ollower鏄惁鑴辩ISR, 濡傛灉鍙戠幇ISR鍙樺寲锛屽垯浼氬皢鏂扮殑ISR鐨勪俊鎭繑鍥炲埌Zookeeper鐨勭浉鍏宠妭鐐逛腑銆 + + + + + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 涔濄佹暟鎹彲闈犳у拰鎸佷箙鎬т繚璇 + +褰損roducer鍚憀eader鍙戦佹暟鎹椂锛屽彲浠ラ氳繃request.required.acks鍙傛暟鏉ヨ缃暟鎹彲闈犳х殑绾у埆锛 + + + +* 1(榛樿)锛氳繖鎰忓懗鐫producer鍦↖SR涓殑leader宸叉垚鍔熸敹鍒扮殑鏁版嵁骞跺緱鍒扮‘璁ゅ悗鍙戦佷笅涓鏉essage銆傚鏋渓eader瀹曟満浜嗭紝鍒欎細涓㈠け鏁版嵁銆 + +* 0锛氳繖鎰忓懗鐫producer鏃犻渶绛夊緟鏉ヨ嚜broker鐨勭‘璁よ岀户缁彂閫佷笅涓鎵规秷鎭傝繖绉嶆儏鍐典笅鏁版嵁浼犺緭鏁堢巼鏈楂橈紝浣嗘槸鏁版嵁鍙潬鎬х‘鏄渶浣庣殑銆 + +* -1锛歱roducer闇瑕佺瓑寰匢SR涓殑鎵鏈塮ollower閮界‘璁ゆ帴鏀跺埌鏁版嵁鍚庢墠绠椾竴娆″彂閫佸畬鎴愶紝鍙潬鎬ф渶楂樸備絾鏄繖鏍蜂篃涓嶈兘淇濊瘉鏁版嵁涓嶄涪澶憋紝姣斿褰揑SR涓彧鏈塴eader鏃(鍓嶉潰ISR閭d竴鑺傝鍒帮紝ISR涓殑鎴愬憳鐢变簬鏌愪簺鎯呭喌浼氬鍔犱篃浼氬噺灏戯紝鏈灏戝氨鍙墿涓涓猯eader)锛岃繖鏍峰氨鍙樻垚浜哸cks=1鐨勬儏鍐点 + + [瀹樼綉閰嶇疆璇存槑](http://kafka.apache.org/documentation/#configuration) + +濡傛灉瑕佹彁楂樻暟鎹殑鍙潬鎬э紝鍦ㄨ缃畆equest.required.acks=-1鐨勫悓鏃讹紝涔熻min.insync.replicas杩欎釜鍙傛暟(鍙互鍦╞roker鎴栬卼opic灞傞潰杩涜璁剧疆)鐨勯厤鍚堬紝杩欐牱鎵嶈兘鍙戞尌鏈澶х殑鍔熸晥銆俶in.insync.replicas杩欎釜鍙傛暟璁惧畾ISR涓殑鏈灏忓壇鏈暟鏄灏戯紝榛樿鍊间负1锛屽綋涓斾粎褰搑equest.required.acks鍙傛暟璁剧疆涓-1鏃讹紝姝ゅ弬鏁版墠鐢熸晥銆傚鏋淚SR涓殑鍓湰鏁板皯浜巑in.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銆乺equest.required.acks=1 + +producer鍙戦佹暟鎹埌leader锛宭eader鍐欐湰鍦版棩蹇楁垚鍔燂紝杩斿洖瀹㈡埛绔垚鍔;姝ゆ椂ISR涓殑鍓湰杩樻病鏈夋潵寰楀強鎷夊彇璇ユ秷鎭紝leader灏卞畷鏈轰簡锛岄偅涔堟娆″彂閫佺殑娑堟伅灏变細涓㈠け銆 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181202181329621-1088596676.png) + + + +### 9.2銆乺equest.required.acks=-1 + +鍚屾(Kafka榛樿涓哄悓姝ワ紝鍗硃roducer.type=sync)鐨勫彂閫佹ā寮忥紝replication.factor>=2涓攎in.insync.replicas>=2鐨勬儏鍐典笅锛屼笉浼氫涪澶辨暟鎹 + +鏈変袱绉嶅吀鍨嬫儏鍐点俛cks=-1鐨勬儏鍐典笅(濡傛棤鐗规畩璇存槑锛屼互涓媋cks閮借〃绀轰负鍙傛暟request.required.acks)锛屾暟鎹彂閫佸埌leader, ISR鐨刦ollower鍏ㄩ儴瀹屾垚鏁版嵁鍚屾鍚庯紝leader姝ゆ椂鎸傛帀锛岄偅涔堜細閫変妇鍑烘柊鐨刲eader锛屾暟鎹笉浼氫涪澶便 + +![](https://img2018.cnblogs.com/blog/843808/201812/843808-20181202212242480-242555451.png) + +acks=-1鐨勬儏鍐典笅锛屾暟鎹彂閫佸埌leader鍚 锛岄儴鍒咺SR鐨勫壇鏈悓姝ワ紝leader姝ゆ椂鎸傛帀銆傛瘮濡俧ollower1h鍜宖ollower2閮芥湁鍙兘鍙樻垚鏂扮殑leader, producer绔細寰楀埌杩斿洖寮傚父锛宲roducer绔細閲嶆柊鍙戦佹暟鎹紝鏁版嵁鍙兘浼氶噸澶 +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181202212407453-662912091.png) + +褰撶劧涓婂浘涓鏋滃湪leader crash鐨勬椂鍊欙紝follower2杩樻病鏈夊悓姝ュ埌浠讳綍鏁版嵁锛岃屼笖follower2琚変妇涓烘柊鐨刲eader鐨勮瘽锛岃繖鏍锋秷鎭氨涓嶄細閲嶅銆 + +娉細Kafka鍙鐞唂ail/recover闂,涓嶅鐞咮yzantine闂銆 + + + + + +### 9.3銆佸叧浜嶩W鐨勮繘涓姝ユ帰璁 + +鑰冭檻涓婂浘(鍗砤cks=-1,閮ㄥ垎ISR鍓湰鍚屾)涓殑鍙︿竴绉嶆儏鍐碉紝濡傛灉鍦↙eader鎸傛帀鐨勬椂鍊欙紝follower1鍚屾浜嗘秷鎭4,5锛宖ollower2鍚屾浜嗘秷鎭4锛屼笌姝ゅ悓鏃秄ollower2琚変妇涓簂eader锛岄偅涔堟鏃秄ollower1涓殑澶氬嚭鐨勬秷鎭5璇ュ仛濡備綍澶勭悊鍛? + +杩欓噷灏遍渶瑕丠W鐨勫崗鍚岄厤鍚堜簡銆傚鍓嶆墍杩帮紝涓涓猵artition涓殑ISR鍒楄〃涓紝leader鐨凥W鏄墍鏈塈SR鍒楄〃閲屽壇鏈腑鏈灏忕殑閭d釜鐨凩EO銆傜被浼间簬鏈ㄦ《鍘熺悊锛屾按浣嶅彇鍐充簬鏈浣庨偅鍧楃煭鏉裤 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181203204010599-1107873190.png) + + + +濡備笂鍥撅紝鏌愪釜topic鐨勬煇partition鏈変笁涓壇鏈紝鍒嗗埆涓篈銆丅銆丆銆侫浣滀负leader鑲畾鏄疞EO鏈楂橈紝B绱ч殢鍏跺悗锛孋鏈哄櫒鐢变簬閰嶇疆姣旇緝浣庯紝缃戠粶姣旇緝宸紝鏁呰屽悓姝ユ渶鎱€傝繖涓椂鍊橝鏈哄櫒瀹曟満锛岃繖鏃跺欏鏋淏鎴愪负leader锛屽亣濡傛病鏈塇W锛屽湪A閲嶆柊鎭㈠涔嬪悗浼氬仛鍚屾(makeFollower)鎿嶄綔锛屽湪瀹曟満鏃秎og鏂囦欢涔嬪悗鐩存帴鍋氳拷鍔犳搷浣滐紝鑰屽亣濡侭鐨凩EO宸茬粡杈惧埌浜咥鐨凩EO锛屼細浜х敓鏁版嵁涓嶄竴鑷寸殑鎯呭喌锛屾墍浠ヤ娇鐢℉W鏉ラ伩鍏嶈繖绉嶆儏鍐点 + +A鍦ㄥ仛鍚屾鎿嶄綔鐨勬椂鍊欙紝鍏堝皢log鏂囦欢鎴柇鍒颁箣鍓嶈嚜宸辩殑HW鐨勪綅缃紝鍗3锛屼箣鍚庡啀浠嶣涓媺鍙栨秷鎭繘琛屽悓姝ャ + +濡傛灉澶辫触鐨刦ollower鎭㈠杩囨潵锛屽畠棣栧厛灏嗚嚜宸辩殑log鏂囦欢鎴柇鍒颁笂娆heckpointed鏃跺埢鐨凥W鐨勪綅缃紝涔嬪悗鍐嶄粠leader涓悓姝ユ秷鎭俵eader鎸傛帀浼氶噸鏂伴変妇锛屾柊鐨刲eader浼氬彂閫佲滄寚浠も濊鍏朵綑鐨刦ollower鎴柇鑷宠嚜韬殑HW鐨勪綅缃劧鍚庡啀鎷夊彇鏂扮殑娑堟伅銆 + +褰揑SR涓殑涓壇鏈殑LEO涓嶄竴鑷存椂锛屽鏋滄鏃秎eader鎸傛帀锛岄変妇鏂扮殑leader鏃跺苟涓嶆槸鎸夌収LEO鐨勯珮浣庤繘琛岄変妇锛岃屾槸鎸夌収ISR涓殑椤哄簭閫変妇銆 + + + + + +### 9.4銆丩eader閫変妇 + +涓鏉℃秷鎭彧鏈夎ISR涓殑鎵鏈塮ollower閮戒粠leader澶嶅埗杩囧幓鎵嶄細琚涓哄凡鎻愪氦銆傝繖鏍峰氨閬垮厤浜嗛儴鍒嗘暟鎹鍐欒繘浜唋eader锛岃繕娌℃潵寰楀強琚换浣昮ollower澶嶅埗灏卞畷鏈轰簡锛岃岄犳垚鏁版嵁涓㈠け銆傝屽浜巔roducer鑰岃█锛屽畠鍙互閫夋嫨鏄惁绛夊緟娑堟伅commit锛岃繖鍙互閫氳繃request.required.acks鏉ヨ缃傝繖绉嶆満鍒剁‘淇濅簡鍙ISR涓湁涓涓垨鑰呬互涓婄殑follower锛屼竴鏉¤commit鐨勬秷鎭氨涓嶄細涓㈠け銆 + +鏈変竴涓緢閲嶈鐨勯棶棰樻槸褰搇eader瀹曟満浜嗭紝鎬庢牱鍦╢ollower涓変妇鍑烘柊鐨刲eader锛屽洜涓篺ollower鍙兘钀藉悗寰堝鎴栬呯洿鎺rash浜嗭紝鎵浠ュ繀椤荤‘淇濋夋嫨鈥滄渶鏂扳濈殑follower浣滀负鏂扮殑leader銆備竴涓熀鏈殑鍘熷垯灏辨槸锛屽鏋渓eader涓嶅湪浜嗭紝鏂扮殑leader蹇呴』鎷ユ湁鍘熸潵鐨刲eader commit鐨勬墍鏈夋秷鎭傝繖灏遍渶瑕佸仛涓涓姌涓紝濡傛灉leader鍦ㄨ〃鍚嶄竴涓秷鎭commit鍓嶇瓑寰呮洿澶氱殑follower纭锛岄偅涔堝湪瀹冩寕鎺変箣鍚庡氨鏈夋洿澶氱殑follower鍙互鎴愪负鏂扮殑leader锛屼絾杩欎篃浼氶犳垚鍚炲悙鐜囩殑涓嬮檷銆 + +涓绉嶉潪甯稿父鐢ㄧ殑閫変妇leader鐨勬柟寮忔槸鈥滃皯鏁版湇浠庡鏁扳濓紝Kafka骞朵笉鏄噰鐢ㄨ繖绉嶆柟寮忋傝繖绉嶆ā寮忎笅锛屽鏋滄垜浠湁2f+1涓壇鏈紝閭d箞鍦╟ommit涔嬪墠蹇呴』淇濊瘉鏈塮+1涓猺eplica澶嶅埗瀹屾秷鎭紝鍚屾椂涓轰簡淇濊瘉鑳芥纭変妇鍑烘柊鐨刲eader锛屽け璐ョ殑鍓湰鏁颁笉鑳借秴杩噁涓傝繖绉嶆柟寮忔湁涓緢澶х殑浼樺娍锛岀郴缁熺殑寤惰繜鍙栧喅浜庢渶蹇殑鍑犲彴鏈哄櫒锛屼篃灏辨槸璇存瘮濡傚壇鏈暟涓3锛岄偅涔堝欢杩熷氨鍙栧喅浜庢渶蹇殑閭d釜follower鑰屼笉鏄渶鎱㈢殑閭d釜銆傗滃皯鏁版湇浠庡鏁扳濈殑鏂瑰紡涔熸湁涓浜涘姡鍔匡紝涓轰簡淇濊瘉leader閫変妇鐨勬甯歌繘琛岋紝瀹冩墍鑳藉蹇嶇殑澶辫触鐨刦ollower鏁版瘮杈冨皯锛屽鏋滆瀹瑰繊1涓猣ollower鎸傛帀锛岄偅涔堣嚦灏戣3涓互涓婄殑鍓湰锛屽鏋滆瀹瑰繊2涓猣ollower鎸傛帀锛屽繀椤昏鏈5涓互涓婄殑鍓湰銆備篃灏辨槸璇达紝鍦ㄧ敓浜х幆澧冧笅涓轰簡淇濊瘉杈冮珮鐨勫閿欑巼锛屽繀椤昏鏈夊ぇ閲忕殑鍓湰锛岃屽ぇ閲忕殑鍓湰鍙堜細鍦ㄥぇ鏁版嵁閲忎笅瀵艰嚧鎬ц兘鐨勬ュ墽涓嬮檷銆傝繖绉嶇畻娉曟洿澶氱敤鍦╖ookeeper杩欑鍏变韩闆嗙兢閰嶇疆鐨勭郴缁熶腑鑰屽緢灏戝湪闇瑕佸ぇ閲忔暟鎹殑绯荤粺涓娇鐢ㄧ殑鍘熷洜銆侶DFS鐨凥A鍔熻兘涔熸槸鍩轰簬鈥滃皯鏁版湇浠庡鏁扳濈殑鏂瑰紡锛屼絾鏄叾鏁版嵁瀛樺偍骞朵笉鏄噰鐢ㄨ繖鏍风殑鏂瑰紡銆 + +瀹為檯涓婏紝leader閫変妇鐨勭畻娉曢潪甯稿锛屾瘮濡俍ookeeper鐨刏ab銆丷aft浠ュ強Viewstamped Replication銆傝孠afka鎵浣跨敤鐨刲eader閫変妇绠楁硶鏇村儚鏄井杞殑PacificA绠楁硶銆 + +Kafka鍦╖ookeeper涓负姣忎竴涓猵artition鍔ㄦ佺殑缁存姢浜嗕竴涓狪SR锛岃繖涓狪SR閲岀殑鎵鏈塺eplication閮借窡涓婁簡leader锛屽彧鏈塈SR閲岀殑鎴愬憳鎵嶈兘鏈夎閫変负leader鐨勫彲鑳(unclean.leader.election.enable=false)銆傚湪杩欑妯″紡涓嬶紝瀵逛簬f+1涓壇鏈紝涓涓狵afka topic鑳藉湪淇濊瘉涓嶄涪澶卞凡缁廲ommit娑堟伅鐨勫墠鎻愪笅瀹瑰繊f涓壇鏈殑澶辫触锛屽湪澶у鏁颁娇鐢ㄥ満鏅笅锛岃繖绉嶆ā寮忔槸鍗佸垎鏈夊埄鐨勩備簨瀹炰笂锛屼负浜嗗蹇峟涓壇鏈殑澶辫触锛屸滃皯鏁版湇浠庡鏁扳濈殑鏂瑰紡鍜孖SR鍦╟ommit鍓嶉渶瑕佺瓑寰呯殑鍓湰鐨勬暟閲忔槸涓鏍风殑锛屼絾鏄疘SR闇瑕佺殑鎬荤殑鍓湰鐨勪釜鏁板嚑涔庢槸鈥滃皯鏁版湇浠庡鏁扳濈殑鏂瑰紡鐨勪竴鍗娿 + +涓婃枃鎻愬埌锛屽湪ISR涓嚦灏戞湁涓涓猣ollower鏃讹紝Kafka鍙互纭繚宸茬粡commit鐨勬暟鎹笉涓㈠け锛屼絾濡傛灉鏌愪竴涓猵artition鐨勬墍鏈塺eplica閮芥寕浜嗭紝灏辨棤娉曚繚璇佹暟鎹笉涓㈠け浜嗐傝繖绉嶆儏鍐典笅鏈変袱绉嶅彲琛岀殑鏂规锛 + +绛夊緟ISR涓换鎰忎竴涓猺eplica鈥滄椿鈥濊繃鏉ワ紝骞朵笖閫夊畠浣滀负leader + +閫夋嫨绗竴涓滄椿鈥濊繃鏉ョ殑replica(骞朵笉涓瀹氭槸鍦↖SR涓)浣滀负leader + +杩欏氨闇瑕佸湪鍙敤鎬у拰涓鑷存у綋涓綔鍑轰竴涓畝鍗曠殑鎶夋嫨銆傚鏋滀竴瀹氳绛夊緟ISR涓殑replica鈥滄椿鈥濊繃鏉ワ紝閭d笉鍙敤鐨勬椂闂村氨鍙兘浼氱浉瀵硅緝闀裤傝屼笖濡傛灉ISR涓墍鏈夌殑replica閮芥棤娉曗滄椿鈥濊繃鏉ヤ簡锛屾垨鑰呮暟鎹涪澶变簡锛岃繖涓猵artition灏嗘案杩滀笉鍙敤銆傞夋嫨绗竴涓滄椿鈥濊繃鏉ョ殑replica浣滀负leader,鑰岃繖涓猺eplica涓嶆槸ISR涓殑replica,閭e嵆浣垮畠骞朵笉淇濋殰宸茬粡鍖呭惈浜嗘墍鏈夊凡commit鐨勬秷鎭紝瀹冧篃浼氭垚涓簂eader鑰屼綔涓篶onsumer鐨勬暟鎹簮銆傞粯璁ゆ儏鍐典笅锛孠afka閲囩敤绗簩绉嶇瓥鐣ワ紝鍗炽銆 + + + +* unclean.leader.election.enable=true锛屼篃鍙互灏嗘鍙傛暟璁剧疆涓篺alse鏉ュ惎鐢ㄧ涓绉嶇瓥鐣ャ +* unclean.leader.election.enable杩欎釜鍙傛暟瀵逛簬leader鐨勯変妇銆佺郴缁熺殑鍙敤鎬т互鍙婃暟鎹殑鍙潬鎬ч兘鏈夎嚦鍏抽噸瑕佺殑褰卞搷銆 + +涓嬮潰鎴戜滑鏉ュ垎鏋愪笅鍑犵鍏稿瀷鐨勫満鏅 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181203213455180-1212737615.png) + +濡傛灉涓婂浘鎵绀猴紝鍋囪鏌愪釜partition涓殑鍓湰鏁颁负3锛宺eplica-0, replica-1, replica-2鍒嗗埆瀛樻斁鍦╞roker0, broker1鍜宐roker2涓侫R=(0,1,2)锛孖SR=(0,1)銆 + +璁剧疆request.required.acks=-1, min.insync.replicas=2锛寀nclean.leader.election.enable=false銆傝繖閲岃broker0涓殑鍓湰涔熺О涔嬩负broker0璧峰垵broker0涓簂eader锛宐roker1涓篺ollower銆 + +褰揑SR涓殑replica-0鍑虹幇crash鐨勬儏鍐垫椂锛宐roker1閫変妇涓烘柊鐨刲eader[ISR=(1)]锛屽洜涓哄彈min.insync.replicas=2褰卞搷锛寃rite涓嶈兘鏈嶅姟锛屼絾鏄痳ead鑳界户缁甯告湇鍔°傛绉嶆儏鍐垫仮澶嶆柟妗堬細 + +灏濊瘯鎭㈠(閲嶅惎)replica-0锛屽鏋滆兘璧锋潵锛岀郴缁熸甯; +濡傛灉replica-0涓嶈兘鎭㈠锛岄渶瑕佸皢min.insync.replicas璁剧疆涓1锛屾仮澶峸rite鍔熻兘銆 + + +褰揑SR涓殑replica-0鍑虹幇crash锛岀揣鎺ョ潃replica-1涔熷嚭鐜颁簡crash, 姝ゆ椂[ISR=(1),leader=-1],涓嶈兘瀵瑰鎻愪緵鏈嶅姟锛屾绉嶆儏鍐垫仮澶嶆柟妗堬細 + +灏濊瘯鎭㈠replica-0鍜宺eplica-1锛屽鏋滈兘鑳借捣鏉ワ紝鍒欑郴缁熸仮澶嶆甯; +濡傛灉replica-0璧锋潵锛岃宺eplica-1涓嶈兘璧锋潵锛岃繖鏃跺欎粛鐒朵笉鑳介夊嚭leader锛屽洜涓哄綋璁剧疆unclean.leader.election.enable=false鏃讹紝leader鍙兘浠嶪SR涓変妇锛屽綋ISR涓墍鏈夊壇鏈兘澶辨晥涔嬪悗锛岄渶瑕両SR涓渶鍚庡け鏁堢殑閭d釜鍓湰鑳芥仮澶嶄箣鍚庢墠鑳介変妇leader, 鍗硆eplica-0鍏堝け鏁堬紝replica-1鍚庡け鏁堬紝闇瑕乺eplica-1鎭㈠鍚庢墠鑳介変妇leader銆備繚瀹堢殑鏂规寤鸿鎶妘nclean.leader.election.enable璁剧疆涓簍rue,浣嗘槸杩欐牱浼氭湁涓㈠け鏁版嵁鐨勬儏鍐靛彂鐢燂紝杩欐牱鍙互鎭㈠read鏈嶅姟銆傚悓鏍烽渶瑕佸皢min.insync.replicas璁剧疆涓1锛屾仮澶峸rite鍔熻兘;replica-1鎭㈠锛宺eplica-0涓嶈兘鎭㈠锛岃繖涓儏鍐典笂闈㈤亣鍒拌繃锛宺ead鏈嶅姟鍙敤锛岄渶瑕佸皢min.insync.replicas璁剧疆涓1锛屾仮澶峸rite鍔熻兘; +replica-0鍜宺eplica-1閮戒笉鑳芥仮澶嶏紝杩欑鎯呭喌鍙互鍙傝冩儏褰2. + +褰揑SR涓殑replica-0, replica-1鍚屾椂瀹曟満,姝ゆ椂[ISR=(0,1)],涓嶈兘瀵瑰鎻愪緵鏈嶅姟锛屾绉嶆儏鍐垫仮澶嶆柟妗堬細灏濊瘯鎭㈠replica-0鍜宺eplica-1锛屽綋鍏朵腑浠绘剰涓涓壇鏈仮澶嶆甯告椂锛屽澶栧彲浠ユ彁渚況ead鏈嶅姟銆傜洿鍒2涓壇鏈仮澶嶆甯革紝write鍔熻兘鎵嶈兘鎭㈠锛屾垨鑰呭皢灏唌in.insync.replicas璁剧疆涓1銆 + + + + + +### 9.5銆並afka鐨勫彂閫佹ā寮 + +Kafka鐨勫彂閫佹ā寮忕敱producer绔殑閰嶇疆鍙傛暟producer.type鏉ヨ缃紝杩欎釜鍙傛暟鎸囧畾浜嗗湪鍚庡彴绾跨▼涓秷鎭殑鍙戦佹柟寮忔槸鍚屾鐨勮繕鏄紓姝ョ殑锛岄粯璁ゆ槸鍚屾鐨勬柟寮忥紝鍗硃roducer.type=sync銆傚鏋滆缃垚寮傛鐨勬ā寮忥紝鍗硃roducer.type=async锛屽彲浠ユ槸producer浠atch鐨勫舰寮弍ush鏁版嵁锛岃繖鏍蜂細鏋佸ぇ鐨勬彁楂榖roker鐨勬ц兘锛屼絾鏄繖鏍蜂細澧炲姞涓㈠け鏁版嵁鐨勯闄┿傚鏋滈渶瑕佺‘淇濇秷鎭殑鍙潬鎬э紝蹇呴』瑕佸皢producer.type璁剧疆涓簊ync銆 + +瀵逛簬寮傛妯″紡锛岃繕鏈4涓厤濂楃殑鍙傛暟锛屽涓嬶細 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181203213857717-291133501.png) + +浠atch鐨勬柟寮忔帹閫佹暟鎹彲浠ユ瀬澶х殑鎻愰珮澶勭悊鏁堢巼锛宬afka producer鍙互灏嗘秷鎭湪鍐呭瓨涓疮璁″埌涓瀹氭暟閲忓悗浣滀负涓涓猙atch鍙戦佽姹傘俠atch鐨勬暟閲忓ぇ灏忓彲浠ラ氳繃producer鐨勫弬鏁(batch.num.messages)鎺у埗銆傞氳繃澧炲姞batch鐨勫ぇ灏忥紝鍙互鍑忓皯缃戠粶璇锋眰鍜岀鐩業O鐨勬鏁帮紝褰撶劧鍏蜂綋鍙傛暟璁剧疆闇瑕佸湪鏁堢巼鍜屾椂鏁堟ф柟闈㈠仛涓涓潈琛°傚湪姣旇緝鏂扮殑鐗堟湰涓繕鏈塨atch.size杩欎釜鍙傛暟銆 + + + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 鍗併侀珮鍙潬鎬т娇鐢ㄥ垎鏋 + + + +### 10.1銆佹秷鎭紶杈撲繚闅 + +鍓嶉潰宸茬粡浠嬬粛浜咾afka濡備綍杩涜鏈夋晥鐨勫瓨鍌紝浠ュ強浜嗚В浜唒roducer鍜宑onsumer濡備綍宸ヤ綔銆傛帴涓嬫潵璁ㄨ鐨勬槸Kafka濡備綍纭繚娑堟伅鍦╬roducer鍜宑onsumer涔嬮棿浼犺緭銆傛湁浠ヤ笅涓夌鍙兘鐨勪紶杈撲繚闅(delivery guarantee): + + + +* At most once: 娑堟伅鍙兘浼氫涪锛屼絾缁濅笉浼氶噸澶嶄紶杈 +* At least once锛氭秷鎭粷涓嶄細涓紝浣嗗彲鑳戒細閲嶅浼犺緭 +* Exactly once锛氭瘡鏉℃秷鎭偗瀹氫細琚紶杈撲竴娆′笖浠呬紶杈撲竴娆 + +Kafka鐨勬秷鎭紶杈撲繚闅滄満鍒堕潪甯哥洿瑙傘傚綋producer鍚慴roker鍙戦佹秷鎭椂锛屼竴鏃﹁繖鏉℃秷鎭commit锛岀敱浜庡壇鏈満鍒(replication)鐨勫瓨鍦紝瀹冨氨涓嶄細涓㈠け銆備絾鏄鏋減roducer鍙戦佹暟鎹粰broker鍚庯紝閬囧埌鐨勭綉缁滈棶棰樿岄犳垚閫氫俊涓柇锛岄偅producer灏辨棤娉曞垽鏂鏉℃秷鎭槸鍚﹀凡缁忔彁浜(commit)銆傝櫧鐒禟afka鏃犳硶纭畾缃戠粶鏁呴殰鏈熼棿鍙戠敓浜嗕粈涔堬紝浣嗘槸producer鍙互retry澶氭锛岀‘淇濇秷鎭凡缁忔纭紶杈撳埌broker涓紝鎵浠ョ洰鍓岾afka瀹炵幇鐨勬槸at least once銆 + +consumer浠巄roker涓鍙栨秷鎭悗锛屽彲浠ラ夋嫨commit锛岃鎿嶄綔浼氬湪Zookeeper涓瓨涓嬭consumer鍦ㄨpartition涓嬭鍙栫殑娑堟伅鐨刼ffset銆傝consumer涓嬩竴娆″啀璇昏partition鏃朵細浠庝笅涓鏉″紑濮嬭鍙栥傚鏈猚ommit锛屼笅涓娆¤鍙栫殑寮濮嬩綅缃細璺熶笂涓娆ommit涔嬪悗鐨勫紑濮嬩綅缃浉鍚屻傚綋鐒朵篃鍙互灏哻onsumer璁剧疆涓篴utocommit锛屽嵆consumer涓鏃﹁鍙栧埌鏁版嵁绔嬪嵆鑷姩commit銆傚鏋滃彧璁ㄨ杩欎竴璇诲彇娑堟伅鐨勮繃绋嬶紝閭afka鏄‘淇濅簡exactly once, 浣嗘槸濡傛灉鐢变簬鍓嶉潰producer涓巄roker涔嬮棿鐨勬煇绉嶅師鍥犲鑷存秷鎭殑閲嶅锛岄偅涔堣繖閲屽氨鏄痑t least once銆 + +鑰冭檻杩欐牱涓绉嶆儏鍐碉紝褰揷onsumer璇诲畬娑堟伅涔嬪悗鍏坈ommit鍐嶅鐞嗘秷鎭紝鍦ㄨ繖绉嶆ā寮忎笅锛屽鏋渃onsumer鍦╟ommit鍚庤繕娌℃潵寰楀強澶勭悊娑堟伅灏眂rash浜嗭紝涓嬫閲嶆柊寮濮嬪伐浣滃悗灏辨棤娉曡鍒板垰鍒氬凡鎻愪氦鑰屾湭澶勭悊鐨勬秷鎭紝杩欏氨瀵瑰簲浜巃t most once浜嗐 + +璇诲畬娑堟伅鍏堝鐞嗗啀commit銆傝繖绉嶆ā寮忎笅锛屽鏋滃鐞嗗畬浜嗘秷鎭湪commit涔嬪墠consumer crash浜嗭紝涓嬫閲嶆柊寮濮嬪伐浣滄椂杩樹細澶勭悊鍒氬垰鏈猚ommit鐨勬秷鎭紝瀹為檯涓婅娑堟伅宸茬粡琚鐞嗚繃浜嗭紝杩欏氨瀵瑰簲浜巃t least once銆 + +瑕佸仛鍒癳xactly once灏遍渶瑕佸紩鍏ユ秷鎭幓閲嶆満鍒躲 + + + +### 10.2銆佹秷鎭幓閲 + + + +濡備笂涓鑺傛墍杩帮紝Kafka鍦╬roducer绔拰consumer绔兘浼氬嚭鐜版秷鎭殑閲嶅锛岃繖灏遍渶瑕佸幓閲嶅鐞嗐 + +Kafka鏂囨。涓彁鍙奊UID(Globally Unique Identifier)鐨勬蹇碉紝閫氳繃瀹㈡埛绔敓鎴愮畻娉曞緱鍒版瘡涓秷鎭殑unique id锛屽悓鏃跺彲鏄犲皠鑷砨roker涓婂瓨鍌ㄧ殑鍦板潃锛屽嵆閫氳繃GUID渚垮彲鏌ヨ鎻愬彇娑堟伅鍐呭锛屼篃渚夸簬鍙戦佹柟鐨勫箓绛夋т繚璇侊紝闇瑕佸湪broker涓婃彁渚涙鍘婚噸澶勭悊妯″潡锛屾渶鏂扮増鏈凡缁忔敮鎸併 + +閽堝GUID, 濡傛灉浠庡鎴风鐨勮搴﹀幓閲嶏紝閭d箞闇瑕佸紩鍏ラ泦涓紡缂撳瓨锛屽繀鐒朵細澧炲姞渚濊禆澶嶆潅搴︼紝鍙﹀缂撳瓨鐨勫ぇ灏忛毦浠ョ晫瀹氥 + +涓嶅彧鏄疜afka, 绫讳技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)锛宲roducer.type=sync + + + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 鍗佷竴銆佸唴閮ㄧ綉缁滄鏋 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181212101055804-450926848.png) + +Broker鐨勫唴閮ㄥ鐞嗘祦姘寸嚎鍖栵紝鍒嗕负澶氫釜闃舵鏉ヨ繘琛(SEDA)锛屼互鎻愰珮鍚炲悙閲忓拰鎬ц兘锛屽敖閲忛伩鍏峊head鐩茬瓑寰咃紝浠ヤ笅涓鸿繃绋嬭鏄庛 + +* Accept Thread璐熻矗涓庡鎴风寤虹珛杩炴帴閾捐矾锛岀劧鍚庢妸Socket杞浆浜ょ粰Process Thread +* Process Thread璐熻矗鎺ユ敹璇锋眰鍜屽搷搴旀暟鎹紝Process Thread姣忔鍩轰簬Selector浜嬩欢寰幆锛岄鍏堜粠Response Queue璇诲彇鍝嶅簲鏁版嵁锛屽悜瀹㈡埛绔洖澶嶅搷搴旓紝鐒跺悗鎺ユ敹鍒板鎴风璇锋眰鍚庯紝璇诲彇鏁版嵁鏀惧叆Request Queue銆 +* Work Thread璐熻矗涓氬姟閫昏緫銆両O纾佺洏澶勭悊绛夛紝璐熻矗浠嶳equest Queue璇诲彇璇锋眰锛屽苟鎶婂鐞嗙粨鏋滄斁鍏esponse Queue涓紝寰匬rocess Thread鍙戦佸嚭鍘汇 + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 鍗佷簩銆乺ebalance鏈哄埗 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181212101229091-1187958161.png) + +Kafka淇濊瘉鍚屼竴consumer group涓彧鏈変竴涓猚onsumer浼氭秷璐规煇鏉℃秷鎭紝瀹為檯涓婏紝Kafka淇濊瘉鐨勬槸绋冲畾鐘舵佷笅姣忎竴涓猚onsumer瀹炰緥鍙細娑堣垂鏌愪竴涓垨澶氫釜鐗瑰畾鐨勬暟鎹紝鑰屾煇涓猵artition鐨勬暟鎹彧浼氳鏌愪竴涓壒瀹氱殑consumer瀹炰緥鎵娑堣垂銆傝繖鏍疯璁$殑鍔e娍鏄棤娉曡鍚屼竴涓猚onsumer group閲岀殑consumer鍧囧寑娑堣垂鏁版嵁锛屼紭鍔挎槸姣忎釜consumer涓嶇敤閮借窡澶ч噺鐨刡roker閫氫俊锛屽噺灏戦氫俊寮閿锛屽悓鏃朵篃闄嶄綆浜嗗垎閰嶉毦搴︼紝瀹炵幇涔熸洿绠鍗曘傚彟澶栵紝鍥犱负鍚屼竴涓猵artition閲岀殑鏁版嵁鏄湁搴忕殑锛岃繖绉嶈璁″彲浠ヤ繚璇佹瘡涓猵artition閲岀殑鏁版嵁涔熸槸鏈夊簭琚秷璐广 + +濡傛灉鏌恈onsumer group涓璫onsumer鏁伴噺灏戜簬partition鏁伴噺锛屽垯鑷冲皯鏈変竴涓猚onsumer浼氭秷璐瑰涓猵artition鐨勬暟鎹紝濡傛灉consumer鐨勬暟閲忎笌partition鏁伴噺鐩稿悓锛屽垯姝eソ涓涓猚onsumer娑堣垂涓涓猵artition鐨勬暟鎹紝鑰屽鏋渃onsumer鐨勬暟閲忓浜巔artition鐨勬暟閲忔椂锛屼細鏈夐儴鍒哻onsumer鏃犳硶娑堣垂璇opic涓嬩换浣曚竴鏉℃秷鎭 + +**Consumer Rebalance绠楁硶濡備笅 锛** + + + +
1. 灏嗙洰鏍 topic 涓嬬殑鎵鏈 partirtion 鎺掑簭锛屽瓨浜嶱T 2. 瀵规煇 consumer group 涓嬫墍鏈 consumer 鎺掑簭锛屽瓨浜 CG锛岀 i 涓猚onsumer 璁颁负 Ci 3. N=size(PT)/size(CG)锛屽悜涓婂彇鏁 4. 瑙i櫎 Ci 瀵瑰師鏉ュ垎閰嶇殑 partition 鐨勬秷璐规潈锛坕浠0寮濮嬶級 5. 灏嗙i*N鍒帮紙i+1锛*N-1涓 partition 鍒嗛厤缁 Ci銆
+ + + +鐩墠consumer rebalance鐨勬帶鍒剁瓥鐣ユ槸鐢辨瘡涓涓猚onsumer閫氳繃Zookeeper瀹屾垚鐨勩傚叿浣撶殑鎺у埗鏂瑰紡濡備笅锛 + + + +
鍦/consumers/[consumer-group]/涓嬫敞鍐宨d
+璁剧疆瀵/consumers/[consumer-group] 鐨剋atcher
+璁剧疆瀵癸紡brokers/ids鐨剋atcher
+zk涓嬭缃畐atcher鐨勮矾寰勮妭鐐规洿鏀癸紝瑙﹀彂consumer rebalance
+ + + + +鍦ㄨ繖绉嶇瓥鐣ヤ笅锛**姣忎竴涓猚onsumer鎴栬卋roker鐨勫鍔犳垨鑰呭噺灏戦兘浼氳Е鍙慶onsumer rebalance**銆傚洜涓烘瘡涓猚onsumer鍙礋璐h皟鏁磋嚜宸辨墍娑堣垂鐨刾artition锛屼负浜嗕繚璇佹暣涓猚onsumer group鐨勪竴鑷存э紝鎵浠ュ綋涓涓猚onsumer瑙﹀彂浜唕ebalance鏃讹紝璇onsumer group鍐呯殑鍏跺畠鎵鏈塩onsumer涔熷簲璇ュ悓鏃惰Е鍙憆ebalance銆 + +* Herd effect + +浠讳綍broker鎴栬卌onsumer鐨勫鍑忛兘浼氳Е鍙戞墍鏈夌殑consumer鐨剅ebalance + +* Split Brain + +姣忎釜consumer鍒嗗埆鍗曠嫭閫氳繃Zookeeper鍒ゆ柇鍝簺partition down浜嗭紝閭d箞涓嶅悓consumer浠嶼ookeeper鈥滅湅鈥濆埌鐨剉iew灏卞彲鑳戒笉涓鏍凤紝杩欏氨浼氶犳垚閿欒鐨剅eblance灏濊瘯銆傝屼笖鏈夊彲鑳芥墍鏈夌殑consumer閮借涓簉ebalance宸茬粡瀹屾垚浜嗭紝浣嗗疄闄呬笂鍙兘骞堕潪濡傛銆 + +[鍥炲埌椤堕儴](https://www.cnblogs.com/wangzhuxing/p/10051512.html#_labelTop) + +## 鍗佷笁銆丅enchMark + +Kafka鍦ㄥ敮鍝佷細鏈夌潃寰堟繁鐨勫巻鍙叉笂婧愶紝鏍规嵁鍞搧浼氭秷鎭腑闂翠欢鍥㈤槦(VMS鍥㈤槦)鎵鎺屾彙鐨勮祫鏂欐樉绀猴紝鍦╒MS鍥㈤槦杩愯浆鐨凨afka闆嗙兢涓墍鏀拺鐨則opic鏁板凡鎺ヨ繎2000锛屾瘡澶╃殑璇锋眰閲忎篃宸茶揪鍗冧嚎绾с傝繖閲屽氨浠afka鐨勯珮鍙潬鎬т负鍩哄噯鐐规潵鎺㈢┒鍑犵涓嶅悓鍦烘櫙涓嬬殑琛屼负琛ㄧ幇锛屼互姝ゆ潵鍔犳繁瀵筀afka鐨勮鐭ワ紝涓哄ぇ瀹跺湪浠ュ悗楂樻晥鐨勪娇鐢↘afka鏃舵彁渚涗竴浠戒緷鎹 + + + +### 13.1銆佹祴璇曠幆澧 + +Kafka broker鐢ㄥ埌浜4鍙版満鍣紝鍒嗗埆涓篵roker[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绔疛VM鍙傛暟璁剧疆锛 + + + + + +
-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锛 + +娴嬭瘯涓嶅悓鐨勫壇鏈暟銆乵in.insync.replicas绛栫暐浠ュ強request.required.acks绛栫暐(浠ヤ笅绠绉癮cks绛栫暐)瀵逛簬鍙戦侀熷害(TPS)鐨勫奖鍝嶃 + +鍏蜂綋閰嶇疆锛氫竴涓猵roducer;鍙戦佹柟寮忎负sync;娑堟伅浣撳ぇ灏忎负1kB;partition鏁颁负12銆傚壇鏈暟涓猴細1/2/4;min.insync.replicas鍒嗗埆涓1/2/4;acks鍒嗗埆涓-1(all)/1/0銆 + +鍏蜂綋娴嬭瘯鏁版嵁濡備笅琛(min.insync.replicas鍙湪acks=-1鏃舵湁鏁)锛 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181203221444373-736905445.png) + +娴嬭瘯缁撴灉鍒嗘瀽锛 + + + +1. 瀹㈡埛绔殑acks绛栫暐瀵瑰彂閫佺殑TPS鏈夎緝澶х殑褰卞搷锛孴PS锛歛cks_0 > acks_1 > ack_-1; +2. 鍓湰鏁拌秺楂橈紝TPS瓒婁綆;鍓湰鏁颁竴鑷存椂锛宮in.insync.replicas涓嶅奖鍝峊PS; +3. acks=0/1鏃讹紝TPS涓巑in.insync.replicas鍙傛暟浠ュ強鍓湰鏁版棤鍏筹紝浠呭彈acks绛栫暐鐨勫奖鍝嶃 + +涓嬮潰灏唒artition鐨勪釜鏁拌缃负1锛屾潵杩涗竴姝ョ‘璁や笅涓嶅悓鐨刟cks绛栫暐銆佷笉鍚岀殑min.insync.replicas绛栫暐浠ュ強涓嶅悓鐨勫壇鏈暟瀵逛簬鍙戦侀熷害鐨勫奖鍝嶏紝璇︾粏璇风湅鎯呮櫙2鍜屾儏鏅3銆 + +#### 鍦烘櫙2锛 + +鍦╬artition涓暟鍥哄畾涓1锛屾祴璇曚笉鍚岀殑鍓湰鏁板拰min.insync.replicas绛栫暐瀵瑰彂閫侀熷害鐨勫奖鍝嶃 + +鍏蜂綋閰嶇疆锛氫竴涓猵roducer;鍙戦佹柟寮忎负sync;娑堟伅浣撳ぇ灏忎负1kB;producer绔痑cks=-1(all)銆傚彉鎹㈠壇鏈暟锛2/3/4; min.insync.replicas璁剧疆涓猴細1/2/4銆 + +娴嬭瘯缁撴灉濡備笅锛 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181203221832812-2007554062.png) + +娴嬭瘯缁撴灉鍒嗘瀽锛 + +鍓湰鏁拌秺楂橈紝TPS瓒婁綆(杩欑偣涓庡満鏅1鐨勬祴璇曠粨璁哄惢鍚)锛屼絾鏄綋partition鏁颁负1鏃跺樊璺濈敋寰俶in.insync.replicas涓嶅奖鍝峊PS銆 + +#### 鍦烘櫙3锛 + +鍦╬artition涓暟鍥哄畾涓1锛屾祴璇曚笉鍚岀殑acks绛栫暐鍜屽壇鏈暟瀵瑰彂閫侀熷害鐨勫奖鍝嶃 + +鍏蜂綋閰嶇疆锛氫竴涓猵roducer;鍙戦佹柟寮忎负sync;娑堟伅浣撳ぇ灏忎负1kB;min.insync.replicas=1銆倀opic鍓湰鏁颁负锛1/2/4;acks锛 0/1/-1銆 + +娴嬭瘯缁撴灉濡備笅锛 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181203222003811-323209661.png) + + + + + + + + + + + + + +娴嬭瘯缁撴灉鍒嗘瀽(涓庢儏鏅1涓鑷)锛 + +* 鍓湰鏁拌秺澶氾紝TPS瓒婁綆; +* 瀹㈡埛绔殑acks绛栫暐瀵瑰彂閫佺殑TPS鏈夎緝澶х殑褰卞搷锛孴PS锛歛cks_0 > acks_1 > ack_-1銆 + +#### 鍦烘櫙4锛 + +娴嬭瘯涓嶅悓partition鏁板鍙戦侀熺巼鐨勫奖鍝 + +鍏蜂綋閰嶇疆锛氫竴涓猵roducer;娑堟伅浣撳ぇ灏忎负1KB;鍙戦佹柟寮忎负sync;topic鍓湰鏁颁负2;min.insync.replicas=2;acks=-1銆俻artition鏁伴噺璁剧疆涓1/2/4/8/12銆 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181203222113272-1167910484.png) + +娴嬭瘯缁撴灉鍒嗘瀽锛 + +partition鐨勪笉鍚屼細褰卞搷TPS锛岄殢鐫partition鐨勪釜鏁扮殑澧為暱TPS浼氭湁鎵澧為暱锛屼絾骞朵笉鏄竴鐩存垚姝f瘮鍏崇郴锛屽埌杈句竴瀹氫复鐣屽兼椂锛宲artition鏁伴噺鐨勫鍔犲弽鑰屼細浣縏PS鐣ュ井闄嶄綆銆 + +#### 鍦烘櫙5锛 + +閫氳繃灏嗛泦缇や腑閮ㄥ垎broker璁剧疆鎴愪笉鍙湇鍔$姸鎬侊紝娴嬭瘯瀵瑰鎴风浠ュ強娑堟伅钀界洏鐨勫奖鍝嶃 + +鍏蜂綋閰嶇疆锛氫竴涓猵roducer;娑堟伅浣撳ぇ灏1KB;鍙戦佹柟寮忎负sync;topic鍓湰鏁颁负4;min.insync.replicas璁剧疆涓2;acks=-1;retries=0/100000000;partition鏁颁负12銆 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181203222220687-1891442968.png) + +娴嬭瘯缁撴灉鍒嗘瀽锛 + + + +1. kill涓ゅ彴broker鍚庯紝瀹㈡埛绔彲浠ョ户缁彂閫併俠roker鍑忓皯鍚庯紝partition鐨刲eader鍒嗗竷鍦ㄥ墿浣欑殑涓ゅ彴broker涓婏紝閫犳垚浜員PS鐨勫噺灏; +2. kill涓夊彴broker鍚庯紝瀹㈡埛绔棤娉曠户缁彂閫併侹afka鐨勮嚜鍔ㄩ噸璇曞姛鑳藉紑濮嬭捣浣滅敤锛屽綋澶т簬绛変簬min.insync.replicas鏁伴噺鐨刡roker鎭㈠鍚庯紝鍙互缁х画鍙戦; +3. 褰搑etries涓嶄负0鏃讹紝娑堟伅鏈夐噸澶嶈惤鐩;瀹㈡埛绔垚鍔熻繑鍥炵殑娑堟伅閮芥垚鍔熻惤鐩橈紝寮傚父鏃堕儴鍒嗘秷鎭彲浠ヨ惤鐩樸 + +#### 鍦烘櫙6锛 + +娴嬭瘯鍗曚釜producer鐨勫彂閫佸欢杩燂紝浠ュ強绔埌绔殑寤惰繜銆 + +鍏蜂綋閰嶇疆锛氫竴涓猵roducer;娑堟伅浣撳ぇ灏1KB;鍙戦佹柟寮忎负sync;topic鍓湰鏁颁负4;min.insync.replicas璁剧疆涓2;acks=-1;partition鏁颁负12銆 + +娴嬭瘯鏁版嵁鍙婄粨鏋(鍗曚綅涓簃s)锛 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/843808-20181203222407063-2086989349.png) + +**鍚勫満鏅祴璇曟荤粨锛** + + + +1. 褰揳cks=-1鏃讹紝Kafka鍙戦佺鐨凾PS鍙楅檺浜巘opic鐨勫壇鏈暟閲(ISR涓)锛屽壇鏈秺澶歍PS瓒婁綆; +2. acks=0鏃讹紝TPS鏈楂橈紝鍏舵涓1锛屾渶宸负-1锛屽嵆TPS锛歛cks_0 > acks_1 > ack_-1 +3. min.insync.replicas鍙傛暟涓嶅奖鍝峊PS; +4. partition鐨勪笉鍚屼細褰卞搷TPS锛岄殢鐫partition鐨勪釜鏁扮殑澧為暱TPS浼氭湁鎵澧為暱锛屼絾骞朵笉鏄竴鐩存垚姝f瘮鍏崇郴锛屽埌杈句竴瀹氫复鐣屽兼椂锛宲artition鏁伴噺鐨勫鍔犲弽鑰屼細浣縏PS鐣ュ井闄嶄綆; +5. Kafka鍦╝cks=-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 & + +![](https://img2022.cnblogs.com/blog/796632/202208/796632-20220812161146385-332776455.png) + +澶氫釜kafka鐨勮瘽锛屽湪鍚勪釜铏氭嫙鏈轰笂杩愯kafka鍚姩鍛戒护澶氭鍗冲彲銆 + +褰撶劧杩欎釜鏄崟鏈虹殑鍛戒护锛岄泦缇ょ殑鍛戒护鍚庨潰鍐嶈銆 + +## **鏌ョ湅鏄惁鍚姩** + +jps -lm + +![](https://img2022.cnblogs.com/blog/796632/202208/796632-20220812161210221-836644701.png) + +璇存槑娌℃湁鍚姩kfka + +![](https://img2022.cnblogs.com/blog/796632/202208/796632-20220812161224734-562363764.png) + +璇存槑鍚姩kafka浜 + +## 鏌ョ湅kafka鐗堟湰 + +find ./libs/ -name \*kafka_\* | head -1 | grep -o '\kafka[^\n]*' + +kafka_2.12-2.4.1.jar + +缁撴灉: + +灏卞彲浠ョ湅鍒発afka鐨勫叿浣撶増鏈簡銆 + +鍏朵腑锛2.12涓簊cala鐗堟湰锛2.4.1涓簁afka鐗堟湰銆 + +## **鍋滄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 + +澶氶泦缇ゅ垱寤猴紝鎵ц杩欎釜闇瑕佹惌寤哄鏈哄櫒鐨刱afka闆嗙兢鐜锛寊kq1/zkq2/zkq3鍒嗗埆浠h〃浜3鍙皕ookeeper闆嗙兢鐨勪笁鍙版満鍣 + +/bin/kafka-topics.sh 鈥攃reate 鈥攝ookeeper zkq1:2181,zkq2:2181,zkq3:2181 -replication-factor 6 鈥攑artition 6 鈥攖opic test + +瑙i噴锛 + +--topic鍚庨潰鐨則est0鏄痶opic鐨勫悕绉 + +--zookeeper搴旇鍜宻erver.properties鏂囦欢涓殑zookeeper.connect涓鏍 + +--config鎸囧畾褰撳墠topic涓婃湁鏁堢殑鍙傛暟鍊 + +--partitions鎸囧畾topic鐨刾artition鏁伴噺锛屽鏋滀笉鎸囧畾璇ユ暟閲忥紝榛樿鏄痵erver.properties鏂囦欢涓殑num.partitions閰嶇疆鍊 + +--replication-factor鎸囧畾姣忎釜partition鐨勫壇鏈釜鏁帮紝榛樿鏄1涓 + +涔熷彲浠ュ悜娌℃湁鐨則opic鍙戦佹秷鎭殑鏃跺欏垱寤簍opic + +闇瑕 + +寮鍚嚜鍔ㄥ垱寤洪厤缃細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 + +![](https://img2022.cnblogs.com/blog/796632/202208/796632-20220812161250801-1389051022.png) + +瑙i噴锛 + +瑕佹煡鐪嬪涓猼opic鐢ㄩ楀彿鍒嗗壊 + +**leader**: + +鏄partitons鎵鍦ㄧ殑鎵鏈塨roker涓媴浠籰eader鐨刡roker id锛屾瘡涓猙roker閮芥湁鍙兘鎴愪负leader锛岃礋璐e鐞嗘秷鎭殑璇诲拰鍐欙紝leader鏄粠鎵鏈夎妭鐐逛腑闅忔満閫夋嫨鐨. + +-1琛ㄧず姝roker绉婚櫎浜 + +**Replicas**: + +鏄剧ず璇artiton鎵鏈夊壇鏈墍鍦ㄧ殑broker鍒楄〃锛屽寘鎷琹eader锛屼笉绠¤broker鏄惁鏄瓨娲伙紝涓嶇鏄惁鍜宭eader淇濇寔浜嗗悓姝ャ傚垪鍑轰簡鎵鏈夌殑鍓湰鑺傜偣锛屼笉绠¤妭鐐规槸鍚﹀湪鏈嶅姟涓. + +**Isr**: + +in-sync replicas鐨勭畝鍐欙紝琛ㄧず瀛樻椿涓斿壇鏈兘宸插悓姝ョ殑鐨刡roker闆嗗悎锛屾槸replicas鐨勫瓙闆嗭紝鏄鍦ㄦ湇鍔′腑鐨勮妭鐐. + +涓句緥锛 + +姣斿涓婇潰缁撴灉鐨勭涓琛岋細Topic: test0 .Partition:0 ...Leader: 0 ......Replicas: 0,2,1 Isr: 1,0,2 + +Partition: 0[璇artition缂栧彿鏄0] + +Replicas: 0,2,1[浠h〃partition0 鍦╞roker0锛宐roker1锛宐roker2涓婁繚瀛樹簡鍓湰] + +Isr: 1,0,2 [浠h〃broker0锛宐roker1锛宐roker2閮藉瓨娲昏屼笖鐩墠閮藉拰leader淇濇寔鍚屾] + +Leader: 0 + +浠h〃淇濆瓨鍦╞roker0锛宐roker1锛宐roker2涓婄殑杩欎笁涓壇鏈腑锛宭eader鏄痓roker0 + +leader璐熻矗璇诲啓锛宐roker1銆乥roker2璐熻矗浠巄roker0鍚屾淇℃伅锛屽钩鏃舵病浠栦咯浠涔堜簨 + +## **鏌ョ湅topic鐨刾artition鍙婂鍔爌artition** + +/kafka-topics.sh 鈥搝ookeeper 10.2.1.1:2181 鈥搕opic mcc-logs 鈥揹escribe. + +## **鍒犻櫎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. + +杩欒竟鏄锛屼綘鐨凾opic宸茬粡琚爣璁颁负寰呭垹闄ょ殑Topic锛屼絾鏄憿锛屼綘閰嶇疆鏂囦欢鐨勫紑鍏虫病鏈夋墦寮锛屾墍浠ュ彧鏄粰瀹冩坊鍔犱簡涓涓爣璁帮紝瀹為檯涓婏紝杩欎釜Topic骞舵病鏈夎鍒犻櫎銆傚彧鏈夛紝浣犳墦寮寮鍏充箣鍚庯紝浼氳嚜鍔ㄥ垹闄よ鏍囪鍒犻櫎鐨凾opic銆 + +瑙e喅鍔炴硶锛 + +璁剧疆server.properties鏂囦欢鍐呯殑鈥渄elete.topic.enable=true鈥濓紝骞朵笖閲嶅惎Kafka灏卞彲浠ヤ簡銆 + +濡傛灉涓嶆兂淇敼閰嶇疆涔熷彲浠ュ畬鍏ㄥ垹闄 + +1銆佸垹闄afka瀛樺偍鐩綍锛坰erver.propertiewenjian log.dirs閰嶇疆锛岄粯璁や负鈥/tmp/kafka-logs鈥濓級涓嬪搴旂殑topic銆(涓嶅悓broker涓嬪瓨鍌ㄧ殑topic涓嶄竴瀹氱浉鍚岋紝鎵鏈塨roker閮借鐪嬩竴涓) + +2銆佽繘鍏ookeeper瀹㈡埛绔垹鎺夊搴攖opic + +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涓瓨鍌ㄧ殑鍐呭** + +鍦╟onfig/server.properties涓壘鍒板涓嬬殑浣嶇疆 + +![](https://img2022.cnblogs.com/blog/796632/202208/796632-20220812161312458-550425542.png) + +鍒犻櫎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 锛坱opic琚爣璁颁负marked for deletion鏃堕渶瑕佽繖涓懡浠わ級 + +閲嶅惎zookeeper鍜宐roker + +## **鐢熶骇鑰呭彂閫佹秷鎭細** + +bin/kafka-console-producer.sh --broker-list 130.51.23.95:9092 --topic my-replicated-topic + +杩欓噷鐨刬p鍜岀鍙f槸broker鐨刬p鍙婄鍙o紝鏍规嵁鑷繁kafka鏈哄櫒鐨刬p鍜岀鍙e啓灏卞彲浠 + +## **娑堣垂鑰呮秷璐规秷鎭細** + +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 灏辨槸鎸囪繖涓猼opic鏁翠綋鐨勬儏鍐 + +## 鏌ョ湅鎸囧畾group鐨勬秷璐规儏鍐 + +kafka-consumer-groups.sh --bootstrap-server 172.20.72.93:9092 --describe --group mygroup + +杩愯缁撴灉锛 + +![](https://img2022.cnblogs.com/blog/796632/202208/796632-20220816164455794-344440282.png) + +* GROUP:娑堣垂鑰呯粍 +* TOPIC锛歵opic鍚嶅瓧 +* PARTITION 锛歱artition id +* CURRENT-OFFSET锛 .褰撳墠娑堣垂鍒扮殑offset . . . . . . . . +* LOG-END-OFFSETSIZE 锛氭渶鏂扮殑offset +* LAG:鏈秷璐圭殑鏉℃暟 +* CONSUMER-ID:娑堣垂鑰呯粍涓秷璐硅呯殑id,涓衡斾唬琛ㄦ病鏈塧ctive鐨勬秷璐硅 +* HOST锛氭秷璐硅呯殑鏈哄櫒ip锛屼负鈥斾唬琛ㄦ病鏈塧ctive鐨勬秷璐硅 +* CLIENT-ID:娑堣垂鑰卌lientID锛屼负鈥斾唬琛ㄦ病鏈塧ctive鐨勬秷璐硅 + +## .鏌ョ湅鎵鏈塯roup鐨勬秷璐规儏鍐 + +kafka-consumer-groups.sh --bootstrap-server 172.20.72.93:9092 --all-groups --all-topics --describe + +![](https://img2022.cnblogs.com/blog/796632/202208/796632-20220816172442100-1560497638.png) + +## 淇敼group娑堣垂鐨刼ffset + +kafka-consumer-groups.sh --bootstrap-server 172.20.72.93:9092 --group mygroup --reset-offsets --topic mytopic --to-offset 61 --execute + +涓婇潰灏辨槸鎶妋ygroup鍦╩ytopic鐨勬秷璐筼ffset淇敼鍒颁簡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鍒嗗尯鏁** + +锛堝彧鑳藉鍔犱笉鑳藉噺灏戯級 + +涓簍opic t_cdr 澧炲姞10涓垎鍖 + +bin/kafka-topics.sh --zookeeper node01:2181 .--alter --topic t_cdr --partitions 10 + +## **甯哥敤閰嶇疆鍙婅鏄** + +kafka 甯歌閲嶈閰嶇疆璇存槑锛屽垎涓哄洓閮ㄥ垎 + +* Broker Config锛歬afka 鏈嶅姟绔殑閰嶇疆 +* Producer Config锛氱敓浜х鐨勯厤缃 +* Consumer Config锛氭秷璐圭鐨勯厤缃 +* Kafka Connect Config锛歬afka 杩炴帴鐩稿叧鐨勯厤缃 + +### **Broker Config** + +1. **zookeeper.connect** + +杩炴帴 zookeeper 闆嗙兢鐨勫湴鍧锛岀敤浜庡皢 kafka 闆嗙兢鐩稿叧鐨勫厓鏁版嵁淇℃伅瀛樺偍鍒版寚瀹氱殑 zookeeper 闆嗙兢涓 + +**2\. advertised.port** + +娉ㄥ唽鍒 zookeeper 涓殑鍦板潃绔彛淇℃伅锛屽湪 IaaS 鐜涓紝榛樿娉ㄥ唽鍒 zookeeper 涓殑鏄唴缃戝湴鍧锛岄氳繃璇ラ厤缃寚瀹氬缃戣闂殑鍦板潃鍙婄鍙o紝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銆俴afka 鐨勬鏌ュ氨鏄熀浜庢 id 鏄惁鍦 zookeeper 涓/brokers/ids 鐩綍涓嬫槸鍚︽湁鐩稿簲鐨 id 鐩綍鏉ュ垽瀹 Broker 鏄惁鍋ュ悍銆 + +**7\. compression.type** + +鍘嬬缉绫诲瀷銆傛閰嶇疆鍙互鎺ュ彈鐨勫帇缂╃被鍨嬫湁 gzip銆乻nappy銆乴z4銆傚彟澶栧彲浠ヤ笉璁剧疆锛屽嵆淇濇寔鍜岀敓浜х鐩稿悓鐨勫帇缂╂牸寮忋 + +**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 鍒涘缓鍛ㄦ湡锛屽崟浣嶅皬鏃躲俴afka 鏁版嵁鏄互 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 瀵瑰鎻愪緵璁块棶鐨勭鍙e彿銆 + +**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锛宎ll锛涘綋璁剧疆涓 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 涓病鏈夊垵濮嬪亸绉婚噺鎴栨湇鍔″櫒涓婁笉瀛樺湪鍋忕Щ閲忔椂锛屾寚瀹氫粠鍝釜浣嶇疆寮濮嬫秷鎭秷鎭俥arliest锛氭寚瀹氫粠澶村紑濮嬶紱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涓秷鎭槸浠opic杩涜鍒嗙被鐨勶紝Producer鐢熶骇娑堟伅锛孋onsumer娑堣垂娑堟伅锛岄兘鏄潰鍚憈opic鐨勩 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-b9d626794f6625526598db6627b780e7_720w.webp) + +
+ +Topic鏄昏緫涓婄殑鏀瑰彉锛孭artition鏄墿鐞嗕笂鐨勬蹇碉紝姣忎釜Partition瀵瑰簲鐫涓涓猯og鏂囦欢锛岃log鏂囦欢涓瓨鍌ㄧ殑灏辨槸producer鐢熶骇鐨勬暟鎹紝topic=N*partition锛沺artition=log + +Producer鐢熶骇鐨勬暟鎹細琚笉鏂殑杩藉姞鍒拌log鏂囦欢鐨勬湯绔紝涓旀瘡鏉℃暟鎹兘鏈夎嚜宸辩殑offset锛宑onsumer缁勪腑鐨勬瘡涓猚onsumer锛岄兘浼氬疄鏃惰褰曡嚜宸辨秷璐瑰埌浜嗗摢涓猳ffset锛屼互渚垮嚭閿欐仮澶嶇殑鏃跺欙紝鍙互浠庝笂娆$殑浣嶇疆缁х画娑堣垂銆傛祦绋嬶細Producer => Topic锛圠og with offset锛=> Consumer. + +## 浜. 鏂囦欢瀛樺偍 + +Kafka鏂囦欢瀛樺偍涔熸槸閫氳繃鏈湴钀界洏鐨勬柟寮忓瓨鍌ㄧ殑锛屼富瑕佹槸閫氳繃鐩稿簲鐨刲og涓巌ndex绛夋枃浠朵繚瀛樺叿浣撶殑娑堟伅鏂囦欢銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-116ebd7dffd85595d69f080e5b5f6948_720w.webp) + +
+ +鐢熶骇鑰呬笉鏂殑鍚憀og鏂囦欢杩藉姞娑堟伅鏂囦欢锛屼负浜嗛槻姝og鏂囦欢杩囧ぇ瀵艰嚧瀹氫綅鏁堢巼浣庝笅锛孠afka鐨刲og鏂囦欢浠1G涓轰竴涓垎鐣岀偣锛屽綋.log鏂囦欢澶у皬瓒呰繃1G鐨勬椂鍊欙紝姝ゆ椂浼氬垱寤轰竴涓柊鐨.log鏂囦欢锛屽悓鏃朵负浜嗗揩閫熷畾浣嶅ぇ鏂囦欢涓秷鎭綅缃紝Kafka閲囧彇浜嗗垎鐗囧拰绱㈠紩鐨勬満鍒舵潵鍔犻熷畾浣嶃 + +鍦╧afka鐨勫瓨鍌╨og鐨勫湴鏂癸紝鍗虫枃浠剁殑鍦版柟锛屼細瀛樺湪娑堣垂鐨勫亸绉婚噺浠ュ強鍏蜂綋鐨勫垎鍖轰俊鎭紝鍒嗗尯淇℃伅鐨勮瘽涓昏鍖呮嫭.index鍜.log鏂囦欢缁勬垚 + +
+ + +![](https://pic3.zhimg.com/80/v2-c6de61f43ecbe58d4f3e7aa29541220e_720w.webp) + +
+ +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-8345e4966d8c5274a1e74e29151bd9c6_720w.webp) + +
+ +鍓湰鐩殑鏄负浜嗗浠斤紝鎵浠ュ悓涓涓垎鍖哄瓨鍌ㄥ湪涓嶅悓鐨刡roker涓婏紝鍗冲綋third-2瀛樺湪褰撳墠鏈哄櫒kafka01涓婏紝瀹為檯涓婂啀kafka03涓篃鏈夎繖涓垎鍖虹殑鏂囦欢锛堝壇鏈級锛屽垎鍖轰腑鍖呭惈鍓湰锛屽嵆涓涓垎鍖哄彲浠ヨ缃涓壇鏈紝鍓湰涓湁涓涓槸leader锛屽叾浣欎负follower銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-6e8de9e7dcbdac0b7bd424eaaf4f8568_720w.webp) + +
+ +濡傛灉.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\. 鏂逛究鍦ㄩ泦缇や腑鎵╁睍锛氭瘡涓猵artition閫氳繃璋冩暣浠ラ傚簲瀹冩墍鍦ㄧ殑鏈哄櫒锛岃屼竴涓猅opic鍙堝彲浠ユ湁澶氫釜partition缁勬垚锛屽洜姝ゆ暣涓泦缇ゅ彲浠ラ傚簲閫傚悎鐨勬暟鎹 2\. 鍙互鎻愰珮骞跺彂锛氫互Partition涓哄崟浣嶈繘琛岃鍐欍傜被浼间簬澶氳矾銆 + +**鍒嗗尯鐨勫師鍒** 1\. 鎸囨槑partition锛堣繖閲岀殑鎸囨槑鏄寚绗嚑涓垎鍖猴級鐨勬儏鍐典笅锛岀洿鎺ュ皢鎸囨槑鐨勫间綔涓簆artition鐨勫 2\. 娌℃湁鎸囨槑partition鐨勬儏鍐典笅锛屼絾鏄瓨鍦ㄥ糼ey锛屾鏃跺皢key鐨刪ash鍊间笌topic鐨刾artition鎬绘暟杩涜鍙栦綑寰楀埌partition鍊 3\. 鍊间笌partition鍧囨棤鐨勬儏鍐典笅锛岀涓娆¤皟鐢ㄦ椂闅忔満鐢熸垚涓涓暣鏁帮紝鍚庨潰姣忔璋冪敤鍦ㄨ繖涓暣鏁颁笂鑷锛屽皢杩欎釜鍊间笌topic鍙敤鐨刾artition鎬绘暟鍙栦綑寰楀埌partition鍊硷紝鍗硆ound-robin绠楁硶銆 + +## 鍥. 鐢熶骇鑰匢SR + +涓轰繚璇乸roducer鍙戦佺殑鏁版嵁鑳藉鍙潬鐨勫彂閫佸埌鎸囧畾鐨則opic涓紝topic鐨勬瘡涓猵artition鏀跺埌producer鍙戦佺殑鏁版嵁鍚庯紝閮介渶瑕佸悜producer鍙戦乤ckacknowledgement锛屽鏋減roducer鏀跺埌ack灏变細杩涜涓嬩竴杞殑鍙戦侊紝鍚﹀垯閲嶆柊鍙戦佹暟鎹 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-409ea1af4f66bd2f44398850cc2ba9e2_720w.webp) + +
+ +**鍙戦乤ck鐨勬椂鏈** 纭繚鏈塮ollower涓巐eader鍚屾瀹屾垚锛宭eader鍐嶅彂閫乤ck锛岃繖鏍峰彲浠ヤ繚璇佸湪leader鎸傛帀涔嬪悗锛宖ollower涓彲浠ラ夊嚭鏂扮殑leader锛堜富瑕佹槸纭繚follower涓暟鎹笉涓㈠け锛 + +**follower鍚屾瀹屾垚澶氬皯鎵嶅彂閫乤ck** 1\. 鍗婃暟浠ヤ笂鐨刦ollower鍚屾瀹屾垚锛屽嵆鍙彂閫乤ck 2\. 鍏ㄩ儴鐨刦ollower鍚屾瀹屾垚锛屾墠鍙互鍙戦乤ck + +## 4.1 鍓湰鏁版嵁鍚屾绛栫暐 + +### 4.1.1 鍗婃暟follower鍚屾瀹屾垚鍗冲彂閫乤ck + +浼樼偣鏄欢杩熶綆 + +缂虹偣鏄変妇鏂扮殑leader鐨勬椂鍊欙紝瀹瑰繊n鍙拌妭鐐圭殑鏁呴殰锛岄渶瑕2n+1涓壇鏈紙鍥犱负闇瑕佸崐鏁板悓鎰忥紝鎵浠ユ晠闅滅殑鏃跺欙紝鑳藉閫変妇鐨勫墠鎻愭槸鍓╀笅鐨勫壇鏈秴杩囧崐鏁帮級锛屽閿欑巼涓1/2 + +### 4.1.2 鍏ㄩ儴follower鍚屾瀹屾垚瀹屾垚鍙戦乤ck + +浼樼偣鏄閿欑巼鎼烇紝閫変妇鏂扮殑leader鐨勬椂鍊欙紝瀹瑰繊n鍙拌妭鐐圭殑鏁呴殰鍙渶瑕乶+1涓壇鏈嵆鍙紝鍥犱负鍙渶瑕佸墿涓嬬殑涓涓汉鍚屾剰鍗冲彲鍙戦乤ck浜 + +缂虹偣鏄欢杩熼珮锛屽洜涓洪渶瑕佸叏閮ㄥ壇鏈悓姝ュ畬鎴愭墠鍙 + +### 4.1.3 kafka鐨勯夋嫨 + +kafka閫夋嫨鐨勬槸绗簩绉嶏紝鍥犱负鍦ㄥ鍣ㄧ巼涓婇潰鏇村姞鏈変紭鍔匡紝鍚屾椂瀵逛簬鍒嗗尯鐨勬暟鎹岃█锛屾瘡涓垎鍖洪兘鏈夊ぇ閲忕殑鏁版嵁锛岀涓绉嶆柟妗堜細閫犳垚澶ч噺鏁版嵁鐨勫啑浣欍傝櫧鐒剁浜岀缃戠粶寤惰繜杈冮珮锛屼絾鏄綉缁滃欢杩熷浜嶬afka鐨勫奖鍝嶈緝灏忋 + +## 4.2 ISR(鍚屾鍓湰闆) + +**鐚滄兂** 閲囩敤浜嗙浜岀鏂规杩涜鍚屾ack涔嬪悗锛屽鏋渓eader鏀跺埌鏁版嵁锛屾墍鏈夌殑follower寮濮嬪悓姝ユ暟鎹紝浣嗘湁涓涓猣ollower鍥犱负鏌愮鏁呴殰锛岃繜杩熶笉鑳藉涓巐eader杩涜鍚屾锛岄偅涔坙eader灏辫涓鐩寸瓑寰呬笅鍘伙紝鐩村埌瀹冨悓姝ュ畬鎴愶紝鎵嶅彲浠ュ彂閫乤ck锛屾鏃堕渶瑕佸浣曡В鍐宠繖涓棶棰樺憿锛 + +**瑙e喅** leader涓淮鎶や簡涓涓姩鎬佺殑ISR锛坕n-sync replica set锛夛紝鍗充笌leader淇濇寔鍚屾鐨刦ollower闆嗗悎锛屽綋ISR涓殑follower瀹屾垚鏁版嵁鐨勫悓姝ヤ箣鍚庯紝缁檒eader鍙戦乤ck锛屽鏋渇ollower闀挎椂闂存病鏈夊悜leader鍚屾鏁版嵁锛屽垯璇ollower灏嗕粠ISR涓韪㈠嚭锛岃涔嬮棿闃堝肩敱replica.lag.time.max.ms鍙傛暟璁惧畾銆傚綋leader鍙戠敓鏁呴殰涔嬪悗锛屼細浠嶪SR涓変妇鍑烘柊鐨刲eader銆 + +## 浜. 鐢熶骇鑰卆ck鏈哄埗 + +瀵逛簬鏌愪簺涓嶅お閲嶈鐨勬暟鎹紝瀵规暟鎹殑鍙潬鎬ц姹備笉鏄緢楂橈紝鑳藉瀹瑰繊鏁版嵁鐨勫皯閲忎涪澶憋紝鎵浠ユ病鏈夊繀瑕佺瓑鍒癐SR涓墍鏈夌殑follower鍏ㄩ儴鎺ュ彈鎴愬姛銆 + +Kafka涓虹敤鎴锋彁渚涗簡涓夌鍙潬鎬х骇鍒紝鐢ㄦ埛鏍规嵁鍙潬鎬у拰寤惰繜鐨勮姹傝繘琛屾潈琛¢夋嫨涓嶅悓鐨勯厤缃 + +**ack鍙傛暟閰嶇疆** 0锛歱roducer涓嶇瓑寰卋roker鐨刟ck锛岃繖涓鎿嶄綔鎻愪緵浜嗘渶浣庣殑寤惰繜锛宐roker鎺ユ敹鍒拌繕娌℃湁鍐欏叆纾佺洏灏卞凡缁忚繑鍥烇紝褰揵roker鏁呴殰鏃舵湁鍙兘涓㈠け鏁版嵁 + +1锛歱roducer绛夊緟broker鐨刟ck锛宲artition鐨刲eader钀界洏鎴愬姛鍚庤繑鍥瀉ck锛屽鏋滃湪follower鍚屾鎴愬姛涔嬪墠leader鏁呴殰锛岄偅涔堝皢涓㈠け鏁版嵁銆傦紙鍙槸leader钀界洏锛 + +
+ + +![](https://pic1.zhimg.com/80/v2-a219d261edd97432347f4edf5794e170_720w.webp) + +
+ +-1(all)锛歱roducer绛夊緟broker鐨刟ck锛宲artition鐨刲eader鍜孖SR鐨刦ollower鍏ㄩ儴钀界洏鎴愬姛鎵嶈繑鍥瀉ck锛屼絾鏄鏋滃湪follower鍚屾瀹屾垚鍚庯紝broker鍙戦乤ck涔嬪墠锛屽鏋渓eader鍙戠敓鏁呴殰锛屼細閫犳垚鏁版嵁閲嶅銆(杩欓噷鐨勬暟鎹噸澶嶆槸鍥犱负娌℃湁鏀跺埌锛屾墍浠ョ户缁噸鍙戝鑷寸殑鏁版嵁閲嶅) + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-c9741a10f418f7ea4eed929f0f266bbb_720w.webp) + +
+ +producer杩攁ck锛0鏃犺惤鐩樼洿鎺ヨ繑锛1鍙猯eader钀界洏鐒跺悗杩旓紝-1鍏ㄩ儴钀界洏鐒跺悗杩 + +## 鍏. 鏁版嵁涓鑷存ч棶棰 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-031d84a2012f64b122dd64ab67a4e52a_720w.webp) + +
+ +LEO(Log End Offset)锛氭瘡涓壇鏈渶鍚庣殑涓涓猳ffset HW(High Watermark)锛氶珮姘翠綅锛屾寚浠f秷璐硅呰兘瑙佸埌鐨勬渶澶х殑offset锛孖SR闃熷垪涓渶灏忕殑LEO銆 + +**follower鏁呴殰鍜宭eader鏁呴殰** 1\. follower鏁呴殰锛歠ollower鍙戠敓鏁呴殰鍚庝細琚复鏃惰涪鍑篒SR锛岀瓑寰呰follower鎭㈠鍚庯紝follower浼氳鍙栨湰鍦扮鐩樿褰曠殑涓婃鐨凥W锛屽苟灏唋og鏂囦欢楂樹簬HW鐨勯儴鍒嗘埅鍙栨帀锛屼粠HW寮濮嬪悜leader杩涜鍚屾锛岀瓑寰呰follower鐨凩EO澶т簬绛変簬璇artition鐨凥W锛屽嵆follower杩戒笂leader涔嬪悗锛屽氨鍙互閲嶆柊鍔犲叆ISR浜嗐 2\. leader鏁呴殰锛歭eader鍙戠敓鏁呴殰涔嬪悗锛屼細浠嶪SR涓夊嚭涓涓柊鐨刲eader锛屼负浜嗕繚璇佸涓壇鏈箣闂寸殑鏁版嵁鐨勪竴鑷存э紝鍏朵綑鐨刦ollower浼氬厛灏嗗悇鑷殑log鏂囦欢楂樹簬HW鐨勯儴鍒嗘埅鎺夛紝鐒跺悗浠庢柊鐨刲eader涓悓姝ユ暟鎹 + +**杩欏彧鑳戒繚璇佸壇鏈箣闂寸殑鏁版嵁涓鑷存э紝骞朵笉鑳戒繚璇佹暟鎹笉涓㈠け鎴栬呬笉閲嶅** + +## 涓. ExactlyOnce + +灏嗘湇鍔″櫒鐨凙CK绾у埆璁剧疆涓-1锛坅ll锛夛紝鍙互淇濊瘉producer鍒癝erver涔嬮棿涓嶄細涓㈠け鏁版嵁锛屽嵆At Least Once鑷冲皯涓娆¤涔夈傚皢鏈嶅姟鍣ˋCK绾у埆璁剧疆涓0锛屽彲浠ヤ繚璇佺敓浜ц呮瘡鏉℃秷鎭彧浼氳鍙戦佷竴娆★紝鍗矨t Most Once鑷冲涓娆° + +At Least Once鍙互淇濊瘉鏁版嵁涓嶄涪澶憋紝浣嗘槸涓嶈兘淇濊瘉鏁版嵁涓嶉噸澶嶏紝鑰孉t Most Once鍙互淇濊瘉鏁版嵁涓嶉噸澶嶏紝浣嗘槸涓嶈兘淇濊瘉鏁版嵁涓嶄涪澶憋紝瀵逛簬閲嶈鐨勬暟鎹紝鍒欒姹傛暟鎹笉閲嶅涔熶笉涓㈠け锛屽嵆Exactly Once鍗崇簿纭殑涓娆° + +鍦0.11鐗堟湰鐨凨afka涔嬪墠锛屽彧鑳戒繚璇佹暟鎹笉涓㈠け锛屽湪涓嬫父瀵规暟鎹殑閲嶅杩涜鍘婚噸鎿嶄綔锛屽浣欏涓笅娓稿簲鐢ㄧ殑鎯呭喌锛屽垯鍒嗗埆杩涜鍏ㄥ眬鍘婚噸锛屽鎬ц兘鏈夊緢澶у奖鍝嶃 + +0.11鐗堟湰鐨刱afka锛屽紩鍏ヤ簡涓椤归噸澶х壒鎬э細骞傜瓑鎬э紝骞傜瓑鎬ф寚浠roducer涓嶈鍚慡erver鍙戦佷簡澶氬皯娆¢噸澶嶆暟鎹紝Server绔兘鍙細鎸佷箙鍖栦竴鏉℃暟鎹傚箓绛夋х粨鍚圓t Least Once璇箟灏辨瀯鎴愪簡Kafka鐨凟xactly Once璇箟銆 + +鍚敤骞傜瓑鎬э紝鍗冲湪Producer鐨勫弬鏁颁腑璁剧疆enable.idempotence=true鍗冲彲锛孠afka鐨勫箓绛夋у疄鐜板疄闄呮槸灏嗕箣鍓嶇殑鍘婚噸鎿嶄綔鏀惧湪浜嗘暟鎹笂娓告潵鍋氾紝寮鍚箓绛夋х殑Producer鍦ㄥ垵濮嬪寲鐨勬椂鍊欎細琚垎閰嶄竴涓狿ID锛屽彂寰鍚屼竴涓狿artition鐨勬秷鎭細闄勫甫Sequence Number锛岃孊roker绔細瀵瑰仛缂撳瓨锛屽綋鍏锋湁鐩稿悓涓婚敭鐨勬秷鎭殑鏃跺欙紝Broker鍙細鎸佷箙鍖栦竴鏉° + +浣哖ID鍦ㄩ噸鍚箣鍚庝細鍙戠敓鍙樺寲锛屽悓鏃朵笉鍚岀殑Partition涔熷叿鏈変笉鍚岀殑涓婚敭锛屾墍浠ュ箓绛夋ф棤娉曚繚璇佽法鍒嗗尯璺ㄤ細璇濈殑Exactly Once銆 + +瑕佽В鍐宠法鍒嗗尯璺ㄤ細璇濈殑Exactly Once锛屽氨寮曞叆浜嗙敓浜ц呬簨鍔$殑姒傚康銆 + +## 鍏. Kafka娑堣垂鑰呭垎鍖哄垎閰嶇瓥鐣 + +**娑堣垂鏂瑰紡:** consumer閲囩敤pull鎷夌殑鏂瑰紡鏉ヤ粠broker涓鍙栨暟鎹 + +push鎺ㄧ殑妯″紡寰堥毦閫傚簲娑堣垂閫熺巼涓嶅悓鐨勬秷璐硅咃紝鍥犱负娑堟伅鍙戦佺巼鏄敱broker鍐冲畾鐨勶紝瀹冪殑鐩爣鏄敖鍙兘浠ユ渶蹇殑閫熷害浼犻掓秷鎭紝浣嗘槸杩欐牱瀹规槗閫犳垚consumer鏉ヤ笉鍙婂鐞嗘秷鎭紝鍏稿瀷鐨勮〃鐜板氨鏄嫆缁濇湇鍔′互鍙婄綉缁滄嫢濉炪傝宲ull鏂瑰紡鍒欏彲浠ヨconsumer鏍规嵁鑷繁鐨勬秷璐瑰鐞嗚兘鍔涗互閫傚綋鐨勯熷害娑堣垂娑堟伅銆 + +pull妯″紡涓嶈冻鍦ㄤ簬濡傛灉Kafka涓病鏈夋暟鎹紝娑堣垂鑰呭彲鑳戒細闄峰叆寰幆涔嬩腑 (鍥犱负娑堣垂鑰呯被浼肩洃鍚姸鎬佽幏鍙栨暟鎹秷璐圭殑)锛屼竴鐩磋繑鍥炵┖鏁版嵁锛岄拡瀵硅繖涓鐐癸紝Kafka鐨勬秷璐硅呭湪娑堣垂鏁版嵁鏃朵細浼犲叆涓涓椂闀垮弬鏁皌imeout锛屽鏋滃綋鍓嶆病鏈夋暟鎹彲渚涙秷璐癸紝consumer浼氱瓑寰呬竴娈垫椂闂翠箣鍚庡啀杩斿洖锛屾椂闀夸负timeout銆 + +## 8.1\. 鍒嗗尯鍒嗛厤绛栫暐 + +涓涓猚onsumer group涓湁澶氫釜consumer锛屼竴涓猼opic鏈夊涓猵artition锛屾墍浠ュ繀鐒朵細娑夊強鍒皃artition鐨勫垎閰嶉棶棰橈紝鍗崇‘瀹氶偅涓猵artition鐢遍偅涓猚onsumer娑堣垂鐨勯棶棰樸 + +**Kafka鐨勪袱绉嶅垎閰嶇瓥鐣ワ細** 1\. round-robin寰幆 2\. range + +**Round-Robin** 涓昏閲囩敤杞鐨勬柟寮忓垎閰嶆墍鏈夌殑鍒嗗尯锛岃绛栫暐涓昏瀹炵幇鐨勬楠わ細 鍋囪瀛樺湪涓変釜topic锛歵0/t1/t2锛屽垎鍒嫢鏈1/2/3涓垎鍖猴紝鍏辨湁6涓垎鍖猴紝鍒嗗埆涓簍0-0/t1-0/t1-1/t2-0/t2-1/t2-2锛岃繖閲屽亣璁炬垜浠湁涓変釜Consumer锛孋0銆丆1銆丆2锛岃闃呮儏鍐典负C0锛歵0锛孋1锛歵0銆乼1锛孋2锛歵0/t1/t2銆 + +姝ゆ椂round-robin閲囧彇鐨勫垎閰嶆柟寮忥紝鍒欐槸鎸夌収鍒嗗尯鐨勫瓧鍏稿鍒嗗尯鍜屾秷璐硅呰繘琛屾帓搴忥紝鐒跺悗瀵瑰垎鍖鸿繘琛屽惊鐜亶鍘嗭紝閬囧埌鑷繁璁㈤槄鐨勫垯娑堣垂锛屽惁鍒欏悜涓嬭疆璇笅涓涓秷璐硅呫傚嵆鎸夌収鍒嗗尯杞娑堣垂鑰咃紝缁ц屾秷鎭娑堣垂銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-21eed325191d7d72c9d4c39455c4cae5_720w.webp) + +
+ +鍒嗗尯鍦ㄥ惊鐜亶鍘嗘秷璐硅咃紝鑷繁琚綋鍓嶆秷璐硅呰闃咃紝鍒欐秷鎭笌娑堣垂鑰呭叡鍚屽悜涓嬶紙娑堟伅琚秷璐癸級锛屽惁鍒欐秷璐硅呭悜涓嬫秷鎭户缁亶鍘嗭紙娑堟伅娌℃湁琚秷璐癸級銆傝疆璇㈢殑鏂瑰紡浼氬鑷存瘡涓狢onsumer鎵鎵胯浇鐨勫垎鍖烘暟閲忎笉涓鑷达紝浠庤屽鑷村悇涓狢onsumer鍘嬪姏涓嶅潎銆備笂闈㈢殑C2鍥犱负璁㈤槄鐨勬瘮杈冨锛屽鑷存壙鍙楃殑鍘嬪姏涔熺浉瀵硅緝澶с + +**Range** Range鐨勯噸鍒嗛厤绛栫暐锛岄鍏堣绠楀悇涓狢onsumer灏嗕細鎵胯浇鐨勫垎鍖烘暟閲忥紝鐒跺悗灏嗘寚瀹氭暟閲忕殑鍒嗗尯鍒嗛厤缁欒Consumer銆傚亣璁惧瓨鍦ㄤ袱涓狢onsumer锛孋0鍜孋1锛屼袱涓猅opic锛宼0鍜宼1锛岃繖涓や釜Topic鍒嗗埆閮芥湁涓変釜鍒嗗尯锛岄偅涔堟诲叡鐨勫垎鍖烘湁6涓紝t0-0锛宼0-1锛宼0-2锛宼1-0锛宼1-1锛宼1-2銆傚垎閰嶆柟寮忓涓嬶細 + +range鎸夌収topic涓娆¤繘琛屽垎閰嶏紝鍗虫秷璐硅呴亶鍘唗opic锛宼0锛屽惈鏈変笁涓垎鍖猴紝鍚屾椂鏈変袱涓闃呬簡璇opic鐨勬秷璐硅咃紝灏嗚繖浜涘垎鍖哄拰娑堣垂鑰呮寜鐓у瓧鍏稿簭鎺掑垪銆 鎸夌収骞冲潎鍒嗛厤鐨勬柟寮忚绠楁瘡涓狢onsumer浼氬緱鍒板灏戜釜鍒嗗尯锛屽鏋滄病鏈夐櫎灏斤紝澶氬嚭鏉ョ殑鍒嗗尯鍒欐寜鐓у瓧鍏稿簭鎸ㄤ釜鍒嗛厤缁欐秷璐硅呫傛寜鐓ф鏂瑰紡浠ユ鍒嗛厤姣忎竴涓猼opic缁欒闃呯殑娑堣垂鑰咃紝鏈鍚庡畬鎴恡opic鍒嗗尯鐨勫垎閰嶃 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-d642ed5512a4abdca9a8f35f2d27c277_720w.webp) + +
+ +## 8.2\. 娑堣垂鑰卭ffset鐨勫瓨鍌 + +鐢变簬Consumer鍦ㄦ秷璐硅繃绋嬩腑鍙兘浼氬嚭鐜版柇鐢靛畷鏈虹瓑鏁呴殰锛孋onsumer鎭㈠浠ュ悗锛岄渶瑕佷粠鏁呴殰鍓嶇殑浣嶇疆缁х画娑堣垂锛屾墍浠onsumer闇瑕佸疄鏃惰褰曡嚜宸辨秷璐瑰埌浜嗛偅涓猳ffset锛屼互渚挎晠闅滄仮澶嶅悗缁х画娑堣垂銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-f2a50fd7f054821e36a80b1f6d99ecb0_720w.webp) + +
+ +Kafka0.9鐗堟湰涔嬪墠锛宑onsumer榛樿灏唎ffset淇濆瓨鍦▃ookeeper涓紝浠0.9鐗堟湰涔嬪悗锛宑onsumer榛樿灏唎ffset淇濆瓨鍦╧afka涓涓唴缃殑topic涓紝璇opic涓篲_consumer_offsets + +## 涔. 楂樻晥璇诲啓&Zookeeper浣滅敤 + +## 9.1 楂樻晥璇诲啓 + +**椤哄簭鍐欑鐩** Kafka鐨刾roducer鐢熶骇鏁版嵁锛岄渶瑕佸啓鍏ュ埌log鏂囦欢涓紝鍐欑殑杩囩▼鏄拷鍔犲埌鏂囦欢鏈锛岄『搴忓啓鐨勬柟寮忥紝瀹樼綉鏈夋暟鎹〃鏄庯紝鍚屾牱鐨勭鐩橈紝椤哄簭鍐欒兘澶熷埌600M/s锛岃岄殢鏈哄啓鍙湁200K/s锛岃繖涓庣鐩樼殑鏈烘缁撴瀯鏈夊叧锛岄『搴忓啓涔嬫墍浠ュ揩锛屾槸鍥犱负鍏剁渷鍘讳簡澶ч噺纾佸ご瀵诲潃鐨勬椂闂淬 + +**闆跺鍒舵妧鏈** + +NIC锛歂etwork Interface Controller缃戠粶鎺ュ彛鎺у埗鍣 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-2807d010381d304949bf8cea16ba1744_720w.webp) + +
+ +杩欐槸甯歌鐨勮鍙栨搷浣滐細 1\. 鎿嶄綔绯荤粺灏嗘暟鎹粠纾佺洏鏂囦欢涓鍙栧埌鍐呮牳绌洪棿鐨勯〉闈㈢紦瀛 2\. 搴旂敤绋嬪簭灏嗘暟鎹粠鍐呮牳绌洪棿璇诲叆鍒扮敤鎴风┖闂寸紦鍐插尯 3\. 搴旂敤绋嬪簭灏嗚鍒扮殑鏁版嵁鍐欏洖鍐呮牳绌洪棿骞舵斁鍏ュ埌socket缂撳啿鍖 4\. 鎿嶄綔绯荤粺灏嗘暟鎹粠socket缂撳啿鍖哄鍒跺埌缃戝崱鎺ュ彛锛屾鏃舵暟鎹氳繃缃戠粶鍙戦佺粰娑堣垂鑰 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-390cbabdeaba6f9e79a8ba6f4d08d75f_720w.webp) + +
+ +闆舵嫹璐濇妧鏈彧鐢ㄥ皢纾佺洏鏂囦欢鐨勬暟鎹鍒跺埌椤甸潰缂撳瓨涓竴娆★紝鐒跺悗灏嗘暟鎹粠椤甸潰缂撳瓨鐩存帴鍙戦佸埌缃戠粶涓紙鍙戦佺粰涓嶅悓鐨勮闃呰呮椂锛岄兘鍙互浣跨敤鍚屼竴涓〉闈㈢紦瀛橈級锛屼粠鑰岄伩鍏嶄簡閲嶅澶嶅埗鐨勬搷浣溿 + +濡傛灉鏈10涓秷璐硅咃紝浼犵粺鏂瑰紡涓嬶紝鏁版嵁澶嶅埗娆℃暟涓4*10=40娆★紝鑰屼娇鐢ㄢ滈浂鎷疯礉鎶鏈濆彧闇瑕1+10=11娆★紝涓娆′负浠庣鐩樺鍒跺埌椤甸潰缂撳瓨锛10娆¤〃绀10涓秷璐硅呭悇鑷鍙栦竴娆¢〉闈㈢紦瀛樸 + +## 9.2 zookeeper浣滅敤 + +Kafka闆嗙兢涓湁涓涓猙roker浼氳閫変妇涓篊ontroller锛岃礋璐g鐞嗛泦缇roker鐨勪笂涓嬬嚎銆佹墍鏈塼opic鐨勫垎鍖哄壇鏈垎閰嶅拰leader鐨勯変妇绛夊伐浣溿侰ontroller鐨勫伐浣滅鐞嗘槸渚濊禆浜巣ookeeper鐨勩 + +**Partition鐨凩eader鐨勯変妇杩囩▼** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-fc64ea72cba32e702b15344767bdace9_720w.webp) + +
+ +## 鍗. 浜嬪姟 + +kafka浠0.11鐗堟湰寮濮嬪紩鍏ヤ簡浜嬪姟鏀寔锛屼簨鍔″彲浠ヤ繚璇並afka鍦‥xactly Once璇箟鐨勫熀纭涓婏紝鐢熶骇鍜屾秷璐瑰彲浠ヨ法鍒嗗尯鐨勪細璇濓紝瑕佷箞鍏ㄩ儴鎴愬姛锛岃涔堝叏閮ㄥけ璐ャ + +## 10.1 Producer浜嬪姟 + +涓轰簡鎸夎法鍒嗗尯璺ㄤ細璇濈殑浜嬪姟锛岄渶瑕佸紩鍏ヤ竴涓叏灞鍞竴鐨凾ransaction ID锛屽苟灏哖roducer鑾峰緱鐨凱ID(鍙互鐞嗚В涓篜roducer ID)鍜孴ransaction ID杩涜缁戝畾锛岃繖鏍峰綋Producer閲嶅惎涔嬪悗灏卞彲浠ラ氳繃姝e湪杩涜鐨凾ransaction ID鑾峰緱鍘熸潵鐨凱ID銆 + +涓轰簡绠$悊Transaction锛孠afka寮曞叆浜嗕竴涓柊鐨勭粍浠禩ransaction Coordinator锛孭roducer灏辨槸閫氳繃鏈夊拰Transaction Coordinator浜や簰鑾峰緱Transaction ID瀵瑰簲鐨勪换鍔$姸鎬侊紝Transaction Coordinator杩樿礋璐e皢浜嬪姟淇℃伅鍐欏叆鍐呴儴鐨勪竴涓猅opic涓紝杩欐牱鍗充娇鏁翠釜鏈嶅姟閲嶅惎锛岀敱浜庝簨鍔$姸鎬佸緱鍒颁繚瀛橈紝杩涜涓殑浜嬪姟鐘舵佸彲浠ユ仮澶嶏紝浠庤岀户缁繘琛屻 + +## 10.2 Consumer浜嬪姟 + +瀵逛簬Consumer鑰岃█锛屼簨鍔$殑淇濊瘉鐩告瘮Producer鐩稿杈冨急锛屽挨鍏舵槸鏃犳硶淇濊瘉Commit鐨勪俊鎭绮剧‘娑堣垂锛岃繖鏄敱浜嶤onsumer鍙互閫氳繃offset璁块棶浠绘剰淇℃伅锛岃屼笖涓嶅悓鐨凷egment 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 鏃犳硶姝e父璁块棶锛屽浣曡浠 Partition 杞彉鎴愪富 Partition 鏉ョ户缁彁渚涙甯哥殑璇诲啓鏈嶅姟锛熸兂瑕佽В鍐宠繖浜涢棶棰橈紝灏卞繀椤诲厛瑕佷簡瑙d竴涓 Kafka 闆嗙兢鍐呴儴鐨勭鐞嗘満鍒讹紝鍏朵腑涓涓潪甯搁噸瑕佺殑鎺у埗鍣ㄥ氨鏄 KafkaController銆傛湰鏂囨垜浠氨鏉ヨ璁 KafkaController 鏄浣曟潵瑙e喅涓婇潰鎻愬埌鐨勯偅浜涢棶棰樼殑銆 + +### **鏂囩珷姒傝** + +1. KafkaController 鏄粈涔堝強鍏堕変妇绛栫暐銆 +2. KafkaController 鐩戞帶 ZK 鐨勭洰褰曞垎甯冦 +3. Partition 鍒嗗竷绠楁硶銆 +4. Partition 鐨勭姸鎬佽浆绉汇 +5. Kafka 闆嗙兢鐨勮礋杞藉潎琛″鐞嗘祦绋嬭В鏋愩 + +## **KafkaController 鏄粈涔堝強鍏堕変妇绛栫暐** + +Kafka 闆嗙兢鐢卞鍙 Broker 鏋勬垚锛屾瘡鍙 Broker 閮芥湁涓涓 KafkaController 鐢ㄤ簬绠$悊褰撳墠鐨 Broker銆傝瘯鎯充竴涓嬶紝濡傛灉涓涓泦缇ゆ病鏈変竴涓滈瀵艰呪濓紝閭d箞璋佸幓鍜屸滃鐣屸濓紙姣斿 ZK锛夋矡閫氬憿锛熻皝鍘诲崗璋 Partition 搴旇濡備綍鍒嗗竷鍦ㄩ泦缇や腑鐨勪笉鍚 Broker 涓婂憿锛熻皝鍘诲鐞 Broker 瀹曟満鍚庯紝鍦ㄥ叾 Broker 涓婄殑涓 Partition 鏃犳硶姝e父鎻愪緵璇诲啓鏈嶅姟鍚庯紝灏嗗搴旂殑浠 Partition 杞彉鎴愪富 Partition 缁х画姝e父瀵瑰鎻愪緵鏈嶅姟鍛紵閭d箞鐢卞摢涓 Broker 鐨 KafkaController 鏉ユ媴褰撯滈瀵艰呪濊繖涓鑹插憿锛 + +Kafka 鐨勮璁¤呭緢鑱槑锛孼ookeeper 鏃㈢劧鏄垎甯冨紡搴旂敤鍗忚皟鏈嶅姟锛岄偅涔堝共鑴嗗氨璁╁畠鏉ュ府 Kafka 闆嗙兢閫変妇涓涓滈瀵艰呪濆嚭鏉ワ紝杩欎釜鈥滈瀵艰呪濆搴旂殑 KafkaController 绉颁负 Leader锛屽叾浠栫殑 KafkaController 琚О涓 Follower锛屽湪鍚屼竴鏃跺埢锛屼竴涓 Kafka 闆嗙兢鍙兘鏈変竴涓 Leader 鍜 N 涓 Follower銆 + +### **Zookeeper 鏄庝箞瀹炵幇 KafkaController 鐨勯変富宸ヤ綔鍛紵** + +绋嶅井鐔熸倝 Zookeeper 鐨勫皬浼欎即搴旇閮芥瘮杈冩竻妤氾紝Zookeeper 鏄氳繃鐩戞帶鐩綍锛坺Node锛夌殑鍙樺寲锛屼粠鑰屽仛鍑轰竴浜涚浉搴旂殑鍔ㄤ綔銆 + +Zookeeper 鐨勭洰褰曞垎涓哄洓绉嶏紝绗竴绉嶆槸姘镐箙鐨勶紝琚О浣滀负 `Persistent`锛 + +绗簩绉嶆槸椤哄簭涓旀案涔呯殑锛岃绉颁綔涓 `Persistent_Sequential`锛 + +绗笁绉嶆槸涓存椂鐨勶紝琚О涓 `Ephemeral`锛 + +绗洓绉嶆槸椤哄簭涓斾复鏃剁殑锛岃绉颁綔涓 `Ephemeral_Sequential`銆 + +KafkaController 姝f槸鍒╃敤浜嗕复鏃剁殑杩欎竴鐗规ф潵瀹屾垚閫変富鐨勶紝鍦 Broker 鍚姩鏃讹紝姣忎釜 Broker 鐨 KafkaController 閮戒細鍚 ZK 鐨 `/controller` 鐩綍鍐欏叆 BrokerId锛岃皝鍏堝啓鍏ヨ皝灏辨槸 Leader锛屽墿浣欑殑 KafkaController 鏄 Follower锛屽綋 Leader 鍦ㄥ懆鏈熷唴娌℃湁鍚 ZK 鍙戦佹姤鍛婄殑璇濓紝鍒欒涓 Leader 鎸備簡锛屾鏃 ZK 鍒犻櫎涓存椂鐨 `/controller` 鐩綍锛孠afka 闆嗙兢涓殑鍏朵粬 KafkaController 寮濮嬫柊鐨勪竴杞簤涓绘搷浣滐紝娴佺▼鍜屼笂闈竴鏍枫備笅闈㈡槸閫 Leader 鐨勬祦绋嬪浘銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-af1f22f109f85fe6b169c6e4a271016f_720w.webp) + +
Leader閫変妇娴佺▼鍥
+ +
+ +浠庝笂鍥惧彲浠ョ湅鍑猴紝绗竴娆★紝Broker1 鎴愬姛鎶㈠厛鍦 Zookeeper 鐨 /controller 鐩綍涓婂啓鍏ヤ俊鎭紝鎵浠 Broker1 鐨 KafkaController 涓 Leader锛屽叾浠栦袱涓负 Follower銆傜浜屾锛孊roker1 瀹曟満鎴栬呬笅绾匡紝姝ゆ椂 Broker2 鍜 Broker3 妫娴嬪埌锛屼簬鏄紑濮嬫柊涓杞殑浜夋姠灏嗕俊鎭啓鍏 Zookeeper锛屼粠鍥句腑鍙互鐪嬪嚭锛孊roker2 浜夊埌浜 Leader锛屾墍浠 Broker3 鏄 Follower 鐘舵併 + +姝e父鎯呭喌涓嬶紝涓婇潰杩欎釜娴佺▼娌℃湁闂锛屼絾鏄鏋滃湪 Broker1 绂荤嚎鐨勬儏鍐典笅锛孼ookeeper 鍑嗗鍒犻櫎 /controller 鐨勪复鏃 node 鏃讹紝绯荤粺 hang 浣忔病鍔炴硶鍒犻櫎锛屾敼鎬庝箞鍔炲憿锛熻繖閲岀暀涓皬鐤戦棶渚涘ぇ瀹舵濊冦傚悗闈細鐢ㄤ竴绡囨枃绔犱笓闂ㄦ潵瑙g瓟 Kafka 鐩稿叧鐨勯棶棰橈紙鍖呮嫭闈㈣瘯棰樺摝锛屾暚璇锋湡寰咃級銆 + +## **KafkaController 鐩戞帶鐨 ZK 鐩綍鍒嗗竷** + +KafkaController 鍦ㄥ垵濮嬪寲鐨勬椂鍊欙紝浼氶拡瀵逛笉鍚岀殑 zNode 娉ㄥ唽鍚勭鍚勬牱鐨勭洃鍚櫒锛屼互渚垮鐞嗕笉鍚岀殑鐢ㄦ埛璇锋眰鎴栬呯郴缁熷唴閮ㄥ彉鍖栬姹傘傜洃鎺 ZK 鐨勭洰褰曞ぇ姒傚彲浠ュ垎涓轰袱閮ㄥ垎锛屽垎鍒槸 `/admin` 鐩綍鍜 `/brokers` 鐩綍銆傚悇鐩綍鍙婂叾瀵瑰簲鐨勫姛鑳藉涓嬭〃鎵绀猴紝闇瑕佺殑鏈嬪弸鑷彁銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-2a603adc2e06f3663e693259e8bf16d4_720w.webp) + +
+ +## **Partition 鍒嗗竷绠楁硶** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-36d40cb264f6432a81ad83c9365d7997_720w.webp) + +
Partition鍒嗗竷绠楁硶鍥
+ +
+ +鍥捐В锛氬亣璁鹃泦缇ゆ湁 3 涓 Broker锛孭artition 鍥犲瓙涓 2銆 + +1. 闅忔満閫夊彇 Broker 闆嗙兢涓殑涓涓 Broker 鑺傜偣锛岀劧鍚庝互杞鐨勬柟寮忓皢涓 Partition 鍧囧寑鐨勫垎甯冨埌涓嶅悓鐨 Broker 涓娿 +2. 涓 Partition 鍒嗗竷瀹屾垚鍚庯紝灏嗕粠 Partition 鎸夌収 AR 缁勫唴椤哄簭浠ヨ疆璇㈢殑鏂瑰紡灏 Partition 鍧囧寑鐨勫垎甯冨埌涓嶅悓鐨 Broker 涓娿 + +## **Partition 鐨勭姸鎬佽浆绉** + +鐢ㄦ埛閽堝鐗瑰畾鐨 Topic 鍒涘缓浜嗙浉搴旂殑 Partition 锛屼絾鏄繖浜 Partition 涓嶄竴瀹氭椂鍒婚兘鑳藉姝e父宸ヤ綔锛屾墍鏈 Partition 鍦ㄥ悓涓鏃跺埢浼氬搴 4 涓姸鎬佷腑鐨勬煇涓涓紱鍏舵暣涓敓鍛藉懆鏈熶細缁忓巻濡備笅鐘舵佺殑杞Щ锛屽垎鍒槸 NonExistentPartition銆丯ewPartition銆丱nlinePartition銆丱fflinePartition锛屽叾瀵瑰簲鐨勭姸鎬佽浆绉绘儏鍐靛涓嬪浘鎵绀恒 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-58a8609aa2698130679d9fb80541d19b_720w.webp) + +
Partition鐘舵佽浆绉诲浘
+ +
+ +浠庝笂鍥惧彲浠ョ湅鍑猴紝Partition 鐨勭姸鎬佷細鐢卞墠缃姸鎬佹墠鑳藉杞Щ鍒扮洰鏍囩姸鎬佺殑锛岃屼笉鏄儭涔辫浆绉荤姸鎬佺殑銆 + +`NonExistentPartition锛歚浠h〃娌℃湁鍒涘缓 Partition 鏃剁殑鐘舵侊紝涔熸湁鍙兘鏄绾跨殑 Partition 琚垹闄ゅ悗鐨勭姸鎬併 + +`NewPartition锛歚褰 Partition 琚垱寤烘椂锛屾鏃跺彧鏈 AR锛圓ssigned Replica锛夛紝杩樻病鏈 ISR锛圛n-Synic Replica锛夛紝姝ゆ椂杩樹笉鑳芥帴鍙楁暟鎹殑鍐欏叆鍜岃鍙栥 + +`OnlinePartition锛歚鐢 NewPartition 鐘舵佽浆绉讳负 OnlinePartition 鐘舵侊紝姝ゆ椂 Partition 鐨 Leader 宸茬粡琚変妇鍑烘潵浜嗭紝骞朵笖涔熸湁瀵瑰簲鐨 ISR 鍒楄〃绛夈傛鏃跺凡缁忓彲浠ュ澶栨彁渚涜鍐欒姹備簡銆 + +`OfflinePartition锛歚褰 Partition 瀵瑰簲鐨 Broker 瀹曟満鎴栬呯綉缁滃紓甯哥瓑闂锛岀敱 OnlinePartition 杞Щ鍒 OfflinePartition锛屾鏃剁殑 Partition 宸茬粡涓嶈兘鍦ㄥ澶栨彁渚涜鍐欐湇鍔°傚綋 Partition 琚交搴曞垹闄ゅ悗鐘舵佸氨杞Щ鎴 NonExistentPartition锛屽綋缃戠粶鎭㈠鎴栬 Broker 鎭㈠鍚庯紝鍏剁姸鎬佸張鍙互杞Щ鍒 OnlinePartition锛屼粠鑰岀户缁澶栨彁渚涜鍐欐湇鍔° + +## **Kafka 闆嗙兢鐨勮礋杞藉潎琛″鐞嗘祦绋嬭В鏋** + +鍓嶉潰鐨勬枃绔犺鍒拌繃锛孭artition 鏈 Leader Replica 鍜 Preferred Replica 涓ょ瑙掕壊锛孡eader Replica 璐熻矗瀵瑰鎻愪緵璇诲啓鏈嶅姟 Preferred Replica 璐熻矗鍚屾 Leader Replica 涓婄殑鏁版嵁銆傜幇鍦ㄩ泦缇や腑鍋囪鏈 3 涓 Broker锛3 涓 Partition锛屾瘡涓 Partition 鏈 3 涓 Replica锛屽綋闆嗙兢杩愯涓娈垫椂鍊欏悗锛岄泦缇や腑鏌愪簺 Broker 瀹曟満锛孡eader Replica 杩涜杞Щ锛屽叾杩囩▼濡備笅鍥炬墍绀恒 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-dc0bcd6f072f7e6cef8289882259d59e_720w.webp) + +
Partition鐨凩eader杞Щ鍥
+ +
+ +浠庝笂鍥惧彲浠ョ湅鍑猴紝闆嗙兢杩愯涓娈垫椂闂村悗锛孊roker1 鎸傛帀浜嗭紝鍦ㄥ叾涓婅繍琛岀殑 Partition0 瀵瑰簲鐨 Leader Replica 杞Щ鍒颁簡 Broker2 涓娿傚亣璁句竴娈垫椂闂村悗 Broker3 涔熸寕浜嗭紝鍒 Broker3 涓婄殑 Partition3 瀵瑰簲鐨 Leader Replica 涔熻浆绉诲埌浜 Broker2 涓婏紝闆嗙兢涓彧鏈 Broker2 涓婄殑 Partition 鍦ㄥ澶栨彁渚涜鍐欐湇鍔★紝浠庤岄犳垚 Broker2 涓婄殑鏈嶅姟鍘嬪姏姣旇緝澶э紝涔嬪悗 Broker1 鍜 Broker3 鎭㈠鍚庯紝鍏朵笂鍙湁 Preferred Replica 鍋氬浠芥搷浣溿 + +閽堝浠ヤ笂杩欑闅忕潃鏃堕棿鐨勬帹绉伙紝闆嗙兢涓嶅湪鍍忓垰寮濮嬫椂閭f牱骞宠 锛岄渶瑕侀氳繃鍚庡彴绾跨▼灏 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 鏈嶅姟绔殑宸ヤ綔娴佺▼鏈変簡杩涗竴姝ョ殑鐞嗚В锛屼粠鑰屾洿濂界殑鎶婃帶鏁翠綋闆嗙兢鏈嶅姟銆備笅绡囨枃绔犳垜浠潵姝e紡浠嬬粛涓涓**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 @@ +## 閲嶈闈㈣瘯鐭ヨ瘑鐐 + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-75cd70ad3052ba44bf706a3ab39e59d5_720w.webp) + + +Kafka 娑堣垂绔‘淇濅竴涓 Partition 鍦ㄤ竴涓秷璐硅呯粍鍐呭彧鑳借涓涓秷璐硅呮秷璐广傝繖鍙ヨ瘽鏀规庝箞鐞嗚В鍛紵 + +1. 鍦ㄥ悓涓涓秷璐硅呯粍鍐咃紝涓涓 Partition 鍙兘琚竴涓秷璐硅呮秷璐广 +2. 鍦ㄥ悓涓涓秷璐硅呯粍鍐咃紝鎵鏈夋秷璐硅呯粍鍚堣捣鏉ュ繀瀹氬彲浠ユ秷璐逛竴涓 Topic 涓嬬殑鎵鏈 Partition銆 +3. 鍦ㄥ悓涓涓秷璐圭粍鍐咃紝涓涓秷璐硅呭彲浠ユ秷璐瑰涓 Partition 鐨勪俊鎭 +4. 鍦ㄤ笉鍚屾秷璐硅呯粍鍐咃紝鍚屼竴涓垎鍖哄彲浠ヨ澶氫釜娑堣垂鑰呮秷璐广 +5. 姣忎釜娑堣垂鑰呯粍涓瀹氫細瀹屾暣娑堣垂涓涓 Topic 涓嬬殑鎵鏈 Partition銆 + +### **娑堣垂缁勫瓨鍦ㄧ殑鎰忎箟** + +浜嗚В浜嗘秷璐硅呬笌娑堣垂缁勭殑鍏崇郴鍚庯紝鏈夋湅鍙嬩細姣旇緝鐤戞儜娑堣垂鑰呯粍鏈夊暐瀹為檯瀛樺湪鐨勬剰涔夊憿锛熸垨鑰呰娑堣垂缁勭殑浣滅敤鏄粈涔堬紵 + +浣滆呭娑堣垂缁勭殑浣滅敤褰掔粨浜嗗涓嬩袱鐐广 + +1. 鍦ㄥ疄闄呯敓浜т腑锛屽浜庡悓涓涓 Topic锛屽彲鑳芥湁 A銆丅銆丆 绛 N 涓秷璐规柟鎯宠娑堣垂銆傛瘮濡備竴浠界敤鎴风偣鍑绘棩蹇楋紝A 娑堣垂鏂规兂鐢ㄦ潵鍋氫竴涓敤鎴疯繎 N 澶╃偣鍑昏繃鍝簺鍟嗗搧锛汢 娑堣垂鏂规兂鐢ㄦ潵鍋氫竴涓敤鎴疯繎 N 澶╃偣鍑昏繃鍓 TopN 涓浉浼肩殑鍟嗗搧锛汣 娑堣垂鏂规兂鐢ㄦ潵鍋氫竴涓牴鎹敤鎴风偣鍑昏繃鐨勫晢鍝佹帹鑽愮浉鍏冲懆杈圭殑鍟嗗搧闇姹傘傚浜庡搴旂敤鍦烘櫙锛屽氨鍙互浣跨敤娑堣垂缁勬潵闅旂涓嶅悓鐨勪笟鍔′娇鐢ㄥ満鏅紝浠庤岃揪鍒颁竴涓 Topic 鍙互琚涓秷璐圭粍閲嶅娑堣垂鐨勭洰鐨勩 +2. 娑堣垂缁勪笌 Partition 鐨勬秷璐硅繘搴︾粦瀹氥傚綋鏈夋柊鐨勬秷璐硅呭姞鍏ユ垨鑰呮湁娑堣垂鑰呬粠娑堣垂缁勯鍑烘椂锛屼細瑙﹀彂娑堣垂缁勭殑 Repartition 鎿嶄綔锛堝悗闈細璇︾粏浠嬬粛 Repartition锛夛紱鍦 Repartition 鍓嶏紝Partition1 琚秷璐圭粍鐨勬秷璐硅 A 杩涜娑堣垂锛孯epartition 鍚庯紝Partition1 娑堣垂缁勭殑娑堣垂鑰 B 杩涜娑堣垂锛屼负浜嗛伩鍏嶆秷鎭閲嶅娑堣垂锛岄渶瑕佷粠娑堣垂缁勮褰曠殑 Partition 娑堣垂杩涘害璇诲彇褰撳墠娑堣垂鍒扮殑浣嶇疆锛堝嵆 OffSet 浣嶇疆锛夛紝鐒跺悗鍦ㄧ户缁秷璐癸紝浠庤岃揪鍒版秷璐硅呯殑骞虫粦杩佺Щ锛屽悓鏃朵篃鎻愰珮浜嗙郴缁熺殑鍙敤鎬с + +## **Repartition 瑙﹀彂鏃舵満** + +浣跨敤杩 Kafka 娑堣垂鑰呭鎴风鐨勫悓瀛﹁偗瀹氱煡閬擄紝娑堣垂鑰呯粍鍐呭伓灏斾細瑙﹀彂 Repartition 鎿嶄綔锛屾墍璋 Repartition 鍗 Partition 鍦ㄦ煇浜涙儏鍐典笅閲嶆柊琚垎閰嶇粰鍙備笌娑堣垂鐨勬秷璐硅呫傚熀鏈彲浠ュ垎涓哄涓嬪嚑绉嶆儏鍐点 + +1. 娑堣垂缁勫唴鏌愭秷璐硅呭畷鏈猴紝瑙﹀彂 Repartition 鎿嶄綔锛屽涓嬪浘鎵绀恒 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-a9ef6a29cb9ba3456a05ad75cb91cb03_720w.webp) + +
娑堣垂鑰呭畷鏈烘儏鍐
+ +
+ +2\. 娑堣垂缁勫唴鏂板娑堣垂鑰咃紝瑙﹀彂 Repartition 鎿嶄綔锛屽涓嬪浘鎵绀恒備竴鑸繖绉嶆儏鍐垫槸涓轰簡鎻愰珮娑堣垂绔殑娑堣垂鑳藉姏锛屼粠鑰屽姞蹇秷璐硅繘搴︺ + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-8803223d712fdde035b8e7b9170dd3fb_720w.webp) + +
鏂板娑堣垂鑰呮儏鍐
+ +
+ +3.Topic 涓嬬殑 Partition 澧炲锛岃Е鍙 Repartition 鎿嶄綔锛屽涓嬪浘鎵绀恒備竴鑸繖绉嶈皟鏁 Partition 涓暟鐨勬儏鍐典篃鏄负浜嗘彁楂樻秷璐圭娑堣垂閫熷害鐨勶紝鍥犱负褰撴秷璐硅呬釜鏁板ぇ浜庣瓑浜 Partition 涓暟鏃讹紝鍦ㄥ鍔犳秷璐硅呬釜鏁版槸娌℃湁鐢ㄧ殑锛堝師鍥犳槸锛氬湪涓涓秷璐圭粍鍐咃紝娑堣垂鑰:Partition = 1:N锛屽綋 N 灏忎簬 1 鏃讹紝鐩稿綋浜庢秷璐硅呰繃鍓╀簡锛夛紝鎵浠ヤ竴鏂归潰澧炲姞 Partition 涓暟鍚屾椂澧炲姞娑堣垂鑰呬釜鏁板彲浠ユ彁楂樻秷璐圭鐨勬秷璐归熷害銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-8f1a427c6842d9babf139454ce23cfa3_720w.webp) + +
鏂板Partition涓暟鎯呭喌
+ +
+ +## **娑堣垂鑰呬笌 ZK 鐨勫叧绯** + +浼楁墍鍛ㄧ煡锛孼K 涓嶄粎淇濆瓨浜嗘秷璐硅呮秷璐 partition 鐨勮繘搴︼紝鍚屾椂涔熶繚瀛樹簡娑堣垂缁勭殑鎴愬憳鍒楄〃銆乸artition 鐨勬墍鏈夎呫傛秷璐硅呮兂瑕佹秷璐 Partition锛岄渶瑕佷粠 ZK 涓幏鍙栬娑堣垂鑰呭搴旂殑鍒嗗尯淇℃伅鍙婂綋鍓嶅垎鍖哄搴旂殑娑堣垂杩涘害锛屽嵆 OffSert 淇℃伅銆傞偅涔 Partition 搴旇鐢遍偅涓秷璐硅呰繘琛屾秷璐癸紝鍐冲畾鍥犵礌鏈夊摢浜涘憿锛熶粠涔嬪墠鐨勫浘涓笉闅惧緱鍑猴紝涓や釜閲嶈鍥犵礌鍒嗗埆鏄細娑堣垂缁勪腑瀛樻椿鐨勬秷璐硅呭垪琛ㄥ拰 Topic 瀵瑰簲鐨 Partition 鍒楄〃銆傞氳繃杩欎袱涓洜绱犵粨鍚 Partition 鍒嗛厤绠楁硶锛屽嵆鍙緱鍑烘秷璐硅呬笌 Partition 鐨勫搴斿叧绯伙紝鐒跺悗灏嗕俊鎭瓨鍌ㄥ埌 ZK 涓侹afka 鏈夐珮绾 API 鍜屼綆绾 API锛屽鏋滀笉闇瑕佹搷浣 OffSet 鍋忕Щ閲忕殑鎻愪氦锛屽彲閫氳繃楂樼骇 API 鐩存帴浣跨敤锛屼粠鑰岄檷浣庝娇鐢ㄨ呯殑闅惧害銆傚浜庝竴浜涙瘮杈冪壒娈婄殑浣跨敤鍦烘櫙锛屾瘮濡傛兂瑕佹秷璐圭壒瀹 Partition 鐨勪俊鎭紝Kafka 涔熸彁渚涗簡浣庣骇 API 鍙繘琛屾墜鍔ㄦ搷浣溿 + +## **娑堣垂绔伐浣滄祦绋** + +鍦ㄤ粙缁嶆秷璐圭宸ヤ綔娴佺▼鍓嶏紝鍏堟潵鐔熸倝涓涓嬬敤鍒扮殑涓浜涚粍浠躲 + +* `KakfaConsumer`锛氭秷璐圭锛岀敤浜庡惎鍔ㄦ秷璐硅呰繘绋嬫潵娑堣垂娑堟伅銆 +* `ConsumerConfig`锛氭秷璐圭閰嶇疆绠$悊锛岀敤浜庣粰娑堣垂绔厤缃浉鍏冲弬鏁帮紝姣斿鎸囧畾 Kafka 闆嗙兢锛岃缃嚜鍔ㄦ彁浜ゅ拰鑷姩鎻愪氦鏃堕棿闂撮殧绛夌瓑鍙傛暟锛岄兘鐢卞叾鏉ョ鐞嗐 +* `ConsumerConnector`锛氭秷璐硅呰繛鎺ュ櫒锛岄氳繃娑堣垂鑰呰繛鎺ュ櫒鍙互鑾峰緱 Kafka 娑堟伅娴侊紝鐒跺悗閫氳繃娑堟伅娴佸氨鑳借幏寰楁秷鎭粠鑰屼娇寰楀鎴风寮濮嬫秷璐规秷鎭 + +浠ヤ笂涓夎呬箣闂寸殑鍏崇郴鍙互姒傛嫭涓猴細娑堣垂绔娇鐢ㄦ秷璐硅呴厤缃鐞嗗垱寤哄嚭浜嗘秷璐硅呰繛鎺ュ櫒锛岄氳繃娑堣垂鑰呰繛鎺ュ櫒鍒涘缓闃熷垪锛堣繖涓槦鍒楃殑浣滅敤涔熸槸涓轰簡缂撳瓨鏁版嵁锛夛紝鍏朵腑闃熷垪涓殑娑堟伅鐢变笓闂ㄧ殑鎷夊彇绾跨▼浠庢湇鍔$鎷夊彇鐒跺悗鍐欏叆锛屾渶鍚庣敱娑堣垂鑰呭鎴风杞闃熷垪涓殑娑堟伅杩涜娑堣垂銆傚叿浣撴搷浣滄祦绋嬪涓嬪浘鎵绀恒 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-122b4a706de39655d257928005a83ff1_720w.webp) + +
娑堣垂绔伐浣滄祦绋
+ +
+ +鎴戜滑鍦ㄤ粠娑堣垂鑰呬笌 ZK 鐨勮搴︽潵鐪嬬湅鍏跺伐浣滄祦绋嬫槸浠涔堟牱鐨勶紵 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-4ed25ebb9236986b2084ce8a042f65b9_720w.webp) + +
娑堣垂绔笌ZK涔嬮棿鐨勫伐浣滄祦绋
+ +
+ +浠庝笂鍥惧彲浠ョ湅鍑猴紝棣栧厛鎷夊彇绾跨▼姣忔媺鍙栦竴娆℃秷鎭紝鍚屾鏇存柊涓娆℃媺鍙栫姸鎬侊紝鍏朵綔鐢ㄦ槸涓轰簡涓嬩竴娆℃媺鍙栨秷鎭椂鑳藉鎷夊彇鍒版渶鏂颁骇鐢熺殑娑堟伅锛涙媺鍙栫嚎绋嬪皢鎷夊彇鍒扮殑娑堟伅鍐欏叆鍒伴槦鍒椾腑绛夊緟娑堣垂娑堣垂绾跨▼鍘荤湡姝h鍙栧鐞嗐傛秷璐圭嚎绋嬩互杞鐨勬柟寮忔寔缁鍙栭槦鍒椾腑鐨勬秷鎭紝鍙鍙戠幇闃熷垪涓湁娑堟伅灏卞紑濮嬫秷璐癸紝娑堣垂瀹屾秷鎭悗鏇存柊娑堣垂杩涘害锛屾澶勯渶瑕佹敞鎰忕殑鏄紝娑堣垂绾跨▼涓嶆槸姣忔閮藉拰 ZK 鍚屾娑堣垂杩涘害锛岃屾槸灏嗘秷璐硅繘搴︽殏鏃跺啓鍏ユ湰鍦般傝繖鏍峰仛鐨勭洰鐨勬槸涓轰簡鍑忓皯娑堣垂鑰呬笌 ZK 鐨勯绻佸悓姝ユ秷鎭紝浠庤岄檷浣 ZK 鐨勫帇鍔涖 + +## **娑堣垂鑰呯殑涓夌娑堣垂鎯呭喌** + +娑堣垂鑰呬粠鏈嶅姟绔殑 Partition 涓婃媺鍙栧埌娑堟伅锛屾秷璐规秷鎭湁涓夌鎯呭喌锛屽垎鍒涓嬶細 + +1. 鑷冲皯涓娆°傚嵆涓鏉℃秷鎭嚦灏戣娑堣垂涓娆★紝娑堟伅涓嶅彲鑳戒涪澶憋紝浣嗘槸鍙兘浼氳閲嶅娑堣垂銆 +2. 鑷冲涓娆°傚嵆涓鏉℃秷鎭渶澶氬彲浠ヨ娑堣垂涓娆★紝娑堟伅涓嶅彲鑳借閲嶅娑堣垂锛屼絾鏄秷鎭湁鍙兘涓㈠け銆 +3. 姝eソ涓娆°傚嵆涓鏉℃秷鎭濂借娑堣垂涓娆★紝娑堟伅涓嶅彲鑳戒涪澶变篃涓嶅彲鑳借閲嶅娑堣垂銆 + +### **1.鑷冲皯涓娆** + +娑堣垂鑰呰鍙栨秷鎭紝鍏堝鐞嗘秷鎭紝鍦ㄤ繚瀛樻秷璐硅繘搴︺傛秷璐硅呮媺鍙栧埌娑堟伅锛屽厛娑堣垂娑堟伅锛岀劧鍚庡湪淇濆瓨鍋忕Щ閲忥紝褰撴秷璐硅呮秷璐规秷鎭悗杩樻病鏉ュ緱鍙婁繚瀛樺亸绉婚噺锛屽垯浼氶犳垚娑堟伅琚噸澶嶆秷璐广傚涓嬪浘鎵绀猴細 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-1a047ed616ba44daebdb4b6ce786a61a_720w.webp) + +
鍏堟秷璐瑰悗淇濆瓨娑堣垂杩涘害
+ +
+ +### **2.鑷冲涓娆** + +娑堣垂鑰呰鍙栨秷鎭紝鍏堜繚瀛樻秷璐硅繘搴︼紝鍦ㄥ鐞嗘秷鎭傛秷璐硅呮媺鍙栧埌娑堟伅锛屽厛淇濆瓨浜嗗亸绉婚噺锛屽綋淇濆瓨浜嗗亸绉婚噺鍚庤繕娌℃秷璐瑰畬娑堟伅锛屾秷璐硅呮寕浜嗭紝鍒欎細閫犳垚鏈秷璐圭殑娑堟伅涓㈠け銆傚涓嬪浘鎵绀猴細 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-1f9f91ae54396c5e5d93ae89251eb1ed_720w.webp) + +
鍏堜繚瀛樻秷璐硅繘搴﹀悗娑堣垂娑堟伅
+ +
+ +### **3.姝eソ涓娆** + +姝eソ娑堣垂涓娆$殑鍔炴硶鍙互閫氳繃灏嗘秷璐硅呯殑娑堣垂杩涘害鍜屾秷鎭鐞嗙粨鏋滀繚瀛樺湪涓璧枫傚彧瑕佽兘淇濊瘉涓や釜鎿嶄綔鏄竴涓師瀛愭搷浣滐紝灏辫兘杈惧埌姝eソ娑堣垂涓娆$殑鐩殑銆傞氬父鍙互灏嗕袱涓搷浣滀繚瀛樺湪涓璧凤紝姣斿 HDFS 涓傛濂芥秷璐逛竴娆℃祦绋嬪涓嬪浘鎵绀恒 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-a0bbb114e2ad551227f81c1f26d4bd5d_720w.webp) + +
姝eソ娑堣垂涓娆
+ +
+ +## Partition銆丷eplica銆丩og 鍜 LogSegment 鐨勫叧绯 + +鍋囪鏈変竴涓 Kafka 闆嗙兢锛孊roker 涓暟涓 3锛孴opic 涓暟涓 1锛孭artition 涓暟涓 3锛孯eplica 涓暟涓 2銆侾artition 鐨勭墿鐞嗗垎甯冨涓嬪浘鎵绀恒 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-f8f21631b138321f25c8821c677c5579_720w.webp) + +
Partition鍒嗗竷鍥
+ +
+ +浠庝笂鍥惧彲浠ョ湅鍑猴紝璇 Topic 鐢变笁涓 Partition 鏋勬垚锛屽苟涓旀瘡涓 Partition 鐢变富浠庝袱涓壇鏈瀯鎴愩傛瘡涓 Partition 鐨勪富浠庡壇鏈垎甯冨湪涓嶅悓鐨 Broker 涓婏紝閫氳繃杩欑偣涔熷彲浠ョ湅鍑猴紝褰撴煇涓 Broker 瀹曟満鏃讹紝鍙互灏嗗垎甯冨湪鍏朵粬 Broker 涓婄殑浠庡壇鏈缃负涓诲壇鏈紝鍥犱负鍙湁涓诲壇鏈澶栨彁渚涜鍐欒姹傦紝褰撶劧鍦ㄦ渶鏂扮殑 2.x 鐗堟湰涓粠鍓湰涔熷彲浠ュ澶栬璇锋眰浜嗐傚皢涓讳粠鍓湰鍒嗗竷鍦ㄤ笉鍚岀殑 Broker 涓婁粠鑰屾彁楂樼郴缁熺殑鍙敤鎬с + +Partition 鐨勫疄闄呯墿鐞嗗瓨鍌ㄦ槸浠 Log 鏂囦欢鐨勫舰寮忓睍绀虹殑锛岃屾瘡涓 Log 鏂囦欢鍙堜互澶氫釜 LogSegment 缁勬垚銆侹afka 涓轰粈涔堣杩欎箞璁捐鍛紵鍏跺疄鍘熷洜姣旇緝绠鍗曪紝闅忕潃娑堟伅鐨勪笉鏂啓鍏ワ紝Log 鏂囦欢鑲畾鏄秺鏉ヨ秺澶э紝Kafka 涓轰簡鏂逛究绠$悊锛屽皢涓涓ぇ鏂囦欢鍒囧壊鎴愪竴涓竴涓殑 LogSegment 鏉ヨ繘琛岀鐞嗭紱姣忎釜 LogSegment 鐢辨暟鎹枃浠跺拰绱㈠紩鏂囦欢鏋勬垚锛屾暟鎹枃浠舵槸鐢ㄦ潵瀛樺偍瀹為檯鐨勬秷鎭唴瀹癸紝鑰岀储寮曟枃浠舵槸涓轰簡鍔犲揩娑堟伅鍐呭鐨勮鍙栥 + +鍙兘鍙堟湁鏈嬪弸浼氶棶锛孠afka 鏈韩娑堣垂鏄互 Partition 缁村害椤哄簭娑堣垂娑堟伅鐨勶紝纾佺洏鍦ㄩ『搴忚鐨勬椂鍊欐晥鐜囧緢楂樺畬鍏ㄦ病鏈夊繀瑕佷娇鐢ㄧ储寮曞晩銆傚叾瀹 Kafka 涓轰簡婊¤冻涓浜涚壒娈婁笟鍔¢渶姹傦紝姣斿瑕侀殢鏈烘秷璐 Partition 涓殑娑堟伅锛屾鏃跺彲浠ュ厛閫氳繃绱㈠紩鏂囦欢蹇熷畾浣嶅埌娑堟伅鐨勫疄闄呭瓨鍌ㄤ綅缃紝鐒跺悗杩涜澶勭悊銆 + +鎬荤粨涓涓 Partition銆丷eplica銆丩og 鍜 LogSegment 涔嬮棿鐨勫叧绯汇傛秷鎭槸浠 Partition 缁村害杩涜绠$悊鐨勶紝涓轰簡鎻愰珮绯荤粺鐨勫彲鐢ㄦэ紝姣忎釜 Partition 閮藉彲浠ヨ缃浉搴旂殑 Replica 鍓湰鏁帮紝涓鑸湪鍒涘缓 Topic 鐨勬椂鍊欏悓鏃舵寚瀹 Replica 鐨勪釜鏁帮紱Partition 鍜 Replica 鐨勫疄闄呯墿鐞嗗瓨鍌ㄥ舰寮忔槸閫氳繃 Log 鏂囦欢灞曠幇鐨勶紝涓轰簡闃叉娑堟伅涓嶆柇鍐欏叆锛屽鑷 Log 鏂囦欢澶у皬鎸佺画澧為暱锛屾墍浠ュ皢 Log 鍒囧壊鎴愪竴涓竴涓殑 LogSegment 鏂囦欢銆 + +**娉ㄦ剰锛** 鍦ㄥ悓涓鏃跺埢锛屾瘡涓富 Partition 涓湁涓斿彧鏈変竴涓 LogSegment 琚爣璇嗕负鍙啓鍏ョ姸鎬侊紝褰撲竴涓 LogSegment 鏂囦欢澶у皬瓒呰繃涓瀹氬ぇ灏忓悗锛堟瘮濡傚綋鏂囦欢澶у皬瓒呰繃 1G锛岃繖涓氨绫讳技浜 HDFS 瀛樺偍鐨勬暟鎹枃浠讹紝HDFS 涓暟鎹枃浠惰揪鍒 128M 鐨勬椂鍊欏氨浼氳鍒嗗嚭涓涓柊鐨勬枃浠舵潵瀛樺偍鏁版嵁锛夛紝灏变細鏂板垱寤轰竴涓 LogSegment 鏉ョ户缁帴鏀舵柊鍐欏叆鐨勬秷鎭 + +## 鍐欏叆娑堟伅娴佺▼鍒嗘瀽 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-eb66e4ecf7cf07fcb6b12029bfdd9b71_720w.webp) + +
娑堟伅鍐欏叆鍙婅惤鐩樻祦绋
+ +
+ +娴佺▼瑙f瀽 + +鍦ㄧ 3 绡囨枃绔犺杩囷紝鐢熶骇鑰呭鎴风瀵逛簬姣忎釜 Partition 涓娆′細鍙戦佷竴鎵规秷鎭埌鏈嶅姟绔紝鏈嶅姟绔敹鍒颁竴鎵规秷鎭悗鍐欏叆鐩稿簲鐨 Partition 涓娿備笂鍥炬祦绋嬩富瑕佸垎涓哄涓嬪嚑姝ワ細 + +1. **瀹㈡埛绔秷鎭敹闆嗗櫒鏀堕泦灞炰簬鍚屼竴涓垎鍖虹殑娑堟伅锛屽苟瀵规瘡鏉℃秷鎭缃竴涓亸绉婚噺锛屼笖姣忎竴鎵规秷鎭绘槸浠 0 寮濮嬪崟璋冮掑銆傛瘮濡傜涓娆″彂閫 3 鏉℃秷鎭紝鍒欏涓夋潯娑堟伅渚濇缂栧彿 [0,1,2]锛岀浜屾鍙戦 4 鏉℃秷鎭紝鍒欐秷鎭緷娆$紪鍙蜂负 [0,1,2,3]銆傛敞鎰忔澶勮缃殑娑堟伅鍋忕Щ閲忔槸鐩稿鍋忕Щ閲忋** +2. **瀹㈡埛绔皢娑堟伅鍙戦佺粰鏈嶅姟绔紝鏈嶅姟绔嬁鍒颁笅涓鏉℃秷鎭殑缁濆鍋忕Щ閲忥紝灏嗕紶鍒版湇鍔$鐨勮繖鎵规秷鎭殑鐩稿鍋忕Щ閲忎慨鏀规垚缁濆鍋忕Щ閲忋** +3. **灏嗕慨鏀瑰悗鐨勬秷鎭互杩藉姞鐨勬柟寮忚拷鍔犲埌褰撳墠娲昏穬鐨 LogSegment 鍚庨潰锛岀劧鍚庢洿鏂扮粷瀵瑰亸绉婚噺銆** +4. **灏嗘秷鎭泦鍐欏叆鍒版枃浠堕氶亾銆** +5. **鏂囦欢閫氶亾灏嗘秷鎭泦 flush 鍒扮鐩橈紝瀹屾垚娑堟伅鐨勫啓鍏ユ搷浣溿** + +浜嗚В浠ヤ笂杩囩▼鍚庯紝鎴戜滑鍦ㄦ潵鐪嬬湅娑堟伅鐨勫叿浣撴瀯鎴愭儏鍐点 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-6e993c95decd5d274b032cd423936504_720w.webp) + +
娑堟伅鏋勬垚缁嗚妭鍥
+ +
+ +涓鏉℃秷鎭敱濡備笅涓夐儴鍒嗘瀯鎴愶細 + +* **OffSet锛氬亸绉婚噺锛屾秷鎭湪瀹㈡埛绔彂閫佸墠灏嗙浉瀵瑰亸绉婚噺瀛樺偍鍒拌浣嶇疆锛屽綋娑堟伅瀛樺偍鍒 LogSegment 鍓嶏紝鍏堝皢鍏朵慨鏀逛负缁濆鍋忕Щ閲忓湪鍐欏叆纾佺洏銆** +* **Size锛氭湰鏉 Message 鐨勫唴瀹瑰ぇ灏** +* **Message锛氭秷鎭殑鍏蜂綋鍐呭锛屽叾鍏蜂綋鍙堢敱 7 閮ㄥ垎缁勬垚锛宑rc 鐢ㄤ簬鏍¢獙娑堟伅锛孉ttribute 浠h〃浜嗗睘鎬э紝key-length 鍜 value-length 鍒嗗埆浠h〃 key 鍜 value 鐨勯暱搴︼紝key 鍜 value 鍒嗗埆浠h〃浜嗗叾瀵瑰簲鐨勫唴瀹广** + +### 娑堟伅鍋忕Щ閲忕殑璁$畻杩囩▼ + +閫氳繃浠ヤ笂娴佺▼鍙互鐪嬪嚭锛屾瘡鏉℃秷鎭湪琚疄闄呭瓨鍌ㄥ埌纾佺洏鏃堕兘浼氳鍒嗛厤涓涓粷瀵瑰亸绉婚噺鍚庢墠鑳借鍐欏叆纾佺洏銆傚湪鍚屼竴涓垎鍖哄唴锛屾秷鎭殑缁濆鍋忕Щ閲忛兘鏄粠 0 寮濮嬶紝涓斿崟璋冮掑锛涘湪涓嶅悓鍒嗗尯鍐咃紝娑堟伅鐨勭粷瀵瑰亸绉婚噺鏄病鏈変换浣曞叧绯荤殑銆傛帴涓嬫潵璁ㄨ涓嬫秷鎭殑缁濆鍋忕Щ閲忕殑璁$畻瑙勫垯銆 + +纭畾娑堟伅鍋忕Щ閲忔湁涓ょ鏂瑰紡锛屼竴绉嶆槸椤哄簭璇诲彇姣忎竴鏉℃秷鎭潵纭畾锛屾绉嶆柟寮忎唬浠锋瘮杈冨ぇ锛屽疄闄呬笂鎴戜滑骞朵笉鎯崇煡閬撴秷鎭殑鍐呭锛岃屽彧鏄兂鐭ラ亾娑堟伅鐨勫亸绉婚噺锛涚浜岀鏄鍙栨瘡鏉℃秷鎭殑 Size 灞炴э紝鐒跺悗璁$畻鍑轰笅涓鏉℃秷鎭殑璧峰鍋忕Щ閲忋傛瘮濡傜涓鏉℃秷鎭唴瀹逛负 鈥渁bc鈥濓紝鍐欏叆纾佺洏鍚庣殑鍋忕Щ閲忎负锛8锛圤ffSet锛+ 4锛圡essage 澶у皬锛+ 3锛圡essage 鍐呭鐨勯暱搴︼級= 15銆傜浜屾潯鍐欏叆鐨勬秷鎭唴瀹逛负鈥渄efg鈥濓紝鍏惰捣濮嬪亸绉婚噺涓 15锛屼笅涓鏉℃秷鎭殑璧峰鍋忕Щ閲忓簲璇ユ槸锛15+8+4+4=31锛屼互姝ょ被鎺ㄣ + +## 娑堣垂娑堟伅鍙婂壇鏈悓姝ユ祦绋嬪垎鏋 + +鍜屽啓鍏ユ秷鎭祦绋嬩笉鍚岋紝璇诲彇娑堟伅娴佺▼鍒嗕负涓ょ鎯呭喌锛屽垎鍒槸娑堣垂绔秷璐规秷鎭拰浠庡壇鏈紙澶囦唤鍓湰锛夊悓姝ヤ富鍓湰鐨勬秷鎭傚湪寮濮嬪垎鏋愯鍙栨祦绋嬩箣鍓嶏紝闇瑕佸厛鏄庣櫧鍑犱釜鐢ㄥ埌鐨勫彉閲忥紝涓嶇劧娴佺▼鍒嗘瀽鍙兘浼氱湅鐨勬瘮杈冪硦娑傘 + +* **BaseOffSet**锛氬熀鍑嗗亸绉婚噺锛屾瘡涓 Partition 鐢 N 涓 LogSegment 缁勬垚锛屾瘡涓 LogSegment 閮芥湁鍩哄噯鍋忕Щ閲忥紝澶ф鐢卞涓嬫瀯鎴愶紝鏁扮粍涓瘡涓暟浠h〃涓涓 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**锛歀ogSegment 鐨勬渶澶т綅缃紝纭畾浜嗚捣濮嬪亸绉婚噺鍦ㄦ煇涓 LogSegment 涓婂紑濮嬶紝璇诲彇 MaxLength 鍚庯紝涓嶈兘瓒呰繃 MaxPosition銆侻axPosition 鏄竴涓疄闄呯殑鐗╃悊浣嶇疆锛岃岄潪鍋忕Щ閲忋 + +鍋囪娑堣垂绔粠 000000621 浣嶇疆寮濮嬫秷璐规秷鎭紝鍏充簬鍑犱釜鍙橀噺鐨勫叧绯诲涓嬪浘鎵绀恒 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-cd9c62a71cddccd7bc8a5d810d5af216_720w.webp) + +
浣嶇疆鍏崇郴鍥
+ +
+ +娑堣垂绔拰浠庡壇鏈媺鍙栨祦绋嬪涓嬶細 + +1. **瀹㈡埛绔‘瀹氭媺鍙栫殑浣嶇疆锛屽嵆 StartOffSet 鐨勫硷紝鎵惧埌涓诲壇鏈搴旂殑 LogSegment銆** +2. **LogSegment 鐢辩储寮曟枃浠跺拰鏁版嵁鏂囦欢鏋勬垚锛岀敱浜庣储寮曟枃浠舵槸浠庡皬鍒板ぇ鎺掑垪鐨勶紝棣栧厛浠庣储寮曟枃浠剁‘瀹氫竴涓皬浜庣瓑浜 StartOffSet 鏈杩戠殑绱㈠紩浣嶇疆銆** +3. **鏍规嵁绱㈠紩浣嶇疆鎵惧埌瀵瑰簲鐨勬暟鎹枃浠朵綅缃紝鐢变簬鏁版嵁鏂囦欢涔熸槸浠庡皬鍒板ぇ鎺掑垪鐨勶紝浠庢壘鍒扮殑鏁版嵁鏂囦欢浣嶇疆椤哄簭鍚戝悗閬嶅巻锛岀洿鍒版壘鍒板拰 StartOffSet 鐩哥瓑鐨勪綅缃紝鍗充负娑堣垂鎴栨媺鍙栨秷鎭殑浣嶇疆銆** +4. **浠 StartOffSet 寮濮嬪悜鍚庢媺鍙 MaxLength 澶у皬鐨勬暟鎹紝杩斿洖缁欐秷璐圭鎴栬呬粠鍓湰杩涜娑堣垂鎴栧浠芥搷浣溿** + +鍋囪鎷夊彇娑堟伅璧峰浣嶇疆涓 00000313锛屾秷鎭媺鍙栨祦绋嬪浘濡備笅锛 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-9417ca60a0c5e9474ec49a77fff18b1b_720w.webp) + +
娑堟伅鎷夊彇娴佺▼鍥
+ +
+ +## kafka 濡備綍淇濊瘉绯荤粺鐨勯珮鍙敤銆佹暟鎹殑鍙潬鎬у拰鏁版嵁鐨勪竴鑷存х殑锛 + +### kafka 鐨勯珮鍙敤鎬э細 + +1. **Kafka 鏈韩鏄竴涓垎甯冨紡绯荤粺锛屽悓鏃堕噰鐢ㄤ簡 Zookeeper 瀛樺偍鍏冩暟鎹俊鎭紝鎻愰珮浜嗙郴缁熺殑楂樺彲鐢ㄦс** +2. **Kafka 浣跨敤澶氬壇鏈満鍒讹紝褰撶姸鎬佷负 Leader 鐨 Partition 瀵瑰簲鐨 Broker 瀹曟満鎴栬呯綉缁滃紓甯告椂锛孠afka 浼氶氳繃閫変妇鏈哄埗浠庡搴旂殑 Replica 鍒楄〃涓噸鏂伴変妇鍑轰竴涓 Replica 褰撳仛 Leader锛屼粠鑰岀户缁澶栨彁渚涜鍐欐湇鍔★紙褰撶劧锛岄渶瑕佹敞鎰忕殑涓鐐规槸锛屽湪鏂扮増鏈殑 Kafka 涓紝Replica 涔熷彲浠ュ澶栨彁渚涜璇锋眰浜嗭級锛屽埄鐢ㄥ鍓湰鏈哄埗鍦ㄤ竴瀹氱▼搴︿笂鎻愰珮浜嗙郴缁熺殑瀹归敊鎬э紝浠庤屾彁鍗囦簡绯荤粺鐨勯珮鍙敤銆** + +### Kafka 鐨勫彲闈犳э細 + +1. **浠 Producer 绔潵鐪嬶紝鍙潬鎬ф槸鎸囩敓浜х殑娑堟伅鑳藉姝e父鐨勮瀛樺偍鍒 Partition 涓婁笖娑堟伅涓嶄細涓㈠け銆侹afka 閫氳繃 [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 涓夌鎯呭喌銆** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-7946f258c85fb8ca3d4aa423269c483a_720w.webp) + +
request.required.acks=1
+ +
+ +璁剧疆涓 1 鏃朵唬琛ㄥ綋 Leader 鐘舵佺殑 Partition 鎺ユ敹鍒版秷鎭苟鎸佷箙鍖栨椂灏辫涓烘秷鎭彂閫佹垚鍔燂紝濡傛灉 ISR 鍒楄〃鐨 Replica 杩樻病鏉ュ緱鍙婂悓姝ユ秷鎭紝Leader 鐘舵佺殑 Partition 瀵瑰簲鐨 Broker 瀹曟満锛屽垯娑堟伅鏈夊彲鑳戒涪澶便 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-382c9f37f644feb37dd975c67bc1038f_720w.webp) + +
request.required.acks=0
+ +
+ +璁剧疆涓 0 鏃朵唬琛 Producer 鍙戦佹秷鎭悗灏辫涓烘垚鍔燂紝娑堟伅鏈夊彲鑳戒涪澶便 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-592996f264baadc64967d6f4b28f4d23_720w.webp) + +
request.required.acks=-1
+ +
+ +璁剧疆涓-1 鏃讹紝浠h〃 ISR 鍒楄〃涓殑鎵鏈 Replica 灏嗘秷鎭悓姝ュ畬鎴愬悗鎵嶈涓烘秷鎭彂閫佹垚鍔燂紱浣嗘槸濡傛灉鍙瓨鍦ㄤ富 Partition 鐨勬椂鍊欙紝Broker 寮傚父鏃跺悓鏍蜂細瀵艰嚧娑堟伅涓㈠け銆傛墍浠ユ鏃跺氨闇瑕乕min.insync.replicas](https://link.zhihu.com/?target=https%3A//xie.infoq.cn/edit/49a133ad2b2f2671aa60706b0%23)鍙傛暟鐨勯厤鍚堬紝璇ュ弬鏁伴渶瑕佽瀹氬煎ぇ浜庣瓑浜 2锛屽綋 Partition 鐨勪釜鏁板皬浜庤瀹氱殑鍊兼椂锛孭roducer 鍙戦佹秷鎭細鐩存帴鎶ラ敊銆 + +涓婇潰杩欎釜杩囩▼鐪嬩技宸茬粡寰堝畬缇庝簡锛屼絾鏄亣璁惧鏋滄秷鎭湪鍚屾鍒伴儴鍒嗕粠 Partition 涓婃椂锛屼富 Partition 瀹曟満锛屾鏃舵秷鎭細閲嶄紶锛岃櫧鐒舵秷鎭笉浼氫涪澶憋紝浣嗘槸浼氶犳垚鍚屼竴鏉℃秷鎭細瀛樺偍澶氭銆傚湪鏂扮増鏈腑 Kafka 鎻愬嚭浜嗗箓绛夋х殑姒傚康锛岄氳繃缁欐瘡鏉℃秷鎭缃竴涓敮涓 ID锛屽苟涓旇 ID 鍙互鍞竴鏄犲皠鍒 Partition 鐨勪竴涓浐瀹氫綅缃紝浠庤岄伩鍏嶆秷鎭噸澶嶅瓨鍌ㄧ殑闂锛堜綔鑰呭埌鐩墠杩樻病鏈変娇鐢ㄨ繃璇ョ壒鎬э紝鎰熷叴瓒g殑鏈嬪弸鍙互鑷鍦ㄦ繁鍏ョ爺绌朵竴涓嬶級銆 + +### Kafka 鐨勪竴鑷存э細 + +1. **浠 Consumer 绔潵鐪嬶紝鍚屼竴鏉℃秷鎭湪澶氫釜 Partition 涓婅鍙栧埌鐨勬秷鎭槸涓鐩寸殑锛孠afka 閫氳繃寮曞叆 HW锛圚igh Water锛夋潵瀹炵幇杩欎竴鐗规с** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-9975539d98bf1a4e1a3038f2eceb2bb9_720w.webp) + +
娑堟伅鍚屾鍥
+ +
+ +浠庝笂鍥惧彲浠ョ湅鍑猴紝鍋囪 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锛圓pache 瀹樻柟缁欏嚭鐨勬暟鎹級 鐨勭鐩樻暟鎹啓鍏ラ噺锛屽彟澶 Kafka 閫氳繃鍘嬬缉鏁版嵁锛岄檷浣 I/O 鐨勮礋鎷呫 + +1. **椤哄簭鍐欏叆** + +澶у閮界煡閬擄紝瀵逛簬纾佺洏鑰屽凡锛屽鏋滄槸闅忔満鍐欏叆鏁版嵁鐨勮瘽锛屾瘡娆℃暟鎹湪鍐欏叆鏃惰鍏堣繘琛屽鍧鎿嶄綔锛岃鎿嶄綔鏄氳繃绉诲姩纾佸ご瀹屾垚鐨勶紝鏋佸叾鑰楄垂鏃堕棿锛岃岄『搴忚鍐欏氨鑳藉閬垮厤璇ユ搷浣溿 + +1. **鈥滈浂鎷疯礉鈥濇妧鏈** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-6930901956f341f1ab4a6e5650a0680b_720w.webp) + +
鏅氭暟鎹嫹璐濇祦绋嬪浘
+ +
+ +鏅氱殑鏁版嵁鎷疯礉娴佺▼濡備笂鍥炬墍绀猴紝鏁版嵁鐢辩鐩 copy 鍒板唴鏍告侊紝鐒跺悗鍦ㄦ嫹璐濆埌鐢ㄦ埛鎬侊紝鐒跺悗鍐嶇敱鐢ㄦ埛鎬佹嫹璐濆埌 socket锛岀劧鍚庣敱 socket 鍗忚寮曟搸锛屾渶鍚庣敱鍗忚寮曟搸灏嗘暟鎹彂閫佸埌缃戠粶涓 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-9e44873a63d8addca917e658667f0b61_720w.webp) + +
&quot;闆舵嫹璐&quot;娴佺▼鍥
+ +
+ +閲囩敤浜嗏滈浂鎷疯礉鈥濇妧鏈悗鍙互鐪嬪嚭锛屾暟鎹笉鍦ㄧ粡杩囩敤鎴锋佷紶杈擄紝鑰屾槸鐩存帴鍦ㄥ唴鏍告佸畬鎴愭搷浣滐紝鍑忓皯浜嗕袱娆 copy 鎿嶄綔銆備粠鑰屽ぇ澶ф彁楂樹簡鏁版嵁浼犺緭閫熷害銆 + +1. **鍘嬬缉** + +Kafka 瀹樻柟鎻愪緵浜嗗绉嶅帇缂╁崗璁紝鍖呮嫭 gzip銆乻nappy銆乴z4 绛夌瓑锛屼粠鑰岄檷浣庝簡鏁版嵁浼犺緭鐨勬垚鏈 + +## Kafka 涓殑娑堟伅鏄惁浼氫涪澶卞拰閲嶅娑堣垂锛 + +1. **Kafka 鏄惁浼氫涪娑堟伅锛岀瓟妗堢浉淇′粩缁嗙湅杩囧墠闈袱涓棶棰樼殑鍚屽閮芥瘮杈冩竻妤氫簡锛岃繖閲屽氨涓嶅湪璧樿堪浜嗐** +2. **鍦ㄤ綆鐗堟湰涓紝姣斿浣滆呭叕鍙稿湪浣跨敤鐨 Kafka0.8 鐗堟湰涓紝杩樻病鏈夊箓绛夋х殑鐗规х殑鏃跺欙紝娑堟伅鏈夊彲鑳戒細閲嶅琚瓨鍌ㄥ埌 Kafka 涓婏紙鍘熷洜瑙佷笂涓涓棶棰樼殑锛夛紝鍦ㄨ繖绉嶆儏鍐典笅娑堟伅鑲畾鏄細琚噸澶嶆秷璐圭殑銆** + +**杩欓噷缁欏ぇ瀹朵竴涓В鍐抽噸澶嶆秷璐圭殑鎬濊矾锛屼綔鑰呭叕鍙镐娇鐢ㄤ簡 Redis 璁板綍浜嗚娑堣垂鐨 key锛屽苟璁剧疆浜嗚繃鏈熸椂闂达紝鍦 key 杩樻病鏈夎繃鏈熷唴锛屽浜庡悓涓涓 key 鐨勬秷鎭叏閮ㄥ綋鍋氶噸澶嶆秷鎭洿鎺ユ姏寮冩帀銆** 鍦ㄧ綉涓婄湅鍒拌繃鍙﹀涓绉嶈В鍐虫柟妗堬紝浣跨敤 HDFS 瀛樺偍琚秷璐硅繃鐨勬秷鎭紝鏄惁鍏锋湁鍙鎬у瓨鐤戯紙闇瑕佽鑰呮湅鍙嬭嚜琛屾帰绱級锛岃鑰呮湅鍙嬩滑鍙互鏍规嵁鑷繁鐨勫疄闄呮儏鍐甸夋嫨鐩稿簲鐨勭瓥鐣ワ紝濡傛灉鏈嬪弸浠繕鏈夊叾浠栨瘮杈冨ソ鐨勬柟妗堬紝娆㈣繋鐣欒█浜ゆ祦銆 + +## 涓轰粈涔堣浣跨敤 kafka锛屼负浠涔堣浣跨敤娑堟伅闃熷垪锛 + +### 鍏堟潵璇磋涓轰粈涔堣浣跨敤娑堟伅闃熷垪锛 + +杩欓亾棰樻瘮杈冧富瑙備竴浜涳紙鑷涓烘病鏈夌綉涓婂叾浠栨枃绔犲啓寰楄瘽锛岃交鍠凤級锛屼絾鏄兘鐩镐俊澶у浣跨敤娑堟伅闃熷垪鏃犻潪灏辨槸涓轰簡 **瑙h**銆**寮傛**銆**娑堝嘲**銆 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-f7c1bb87ab46ddd03255c58109ce360f_720w.webp) + +
绯荤粺璋冪敤鍥
+ +
+ +闅忕潃涓氬姟鐨勫彂灞曪紝鐩镐俊鏈変笉灏戞湅鍙嬪叕鍙搁亣鍒拌繃濡備笂鍥炬墍绀虹殑鎯呭喌锛岀郴缁 A 澶勭悊鐨勭粨鏋勮 B銆丆銆丏 绯荤粺鎵渚濊禆锛屽綋鏂板绯荤粺 E 鏃讹紝涔熼渶瑕佺郴缁 A 閰嶅悎杩涜鑱旇皟鍜屼笂绾跨瓑鎿嶄綔锛涜繕鏈夊綋绯荤粺 A 鍙戠敓鍙樻洿鏃跺悓鏍烽渶瑕佸憡鐭 B銆丆銆丏銆丒 绯荤粺闇瑕佸悓姝ュ崌绾ф敼閫犮 + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-0f0c8f9531a38f6d79b2cbb2973bfbfc_720w.webp) + +
寮曞叆娑堟伅闃熷垪鍥
+ +
+ +寮曞叆娑堟伅闃熷垪鍚庢湁涓や釜濂藉锛 + +1. **鍚勪釜绯荤粺杩涜浜嗚В鑰︼紝浠庝笂鍥句篃鍙互鐪嬪嚭锛屽綋绯荤粺 A 绐佺劧鍙戠敓鐑偣浜嬩欢鏃讹紝鍚屼竴鏃堕棿浜х敓澶ч噺缁撴灉锛孧Q 鍏呭綋浜嗘秷鎭殏瀛樼殑鏁堟灉锛岄槻姝 B銆丆銆丏銆丒 绯荤粺涔熻窡鐫宕╂簝銆** +2. **褰撴柊绯荤粺 E 闇瑕佹帴鍏ョ郴缁 A 鐨勬暟鎹紝鍙渶瑕佸拰 MQ 瀵规帴灏卞彲浠ヤ簡锛屼粠鑰岄伩鍏嶄簡涓庣郴缁 A 鐨勮皟璇曚笂绾跨瓑鎿嶄綔銆** + +寮曞叆娑堟伅闃熷垪鐨勫潖澶勶細 + +涓囦簨鐨嗗叿澶囦袱闈㈡э紝鐪嬩技寮曞叆娑堟伅闃熷垪杩欎欢浜嬫儏寰堢編濂斤紝浣嗘槸鍚屾椂涔熷鍔犱簡绯荤粺鐨勫鏉傚害銆佺郴缁熺殑缁存姢鎴愭湰鎻愰珮锛堝鏋 MQ 鎸備簡鎬庝箞鍔烇級銆佸紩鍏ヤ簡涓鑷存х瓑绛夐棶棰橀渶瑕佸幓瑙e喅銆 + +## 涓轰粈涔堣浣跨敤 Kafka? + +浣滆呰涓洪噰鐢 Kafka 鐨勫師鍥犳湁濡備笅鍑犵偣锛 + +1. **Kafka 鐩墠鍦ㄤ笟鐣岃骞挎硾浣跨敤锛岀ぞ鍖烘椿璺冨害楂橈紝鐗堟湰鏇存柊杩唬閫熷害涔熷揩銆** +2. **Kafka 鐨勭敓浜ц呭拰娑堣垂鑰呴兘鐢 Java 璇█杩涜浜嗛噸鍐欙紝鍦ㄤ竴瀹氱▼搴﹂檷浣庝簡绯荤粺鐨勭淮鎶ゆ垚鏈紙浣滆呯殑涓昏鎰忚锛屽洜涓哄綋涓 Java 鐨勪娇鐢ㄧ兢浣撶浉褰撳簽澶э級銆** +3. **Kafka 绯荤粺鐨勫悶鍚愰噺楂橈紝杈惧埌浜嗘瘡绉 10w 绾у埆鐨勫鐞嗛熷害銆** +4. **Kafka 鍙互鍜屽緢澶氬綋涓嬩紭绉鐨勫ぇ鏁版嵁缁勪欢杩涜闆嗘垚锛屽寘鎷 Spark銆丗link銆丗lume銆丼torm 绛夌瓑銆** + +## 涓轰粈涔 Kafka 涓嶆敮鎸佽鍐欏垎绂伙紵 + +杩欎釜闂鏈変釜鍏堝喅鏉′欢锛屾垜浠彧璁ㄨ Kafka0.9 鐗堟湰鐨勬儏鍐点傚浜庨珮鐗堟湰锛屼粠 Partition 涔熷彲浠ユ壙鎷呰璇锋眰浜嗭紝杩欓噷涓嶅璧樿堪銆 + +Kafka 濡傛灉鏀寔璇诲啓鍒嗙鐨勮瘽锛屾湁濡備笅鍑犱釜闂銆 + +1. **绯荤粺璁捐鐨勫鏉傚害浼氭瘮杈冨ぇ锛屽綋鐒惰繖涓瘮杈冪壍寮猴紝姣曠珶楂樼増鏈殑 Kafka 宸茬粡瀹炵幇浜嗐** + +
+ + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/v2-98093ad82970feb7a0c52954c6942aa1_720w.webp) + +
+ +**2\. 浠庝笂鍥惧彲浠ョ湅鍑猴紝浠庝粠 Partition 涓婅鍙栨暟鎹細鏈変袱涓棶棰樸備竴銆佹暟鎹粠涓 Partition 涓婂悓姝ュ埌浠 Partition 鏈夋暟鎹欢杩熼棶棰橈紝鍥犱负鏁版嵁浠庣敓浜у埌娑堣垂浼氱粡鍘 3 娆$綉缁滀紶杈撴墠鑳藉琚秷璐癸紝瀵逛簬鏃舵晥鎬ц姹傛瘮杈冮珮鐨勫満鏅湰韬氨涓嶉傚悎浜嗐備簩銆佹暟鎹竴鑷存ч棶棰橈紝鍋囪涓 Partition 灏嗘暟鎹涓娆′慨鏀规垚浜 A锛岀劧鍚庡張灏嗚鏁版嵁淇敼鎴愪簡 B锛岀敱浜庝粠涓 Partition 鍚屾鍒颁粠 Partition 浼氭湁寤惰繜闂锛屾墍浠ヤ篃灏变細浜х敓鏁版嵁涓鑷存ч棶棰樸** + +鍒嗘瀽寰楀嚭锛岄氳繃瑙e喅浠ヤ笂闂鏉ユ崲鍙栦粠 Partition 鎵挎媴璇昏姹傦紝鎴愭湰鍙兂鑰岀煡锛岃屼笖瀵逛簬鍐欏叆鍘嬪姏澶э紝璇诲彇鍘嬪姏灏忕殑鍦烘櫙锛屾湰韬篃灏辨病鏈変粈涔堟剰涔変簡銆 + +## 鎬荤粨 + +鏈枃浠嬬粛浜嗗嚑涓父瑙佺殑 Kafka 鐨勯潰璇曢 + +### 甯歌闈㈣瘯棰樹竴瑙 + +#### 1.1 Kafka 涓殑 ISR(InSyncRepli)銆 OSR(OutSyncRepli)銆 AR(AllRepli)浠h〃浠涔堬紵 + +ISR锛氶熺巼鍜宭eader鐩稿樊浣庝簬10s鐨刦ollower鐨勯泦鍚 + +OSR锛氶熺巼鍜宭eader鐩稿樊澶т簬10s鐨刦ollwer + +AR锛氭墍鏈夊垎鍖虹殑follower + +#### 1.2 Kafka 涓殑 HW銆 LEO 绛夊垎鍒唬琛ㄤ粈涔堬紵 + +HW锛欻igh Water楂樻按浣嶏紝鏍规嵁鍚屼竴鍒嗗尯涓渶浣庣殑LEO鍐冲畾锛圠og End Offset锛 + +LEO锛氭瘡涓垎鍖烘渶澶х殑Offset + +#### 1.3 Kafka 涓槸鎬庝箞浣撶幇娑堟伅椤哄簭鎬х殑锛 + +鍦ㄦ瘡涓垎鍖哄唴锛屾瘡鏉℃秷鎭兘鏈塷ffset锛屾墍浠ユ秷鎭湪鍚屼竴鍒嗗尯鍐呮湁搴忥紝鏃犳硶鍋氬埌鍏ㄥ眬鏈夊簭鎬 + +#### 1.4 Kafka 涓殑鍒嗗尯鍣ㄣ佸簭鍒楀寲鍣ㄣ佹嫤鎴櫒鏄惁浜嗚В锛熷畠浠箣闂寸殑澶勭悊椤哄簭鏄粈涔堬紵 + +鍒嗗尯鍣≒artitioner鐢ㄦ潵瀵瑰垎鍖鸿繘琛屽鐞嗙殑锛屽嵆娑堟伅鍙戦佸埌鍝竴涓垎鍖虹殑闂銆傚簭鍒楀寲鍣紝杩欎釜鏄鏁版嵁杩涜搴忓垪鍖栧拰鍙嶅簭鍒楀寲鐨勫伐鍏枫傛嫤鎴櫒锛屽嵆瀵逛簬娑堟伅鍙戦佽繘琛屼竴涓彁鍓嶅鐞嗗拰鏀跺熬澶勭悊鐨勭被Interceptor锛屽鐞嗛『鍒╅鍏堥氳繃鎷︽埅鍣=>搴忓垪鍖栧櫒=>鍒嗗尯鍣 + +#### 1.5 Kafka 鐢熶骇鑰呭鎴风鐨勬暣浣撶粨鏋勬槸浠涔堟牱瀛愮殑锛熶娇鐢ㄤ簡鍑犱釜绾跨▼鏉ュ鐞嗭紵鍒嗗埆鏄粈涔堬紵 + +浣跨敤涓や釜绾跨▼锛歮ain鍜宻ender 绾跨▼锛宮ain绾跨▼浼氫竴娆$粡杩囨嫤鎴櫒銆佸簭鍒楀寲鍣ㄣ佸垎鍖哄櫒灏嗘暟鎹彂閫佸埌RecoreAccumulator绾跨▼鍏变韩鍙橀噺锛屽啀鐢眘ender绾跨▼浠庡叡浜彉閲忎腑鎷夊彇鏁版嵁鍙戦佸埌kafka broker + +batch.size杈惧埌姝よ妯℃秷鎭墠鍙戦侊紝linger.ms鏈揪鍒拌妯★紝绛夊緟褰撳墠鏃堕暱灏卞彂閫佹暟鎹 + +#### 1.6 娑堣垂缁勪腑鐨勬秷璐硅呬釜鏁板鏋滆秴杩 topic 鐨勫垎鍖猴紝閭d箞灏变細鏈夋秷璐硅呮秷璐逛笉鍒版暟鎹濊繖鍙 璇濇槸鍚︽纭紵 + +杩欏彞璇濇槸瀵圭殑锛岃秴杩囧垎鍖轰釜鏁扮殑娑堣垂鑰呬笉浼氬湪鎺ユ敹鏁版嵁锛屼富瑕佸師鍥犳槸涓涓垎鍖虹殑娑堟伅鍙兘澶熻涓涓秷璐硅呯粍涓殑涓涓秷璐硅呮秷璐广 + +#### 1.7 娑堣垂鑰呮彁浜ゆ秷璐逛綅绉绘椂鎻愪氦鐨勬槸褰撳墠娑堣垂鍒扮殑鏈鏂版秷鎭殑 offset 杩樻槸 offset+1锛 + +鐢熶骇鑰呭彂閫佹暟鎹殑offset鏄粠0寮濮嬬殑锛屾秷璐硅呮秷璐圭殑鏁版嵁鐨刼ffset鏄粠1寮濮嬶紝鏁呮渶鏂版秷鎭槸offset+1 + +#### 1.8 鏈夊摢浜涙儏褰細閫犳垚閲嶅娑堣垂锛 + +鍏堟秷璐瑰悗鎻愪氦offset锛屽鏋滄秷璐瑰畬瀹曟満浜嗭紝鍒欎細閫犳垚閲嶅娑堣垂 + +#### 1.9 閭d簺鎯呮櫙浼氶犳垚娑堟伅婕忔秷璐癸紵 + +鍏堟彁浜ffset锛岃繕娌℃秷璐瑰氨瀹曟満浜嗭紝鍒欎細閫犳垚婕忔秷璐 + +#### 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闆嗙兢涓湁涓涓猙roker浼氳閫変妇涓篊ontroller锛岃礋璐g鐞嗛泦缇roker鐨勪笂涓嬬嚎銆佹墍鏈塼opic鐨勫垎鍖哄壇鏈垎閰嶅拰leader鐨勯変妇绛夊伐浣溿侰ontroller鐨勫伐浣滅鐞嗘槸渚濊禆浜巣ookeeper鐨勩 + +#### 1.18 Kafka 涓湁閭d簺鍦版柟闇瑕侀変妇锛熻繖浜涘湴鏂圭殑閫変妇绛栫暐鍙堟湁鍝簺锛 + +鍦↖SR涓渶瑕侀変妇鍑篖eader锛岄夋嫨绛栫暐涓哄厛鍒板厛寰椼傚湪鍒嗗尯涓渶瑕侀変妇锛岄渶瑕侀変妇鍑篖eader鍜宖ollower銆 + +#### 1.19 澶辨晥鍓湰鏄寚浠涔堬紵鏈夐偅浜涘簲瀵规帾鏂斤紵 + +澶辨晥鍓湰涓洪熺巼姣攍eader鐩稿樊澶т簬10s鐨刦ollower锛孖SR浼氬皢杩欎簺澶辨晥鐨刦ollower韪㈠嚭锛岀瓑閫熺巼鎺ヨ繎leader鐨10s鍐咃紝浼氶噸鏂板姞鍏SR + +#### 1.20 Kafka 鐨勫摢浜涜璁¤瀹冩湁濡傛楂樼殑鎬ц兘锛 + +1. Kafka澶╃敓鐨勫垎甯冨紡鏋舵瀯 +2. 瀵筶og鏂囦欢杩涜浜嗗垎segment锛屽苟瀵箂egment寤虹珛浜嗙储寮 +3. 瀵逛簬鍗曡妭鐐逛娇鐢ㄤ簡椤哄簭璇诲啓锛岄『搴忚鍐欐槸鎸囩殑鏂囦欢鐨勯『搴忚拷鍔狅紝鍑忓皯浜嗙鐩樺鍧鐨勫紑閿锛岀浉姣旈殢鏈哄啓閫熷害鎻愬崌寰堝 +4. 浣跨敤浜嗛浂鎷疯礉鎶鏈紝涓嶉渶瑕佸垏鎹㈠埌鐢ㄦ埛鎬侊紝鍦ㄥ唴鏍告佸嵆鍙畬鎴愯鍐欐搷浣滐紝涓旀暟鎹殑鎷疯礉娆℃暟涔熸洿灏戙 + +## 鍙傝冩枃绔 +https://blog.csdn.net/cao131502 +https://zhuanlan.zhihu.com/p/137811719 \ No newline at end of file From 68d65ba2a393f20ae92fa4745dfb22650edb25d1 Mon Sep 17 00:00:00 2001 From: h2pl <362294931@qq.com> Date: Fri, 26 May 2023 23:15:13 +0800 Subject: [PATCH 03/10] add mq doc --- ...00\350\207\264\346\200\247\357\274\211.md" | 62 ++ ...72\346\234\254\346\246\202\345\277\265.md" | 62 ++ ...66\350\277\237\346\266\210\346\201\257.md" | 62 ++ ...01\344\270\216\350\277\207\346\273\244.md" | 62 ++ ...7\344\270\216\346\266\210\350\264\271 .md" | 62 ++ ...57\345\242\203\346\220\255\345\273\272.md" | 62 ++ ...2\345\272\217\346\266\210\350\264\271 .md" | 62 ++ ...66\350\277\237\351\230\237\345\210\227.md" | 173 ++++++ ...73\344\277\241\351\230\237\345\210\227.md" | 578 ++++++++++++++++++ 9 files changed, 1185 insertions(+) create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" 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部分都可以进行水平扩展,从而避免单点故障,如下图, + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/1191201-20200603173058174-1551688390.png) + +这是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里的信息也是可以保存到磁盘的,保存到磁盘的方式也有两种,推荐的方式是异步保存磁盘,同步保存磁盘是非常损耗性能的。 + +## 生产者 + +生产者支持集群部署,它们向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`这个状态,它将告诉消费者过一段时间后,会重新消费这个消息。 +* 并发消费:消费者将并发的消费消息,这种方式的性能非常好,也是推荐的消费方式。在消费的过程中,如果出现异常,不建议直接抛出,而是返回`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部分都可以进行水平扩展,从而避免单点故障,如下图, + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/1191201-20200603173058174-1551688390.png) + +这是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里的信息也是可以保存到磁盘的,保存到磁盘的方式也有两种,推荐的方式是异步保存磁盘,同步保存磁盘是非常损耗性能的。 + +## 生产者 + +生产者支持集群部署,它们向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`这个状态,它将告诉消费者过一段时间后,会重新消费这个消息。 +* 并发消费:消费者将并发的消费消息,这种方式的性能非常好,也是推荐的消费方式。在消费的过程中,如果出现异常,不建议直接抛出,而是返回`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部分都可以进行水平扩展,从而避免单点故障,如下图, + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/1191201-20200603173058174-1551688390.png) + +这是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里的信息也是可以保存到磁盘的,保存到磁盘的方式也有两种,推荐的方式是异步保存磁盘,同步保存磁盘是非常损耗性能的。 + +## 生产者 + +生产者支持集群部署,它们向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`这个状态,它将告诉消费者过一段时间后,会重新消费这个消息。 +* 并发消费:消费者将并发的消费消息,这种方式的性能非常好,也是推荐的消费方式。在消费的过程中,如果出现异常,不建议直接抛出,而是返回`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部分都可以进行水平扩展,从而避免单点故障,如下图, + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/1191201-20200603173058174-1551688390.png) + +这是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里的信息也是可以保存到磁盘的,保存到磁盘的方式也有两种,推荐的方式是异步保存磁盘,同步保存磁盘是非常损耗性能的。 + +## 生产者 + +生产者支持集群部署,它们向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`这个状态,它将告诉消费者过一段时间后,会重新消费这个消息。 +* 并发消费:消费者将并发的消费消息,这种方式的性能非常好,也是推荐的消费方式。在消费的过程中,如果出现异常,不建议直接抛出,而是返回`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部分都可以进行水平扩展,从而避免单点故障,如下图, + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/1191201-20200603173058174-1551688390.png) + +这是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里的信息也是可以保存到磁盘的,保存到磁盘的方式也有两种,推荐的方式是异步保存磁盘,同步保存磁盘是非常损耗性能的。 + +## 生产者 + +生产者支持集群部署,它们向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`这个状态,它将告诉消费者过一段时间后,会重新消费这个消息。 +* 并发消费:消费者将并发的消费消息,这种方式的性能非常好,也是推荐的消费方式。在消费的过程中,如果出现异常,不建议直接抛出,而是返回`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部分都可以进行水平扩展,从而避免单点故障,如下图, + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/1191201-20200603173058174-1551688390.png) + +这是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里的信息也是可以保存到磁盘的,保存到磁盘的方式也有两种,推荐的方式是异步保存磁盘,同步保存磁盘是非常损耗性能的。 + +## 生产者 + +生产者支持集群部署,它们向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`这个状态,它将告诉消费者过一段时间后,会重新消费这个消息。 +* 并发消费:消费者将并发的消费消息,这种方式的性能非常好,也是推荐的消费方式。在消费的过程中,如果出现异常,不建议直接抛出,而是返回`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部分都可以进行水平扩展,从而避免单点故障,如下图, + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/1191201-20200603173058174-1551688390.png) + +这是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里的信息也是可以保存到磁盘的,保存到磁盘的方式也有两种,推荐的方式是异步保存磁盘,同步保存磁盘是非常损耗性能的。 + +## 生产者 + +生产者支持集群部署,它们向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`这个状态,它将告诉消费者过一段时间后,会重新消费这个消息。 +* 并发消费:消费者将并发的消费消息,这种方式的性能非常好,也是推荐的消费方式。在消费的过程中,如果出现异常,不建议直接抛出,而是返回`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\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是一个分布式消息系统,被广泛应用于互联网和大数据领域。在实际应用中,经常需要实现延迟队列的功能,以便在一定时间后执行某些任务或者发送某些消息。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中,并设置一个新的延迟时间戳。这样,就可以实现延迟队列的功能。 + + + +![image-20230526211424767](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526211424767.png) + + + + + +### 三、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中的时间戳是否已经过期。可以根据具体的应用场景设置不同的延迟时间。 + + + + + +![image-20230526211452328](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526211452328.png) + + + + + +### 四、延迟消息实现的优缺点 + + + + + +![image-20230526211506828](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526211506828.png) + + + + + +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 的替代方案、最佳实践和案例研究。 + + + + + +识别和处理错误对于任何可靠的数据流管道都是必不可少的。这篇博文探讨了** 在 Apache Kafka 基础架构中****使用死信队列实现错误处理的最佳实践**。这些选项包括自定义实现、Kafka Streams、Kafka Connect、Spring 框架和并行消费者。真实案例研究展示了 Uber、CrowdStrike 和桑坦德银行如何以极端规模构建可靠的实时错误处理。 + + + + + +Apache Kafka 成为许多企业架构最喜欢的集成中间件。即使对于云优先战略,企业也可以利用 Kafka 的数据流作为云原生集成平台即服务 (iPaaS)。 + + + + + +### Apache Kafka 数据流中的消息队列模式 + + + + + +在我开始这篇文章之前,我想让你知道这个内容是**关于“JMS、消息队列和 Apache Kafka”的博客系列**的一部分: + + + + + +* JMS 消息代理与 Apache Kafka 数据流的**10 个比较标准** +* _**这篇文章**_**– 通过Apache Kafka 中的死信队列 (DQL)**进行错误处理的替代方法 +* 使用 Apache Kafka实现**请求-回复模式** +* _即将_推出——**用于选择正确消息系统的决策树**(JMS 与 Apache Kafka) +* _即将推出_——从 JMS 消息代理到 Apache Kafka:**集成、迁移和/或替换** + + + + + +### 什么是死信队列集成模式(在 Apache Kafka 中)? + + + + + +**死信队列 (DLQ)**是消息系统或数据流平台内的一种服务实现,用于**存储未成功处理的消息**。系统不是被动地转储消息,而是将其移动到死信队列。 + + + + + +企业**集成模式 (EIP)**改为调用设计模式死信通道。我们可以将两者用作同义词。 + + + + + +![image-20230526224702433](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526224702433.png) + + + + + +本文重点介绍数据流平台 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 变得更加重要,并被包含在某些框架中。 + + + + + +### Kafka Connect 内置死信队列 + + + + + +**Kafka Connect 是 Kafka 的集成框架**。它包含在开源 Kafka 下载中。不需要其他依赖项(除了您部署到 Connect 集群中的连接器本身)。 + + + + + +默认情况下,如果由于使用无效消息而发生错误(例如使用错误的 JSON 转换器而不是正确的 AVRO 转换器时),Kafka Connect 任务将停止。删除无效消息是另一种选择。后者容忍错误。 + + + + + +Kafka Connect 中 DLQ 的配置很简单。只需将两个配置选项 ' errors.tolerance' 和 ' errors.deadletterqueue.topic.name' 的值设置为正确的值: + + + + + +![image-20230526224856544](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526224856544.png) + + + + + +博客文章“ Kafka Connect Deep Dive – 错误处理和死信队列”显示了使用 DLQ 的详细动手代码示例。 + + + + + +**Kafka Connect 甚至可以用于处理 DLQ 中的错误消息**。只需部署另一个使用 te DLQ 主题的连接器。例如,如果您的应用程序处理 Avro 消息并且传入消息是 JSON 格式。然后连接器使用 JSON 消息并将其转换为 AVRO 消息以成功重新处理: + + + + + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/61aa7624a01c5016d3ab9aaa8ee6938d5514.jpeg)请注意,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 框架功能非常丰富,但它有点重,并且有一个学习曲线。因此,它非常适合新建项目,或者如果您已经将 Spring 用于其他场景的项目。 + + + + + +有很多很棒的博客文章展示了不同的示例和配置选项。还有用于死信队列的官方 Spring Cloud Stream 示例。Spring 允许使用简单的注释构建逻辑,例如 DLQ。这种编程方法是一些开发人员钟爱的范例,而另一些则不喜欢它。只需了解选项并为自己选择合适的选项即可。 + + + + + +### Apache Kafka 并行消费者的可扩展处理和错误处理 + + + + + +在许多客户对话中,事实证明,**请求死信队列的主要原因通常是处理连接到外部 Web 服务或数据库的失败**。超时或 Kafka 无法并行发送各种请求会导致某些应用程序瘫痪。这个问题有一个很好的解决方案: + + + + + +Apache Kafka的**并行消费者**是Apache 2.0 许可下**的开源项目。**它提供了一个带有客户端队列的并行 Apache Kafka 客户端包装器、一个具有**关键并发性的更简单的消费者/生产者 API,**以及**可扩展的非阻塞 IO**处理。 + + + + + +该库允许您**通过单个 Kafka Consumer 并行处理消息,这意味着您可以在不增加**要处理的主题中的分区数量的情况下增加 Kafka Consumer 并行度。**对于许多用例,这通过减少 Kafka 代理的负载来**提高吞吐量和延迟。它还开辟了新的用例,例如极端并行性、外部数据丰富和排队。 + + + + + +一个关键特性是**在单个 Kafka 消费者应用程序中处理/重复 Web 服务和数据库调用**。并行化避免了一次发送单个 Web 请求的需要: + + + + + +![image-20230526224910457](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526224910457.png) + + + + + +**Parallel Consumer 客户端具有强大的重试**逻辑。这包括可配置的延迟和动态错误或处理。错误也可以发送到死信队列。 + + + + + +### 使用死信队列中的消息 + + + + + +**将错误发送到死信队列后,您还没有完成!坏消息需要被处理或至少被监控!** + + + + + +死信队列是**从事件处理中带外处理数据错误处理**的绝佳方式,这意味着错误处理程序可以与事件处理代码分开创建或演变。 + + + + + +存在大量使用死信队列的错误处理策略。DO 和 DONT 探索最佳实践和经验教训。 + + + + + +### 错误处理策略 + + + + + +有几个选项可用于处理存储在死信队列中的消息: + + + + + +* **重新处理**:DLQ中的一些消息需要重新处理。但是,首先,需要解决这个问题。解决方案可以是自动脚本、编辑消息的人工交互,或向生产者返回错误,要求重新发送(更正的)消息。 +* **删除错误消息(经过进一步分析)**:根据您的设置,可能会出现错误消息。但是,在删除它们之前,业务流程应该检查它们。例如,仪表板应用程序可以使用错误消息并将它们可视化。 +* **高级分析**:另一种选择是分析传入数据以获取实时洞察或问题,而不是处理 DLQ 中的每条消息。例如,一个简单的 ksqlDB 应用程序可以应用流处理进行计算,例如每小时错误消息的平均数量或任何其他有助于确定 Kafka 应用程序中的错误的见解。 +* **停止工作流**:如果很少会出现坏消息,结果可能是停止整个业务流程。该动作可以是自动的,也可以由人决定。当然,停止工作流也可以在抛出错误的 Kafka 应用程序中完成。如果需要,DLQ 将问题和决策外部化。 +* **忽略**:这听起来可能是最糟糕的选择。只是让死信队列填满,什么都不做。然而,即使这样在某些用例中也很好,比如监控 Kafka 应用程序的整体行为。请记住,Kafka 主题具有保留时间,并且在该时间之后从主题中删除消息。只需为您设置正确的方式即可。并监控 DQL 主题是否存在意外行为(例如填充太快)。 + + + + + +### Apache Kafka 中死信队列的最佳实践 + + + + + +以下是在 Kafka 应用程序中使用死信队列进行错误处理的一些**最佳实践和经验教训:** + + + + + +* 定义**处理无效消息的业务流程**(自动与人工) + * 现实:通常,根本没有人处理 DLQ 消息 + * 备选方案 1:数据所有者需要接收警报,而不仅仅是基础架构团队 + * 备选方案 2:警报应通知记录团队系统数据错误,他们将需要从记录系统重新发送/修复数据。 + * 如果没有人关心或抱怨,请考虑质疑和审查 DLQ 存在的必要性。相反,这些消息也可以在初始 Kafka 应用程序中被忽略。这节省了大量的网络负载、基础设施和资金。 +* 构建**带有适当警报的仪表板**并整合相关团队(例如,通过电子邮件或 Slack 警报) +* 定义每个 Kafka 主题的**错误处理优先级(停止、删除和重新处理)** +* **仅将不可重试的错误消息推送到 DLQ** - 连接问题是消费者应用程序的责任。 +* **保留原始消息**并将它们存储在 DLQ 中(带有额外的标头,例如错误消息、错误时间、发生错误的应用程序名称等)——这使得重新处理和故障排除变得更加容易。 +* **想想你需要多少 Dead Letter Queue Kafka 主题**。总是有取舍。但是将所有错误存储在单个 DLQ 中可能对进一步分析和重新处理没有意义。 + + + + + +请记住,**DLQ 会以有保证的顺序终止处理,并使任何类型的离线处理变得更加困难**。因此,Kafka DQL 并不适合每个用例。 + + + + + +### 何时不在 Kafka 中使用死信队列? + + + + + +让我们探讨一下不应该将哪些类型的消息放入 Kafka 的死信队列中: + + + + + +* **DLQ 用于背压处理?**由于大量消息的峰值而使用 DLQ 进行节流并不是一个好主意。Kafka 日志背后的存储会自动处理背压。消费者以它可以按自己的速度获取数据的方式提取数据(或者配置错误)。如果可能的话,弹性地扩展消费者。即使您的存储空间已满,DLQ 也无济于事。这是它的问题,与是否使用 DLQ 无关。 +* **连接失败的DLQ?**由于连接失败而将消息放入 DQL 无济于事(即使在多次重试之后)。以下消息也无法连接到该系统。您需要解决连接问题。消息可以根据需要存储在常规主题中(取决于保留时间)。 + + + + + +### 用于数据治理和错误预防的模式注册表 + + + + + +最后但同样重要的是,让我们探讨在某些情况下**减少甚至消除对死信队列的需求的可能性。** + + + + + +**卡夫卡**的Schema Registry**是一种确保数据清理以防止生产者在负载中出错的方法**。它在 Kafka 生产者中强制执行正确的消息结构: + +![image-20230526224926155](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526224926155.png) + + + + + +模式注册表是模式的客户端检查。Confluent Server 等一些实现在代理端提供了额外的模式检查,以拒绝来自未使用模式注册表的生产者的无效或恶意消息。 + + + + + +### Kafka 死信队列的案例研究 + + + + + +让我们看看**Uber、CrowdStrike 和 Santander Bank 的三个案例研究,它们在 Kafka 基础设施中实际部署死信队列**。请记住,这些都是非常成熟的例子。不是每个项目都需要那么复杂。 + + + + + +### Uber - 构建可靠的再处理和死信队列 + + + + + +在分布式系统中,重试是不可避免的。从网络错误到复制问题,甚至下游依赖关系的中断,大规模运行的服务必须准备好尽可能优雅地遇到、识别和处理故障。 + + + + + +鉴于 Uber 的运营范围和速度,它的系统必须具有**容错能力,并且在智能失败时毫不妥协**。Uber 将 Apache Kafka 用于各种极端规模的用例以实现这一目标。 + + + + + +利用这些特性,Uber 保险工程团队扩展了 Kafka 在其现有事件驱动架构中的作用,通过使用 n**个阻塞请求重新处理和死信队列来实现解耦、可观察的错误处理,而不会中断实时流量**。该策略有助于他们选择加入的驾驶员伤害保护计划在 200 多个城市可靠运行,并为注册驾驶员扣除每次行程的每英里保费。 + + + + + +这是 Uber 错误处理的示例。错误会降低重试主题的级别,直到登陆 DLQ: + + + + + +![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526225030750.png) + + + + + +有关更多信息,请阅读 Uber 非常详细的技术文章:“使用 Apache Kafka 构建可靠的再处理和死信队列”。 + + + + + +### CrowdStrike - 处理数万亿事件的错误 + + + + + +CrowdStrike 是一家位于德克萨斯州奥斯汀的**网络安全技术公司。**它提供**云工作负载和端点安全、威胁情报和网络攻击响应服务**。 + + + + + +CrowdStrike 的基础设施** 每天使用 Apache Kafka 处理数万亿个事件**。在我的“ Apache Kaka 网络安全博客系列”中,我介绍了以任何规模实时创建态势感知和威胁情报的相关用例。 + + + + + +CrowdStrike 定义了三个最佳实践 来成功实现死信队列和错误处理: + + + + + +* **在正确的系统中存储错误消息**:定义基础设施和代码以捕获和检索死信。CrowdStrike 使用 S3 对象存储来存储潜在的大量错误消息。请注意,Kafka 的分层存储开箱即用地解决了这个问题,无需其他存储接口(例如,利用 Confluent Cloud 中的无限存储)。 +* **使用自动化**:放置工具以使修复万无一失,因为手动完成错误处理可能非常容易出错。 +* **记录业务流程并聘请相关团队**:标准化和记录流程以确保易于使用。并非所有工程师都熟悉组织处理死信消息的策略。 + + + + + +在**像 CrowdStrike 这样的网络安全平台中,大规模实时数据处理至关重要**。此要求也适用于错误处理。**下一次网络攻击可能是故意包含不适当或无效内容的恶意消息**(如 JavaScript 漏洞利用)。因此,必须通过死信队列实时处理错误。 + + + + + +### 桑坦德银行 - 用于重试和 DLQ 组合的邮箱 2.0 + + + + + +桑坦德银行**在邮箱应用程序中处理海量数据的同步数据处理面临巨大挑战**。他们重新架构了他们的基础架构并构建了一个解耦且可扩展的架构,称为“Santander Mailbox 2.0”。 + + + + + +Santander 的工作负载并转移到**由 Apache Kafka 提供支持的事件溯源**: + + + + + +![image-20230526225045196](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526225045196.png) + + + + + +新的基于异步事件的架构中的一个关键挑战是错误处理。** Santander 使用重试和 DQL Kafka 主题构建的错误处理**解决了这些问题: + + + + + +![image-20230526225057151](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230526225057151.png) + + + + + +查看来自 Santander 的集成合作伙伴 Consdata的 Kafka 峰会演讲“基于重试策略和死信主题的 Apache Kafka 中的可靠事件传递”中的详细信息。 + + + + + +### Apache Kafka 中可靠且可扩展的错误处理 + + + + + +**错误处理对于构建可靠的数据流管道和平台至关重要**。存在不同的替代方案来解决这个问题。该解决方案包括死信队列的自定义实现或利用正在使用的框架,例如 Kafka Streams、Kafka Connect、Spring 框架或 Kafka 的并行消费者。 + + + + + +优步、CrowdStrike 和桑坦德银行的案例研究表明,错误处理并不总是很容易实现。当您设计新的应用程序或架构时,需要从一开始就考虑到这一点。**使用 Apache Kafka 进行实时数据流传输很有吸引力,但只有在您能够处理意外行为时才能成功**。死信队列是许多场景的绝佳选择。 \ No newline at end of file From 2c59f8da32e7e2928dedcf96fb141e4674b16354 Mon Sep 17 00:00:00 2001 From: h2pl <362294931@qq.com> Date: Wed, 31 May 2023 00:13:17 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/monitor/Spring Actuator.md | 578 +++++++++++++++++++++++++++++++ docs/monitor/SpringBoot Admin.md | 495 ++++++++++++++++++++++++++ 2 files changed, 1073 insertions(+) create mode 100644 docs/monitor/Spring Actuator.md create mode 100644 docs/monitor/SpringBoot Admin.md 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 @@ +## 前言 + +在微服务系统架构中,服务的监控是必不可少的。目前大多数微服务应用又是基于Spring Cloud系列,也可以说是基于Spring Boot系列的。此时使用Spring Boot Actuator来进行微服务的监控,不仅功能全面,而且非常方便。 + +在上篇文章《[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") ,对应展示结果如下图: + +![image-20230530233537559](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233537559.png) + +上述只展示了一部分的端点,返回结果为,这里采用了浏览器的插件-Handler进行了格式美化。通过actuator可以直观的看出目前开放了哪些端点,以及这些端点的名称和请求路径。 + +下面我们就按照显示actuator端点展示的列表逐一介绍。 + +## auditevents端点 + +auditevents端点用于显示应用暴露的审计事件 (比如认证进入、订单失败),即使我们打开了所有端点,默认情况下也是看不到这个端点的。因为使用它的前提是需要在Spring容器中存在一个类型为AuditEventRepository的Bean的。 + +查看了网络上大多数教程,基本上都是介绍了auditevents端点功能,而未展示具体实例。笔者经过多方尝试,终于给大家写了一个案例出来。 + +首先涉及到权限认证,需要先引入spring-boot-starter-security依赖: + +```` + + org.springframework.boot + spring-boot-starter-security +` +```` + +单纯添加这个依赖还是不够的,还需要加入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提供的登录页面: + +![image-20230530233604253](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233604253.png) + +输入代码中指定的用户名和密码,登录成功,跳转到/actuator页面: + +![image-20230530233625068](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233625068.png) + +可以看到auditevents端点已经成功显示出来了。新开页面访问[http://localhost:8080/actuator/auditevents](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fauditevents "http://localhost:8080/actuator/auditevents") ,展示内容如下: + +![image-20230530233716752](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233716752.png) + +可以看到已经记录下了权限相关的事件,其中第一次事件是我们直接访问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") ,范围结果如下: + +![image-20230530233748286](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233748286.png) + +这个端点会展示目前Spring容器中初始化的所有Bean,试想一下,如果你配置了一个Bean,但不确定是否成功实例化,是不是就可以通过这个端口查询一下呢? + +我们在项目中定义一个TestController,并注入一个UserService: + + +```` +@Controller +public class TestController { + + @Resource + private UserService userService; +} +```` + +重新启动并访问该端点,会看到如下信息: + +![image-20230530233805161](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233805161.png) + +可以看到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") ,也就是触发一下缓存内容的生成。此时再访问上面的链接,便可以看到应用程序中的缓存信息了: + +![image-20230530233852486](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233852486.png) + +可以看到,返回的内容不仅展示了应用程序的缓存管理器,同时也展示了缓存的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),执行结果如下: + +![image-20230530233906164](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233906164.png) + +可以看出,只查询除了指定的缓存信息,包括缓存管理器、缓存名称(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,看一下详情: + +![image-20230530233934501](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233934501.png) + +可以看到整体状态为UP,其中下面的三个组件均为UP,而数据库是MYSQL,检查数据库的语句为“SELECT 1”。同时,还展示了磁盘信息和ping的状态。 + +现在我们把数据库的用户名和密码故意改错,重启访问可得: + +![image-20230530233951145](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530233951145.png) + +状态为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") ,展示结果如下: + +![image-20230530234019487](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530234019487.png) + +## conditions端点 + +Spring Boot提供了自动配置功能,使用起来非常方便。但这些自动配置类是什么情况下生效的,是否生效是比较难排查的。此时,可以使用 conditions 在应用运行时查看某个配置类在什么条件下生效,或为什么没有生效。 + +访问URL:[http://localhost:8080/actuator/conditions](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A8080%2Factuator%2Fconditions "http://localhost:8080/actuator/conditions") ,部分返回信息如下: + +![image-20230530234053134](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530234053134.png) + +可以看到某个自动配置类对应的生效条件和提示信息。 + +## 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") ,部分信息如下: + +![image-20230530234110515](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530234110515.png) + +不仅可以看到系统中默认集成的配置类信息,还可以看到我们自定义的配置类信息。这里需要注意的是对应的类需要进行实例化(@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") + +![image-20230530234200949](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530234200949.png) + +## 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") ,返回结果如下图: + +![image-20230530234238073](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530234238073.png) + +返回数据信息包括该属性的来源、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") ,部分返回结果: + +![image-20230530234301625](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530234301625.png) + +## loggers-name端点 + +loggers-name端点也是logger端点的细分,可以通过name访问某一个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。 + +![image-20230530234346098](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530234346098.png) + +此时便可以通过工具来进行堆栈信息的分析了。对于线上问题的分析提供了极为便利的方式。 + +## 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") ,部分返回结果: + +![image-20230530234405331](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530234405331.png) + +我们可通过线程快照来排查生产环境的问题。 + +## 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端点可以提供应用运行状态的完整度量指标报告,这项功能非常的实用,但是对于监控系统中的各项监控功能,它们的监控内容、数据收集频率都有所不同,如果我们每次都通过全量获取报告的方式来收集,略显粗暴。官方也是可能是处于此方面的考虑,在Spring Boot 2.x之后,/metrics端点只显示了指标的列表。 + +如果需要查看具体的某项指标,则可通过/metrics-requiredMetricName端点来实现。 + +## metrics-requiredMetricName端点 + +metrics-requiredMetricName端点,用于访问指定指标的报告,一般会配合/metrics端点先查出指标列表,然后再查询具体的某个指标。 + +基本格式:[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 路径,以及和控制器的映射关系。这个功能算是比较常用的了,如果想系统的查看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") ,部分返回结果如下: + +![image-20230530234501440](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230530234501440.png) + +至此关于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") + +![image-20230531001002163](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001002163.png) + + + + + +* 点击wallboard按钮,选择admin-client查看监控信息; + +* 监控信息概览; + +![image-20230531001023644](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001023644.png) + + + + + +* 度量指标信息,比如JVM、Tomcat及进程信息; + +![image-20230531001053279](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001053279.png) + + + + + +* 环境变量信息,比如系统属性、系统环境变量以及应用配置信息; + +![image-20230531001103093](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001103093.png) + + + + + +* 查看所有创建的Bean信息; + +![image-20230531001111221](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001111221.png) + + + + + +* 查看应用中的所有配置信息; + +![image-20230531001124678](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001124678.png) + + + + + +* 查看日志信息,需要添加以下配置才能开启; + + + +`logging: +file: admin-client.log #添加开启admin的日志监控` + +![image-20230531001136184](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001136184.png) + + + + +* 查看JVM信息; + +![image-20230531001144614](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001144614.png) + + + + + +* 查看可以访问的Web端点; + +![image-20230531001156191](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001156191.png) + + + + + +* 查看HTTP跟踪信息; + +![image-20230531001206364](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001206364.png) + + + + + +## 结合注册中心使用 + +> 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/") + +![image-20230531001221519](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001221519.png) + + +* 查看Spring Boot Admin 主页发现可以看到服务信息:[http://localhost:9301](https://link.juejin.cn?target=http%3A%2F%2Flocalhost%3A9301 "http://localhost:9301") + +![image-20230531001232048](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001232048.png) + + +## 添加登录认证 + +> 我们可以通过给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") + +![image-20230531001242361](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/image-20230531001242361.png) + + + + + +## 使用到的模块 + + + + + +``` +springcloud-learning +├── eureka-server -- eureka注册中心 +├── admin-server -- admin监控中心服务 +├── admin-client -- admin监控中心监控的应用服务 +└── admin-security-server -- 带登录认证的admin监控中心服务` +``` \ No newline at end of file From 86135b7d0109ae0d1b51efc3cb016efe4b5973bc Mon Sep 17 00:00:00 2001 From: h2pl <362294931@qq.com> Date: Sat, 26 Aug 2023 20:04:58 +0800 Subject: [PATCH 05/10] add mq list --- ReadMe.md | 19 +++++++++++++++++++ ...47\344\270\216\346\266\210\350\264\271.md" | 0 ...72\345\272\217\346\266\210\350\264\271.md" | 0 3 files changed, 19 insertions(+) rename "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" => "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" (100%) rename "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" => "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" (100%) diff --git a/ReadMe.md b/ReadMe.md index 6aabce3..0c11cc7 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -394,6 +394,25 @@ todo # 娑堟伅闃熷垪 ## Kafka +* [娑堟伅闃熷垪kafka璇﹁В锛欿afka 蹇熶笂鎵嬶紙Java鐗堬級](docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka 蹇熶笂鎵嬶紙Java鐗堬級.md) +* [娑堟伅闃熷垪kafka璇﹁В锛欿afka涓鏉℃秷鎭瓨鍒癰roker鐨勮繃绋媇(docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka涓鏉℃秷鎭瓨鍒癰roker鐨勮繃绋.md) +* [娑堟伅闃熷垪kafka璇﹁В锛氭秷鎭槦鍒梜afka璇﹁В锛欿afka浠嬬粛](docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka浠嬬粛.md) +* [娑堟伅闃熷垪kafka璇﹁В锛欿afka鍘熺悊鍒嗘瀽鎬荤粨绡嘳(docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka鍘熺悊鍒嗘瀽鎬荤粨绡.md) +* [娑堟伅闃熷垪kafka璇﹁В锛欿afka甯歌鍛戒护鍙婇厤缃荤粨](docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka甯歌鍛戒护鍙婇厤缃荤粨.md) +* [娑堟伅闃熷垪kafka璇﹁В锛欿afka鏋舵瀯浠嬬粛](docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka鏋舵瀯浠嬬粛.md) +* [娑堟伅闃熷垪kafka璇﹁В锛欿afka鐨勯泦缇ゅ伐浣滃師鐞哴(docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka鐨勯泦缇ゅ伐浣滃師鐞.md) +* [娑堟伅闃熷垪kafka璇﹁В锛欿afka閲嶈鐭ヨ瘑鐐+闈㈣瘯棰樺ぇ鍏╙(docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka閲嶈鐭ヨ瘑鐐+闈㈣瘯棰樺ぇ鍏.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/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" similarity index 100% rename from "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" rename to "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" 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" similarity index 100% rename from "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" rename to "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" From 183bf66bea9599a14c8598d6df28fcad26248d35 Mon Sep 17 00:00:00 2001 From: h2pl <362294931@qq.com> Date: Sat, 26 Aug 2023 20:33:28 +0800 Subject: [PATCH 06/10] ok --- ReadMe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index 0c11cc7..866d360 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -394,7 +394,7 @@ todo # 娑堟伅闃熷垪 ## Kafka -* [娑堟伅闃熷垪kafka璇﹁В锛欿afka 蹇熶笂鎵嬶紙Java鐗堬級](docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka 蹇熶笂鎵嬶紙Java鐗堬級.md) +* [娑堟伅闃熷垪kafka璇﹁В锛欿afka蹇熶笂鎵嬶紙Java鐗堬級](docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka蹇熶笂鎵嬶紙Java鐗堬級.md) * [娑堟伅闃熷垪kafka璇﹁В锛欿afka涓鏉℃秷鎭瓨鍒癰roker鐨勮繃绋媇(docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka涓鏉℃秷鎭瓨鍒癰roker鐨勮繃绋.md) * [娑堟伅闃熷垪kafka璇﹁В锛氭秷鎭槦鍒梜afka璇﹁В锛欿afka浠嬬粛](docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka浠嬬粛.md) * [娑堟伅闃熷垪kafka璇﹁В锛欿afka鍘熺悊鍒嗘瀽鎬荤粨绡嘳(docs/mq/kafka/娑堟伅闃熷垪kafka璇﹁В锛欿afka鍘熺悊鍒嗘瀽鎬荤粨绡.md) From 757b11887fb3b0d8f1029ae80e5bb238229acbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=9F=E5=B0=8F=E6=B9=96?= <362294931@qq.com> Date: Wed, 16 Apr 2025 20:07:30 +0800 Subject: [PATCH 07/10] Update ReadMe.md --- ReadMe.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ReadMe.md b/ReadMe.md index 866d360..269ed3e 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -30,6 +30,16 @@

+

+ +

+ + ef9a0076f464d69ba16e99e7e8f26a87.png + +

+ +Swiftproxy-90M+鍏ㄧ悆楂樿川閲忕函鍑浣忓畢IP锛屾敞鍐屽彲棰嗗厤璐500MB娴嬭瘯娴侀噺锛屽姩鎬佹祦閲忎笉杩囨湡锛佷娇鐢ㄦ姌鎵g爜锛欸HB5绔嬩韩涔濇姌浼樻儬锛 + # Java鍩虹 ## 鍩虹鐭ヨ瘑 From 0922bb9ffc366c5501dd8236e5d8fdc359226fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=9F=E5=B0=8F=E6=B9=96?= <362294931@qq.com> Date: Mon, 21 Apr 2025 18:31:22 +0800 Subject: [PATCH 08/10] Update ReadMe.md --- ReadMe.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 269ed3e..b5d6559 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,4 +1,3 @@ -
@@ -33,8 +32,8 @@

- - ef9a0076f464d69ba16e99e7e8f26a87.png + + ef9a0076f464d69ba16e99e7e8f26a87.png

From 921aa16bcd882bcb0a667f8c5a1899914b9ffef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=9F=E5=B0=8F=E6=B9=96?= <362294931@qq.com> Date: Mon, 21 Apr 2025 18:32:10 +0800 Subject: [PATCH 09/10] Update ReadMe.md --- ReadMe.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ReadMe.md b/ReadMe.md index b5d6559..74fc288 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,3 +1,4 @@ +
From e89aca28d56b5c6e03ce37f20abc6781388b2b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=9F=E5=B0=8F=E6=B9=96?= <362294931@qq.com> Date: Tue, 20 May 2025 18:36:36 +0800 Subject: [PATCH 10/10] Update ReadMe.md --- ReadMe.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 74fc288..84572da 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -32,14 +32,6 @@

-

- - ef9a0076f464d69ba16e99e7e8f26a87.png - -

- -Swiftproxy-90M+鍏ㄧ悆楂樿川閲忕函鍑浣忓畢IP锛屾敞鍐屽彲棰嗗厤璐500MB娴嬭瘯娴侀噺锛屽姩鎬佹祦閲忎笉杩囨湡锛佷娇鐢ㄦ姌鎵g爜锛欸HB5绔嬩韩涔濇姌浼樻儬锛 - # Java鍩虹 ## 鍩虹鐭ヨ瘑