Consumer原理分析

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code and KPI, Keep progress,make a better result.
Survive during the day and develop at night。

目录

概 述

分区分配策略
分区在集群中的分配策略:
将所有broker(n个)和partition排序
将第i个Partition分配到第(i mode n)个broker上
Producer如何把消息发送给对应分区
当key为空时,消息随机发送到各个分区(各个版本会有不同,有的是采用轮询的方式,有的是随机,有的是一定时间内只发送给固定partition,隔一段时间后随机换一个)

用key的ha’sh值对partion个数取模,决定要把消息发送到哪个partition上

消费者分区分配策略
Range 范围分区(默认的)
假如有10个分区,3个消费者,把分区按照序号排列0,1,2,3,4,5,6,7,8,9;消费者为C1,C2,C3,那么用分区数除以消费者数来决定每个Consumer消费几个Partition,除不尽的前面几个消费者将会多消费一个
最后分配结果如下
C1:0,1,2,3
C2:4,5,6
C3:7,8,9
如果有11个分区将会是:
C1:0,1,2,3

C2:4,5,6,7
C3:8,9,10

C1:T1(0,1,2,3) T2(0,1,2,3)
C2:T1(4,5,6) T2(4,5,6)
C3:T1(7,8,9) T2(7,8,9)

RoundRobin 轮询分区:
partition,consumer,然后轮询consumer和partition,尽可能的让把partition均匀的分配给consumer

假如有3个Topic T0(三个分区P0-0,P0-1,P0-2),T1(两个分区P1-0,P1-1),T2(四个分区P2-0,P2-1,P2-2,P2-3)
有三个消费者:C0(订阅了T0,T1),C1(订阅了T1,T2),C2(订阅了T0,T2)
在这里插入图片描述
分区将会按照一定的顺序排列起来,消费者将会组成一个环状的结构,然后开始轮询。
P0-0分配给C0
P0-1分配给C1但是C1并没订阅T0,于是跳过C1把P0-1分配给C2,
P0-2分配给C0
P1-0分配给C1,
P1-1分配给C0,
P2-0分配给C1,
P2-1分配给C2,
P2-2分配给C1,

什么时候触发分区分配策略:
1.同一个Consumer Group内新增或减少Consumer
2.Topic分区发生变化
1.同一个Consumer Group内新增或减少Consumer
2.Topic分区发生变化

Rebalance的执行

kafka提供了一个角色Coordinator来执行。当Consumer Group的第一个Consumer启动的时候,他会向kafka集群中的任意一台broker发送GroupCoordinatorRequest请求,broker会返回一个负载最小的broker设置为coordinator,之后该group的所有成员都会和coordinator进行协调通信

kafka提供了一个角色Coordinator来执行。当Consumer Group的第一个Consumer启动的时候,他会向kafka集群中的任意一台broker发送GroupCoordinatorRequest请求,broker会返回一个负载最小的broker设置为coordinator,之后该group的所有成员都会和coordinator进行协调通信

整个Rebalance分为两个过程 jionGroup和sysncJion

joinGroup过程
在这一步中,所有的成员都会向coordinator发送JionGroup请求,请求内容包括group_id,member_id.protocol_metadata等,coordinator会从中选出一个consumer作为leader,并且把组成员信息和订阅消息,leader信息,rebanlance的版本信息发送给consumer

Synchronizing Group State阶段
组成员向coordinator发送SysnGroupRequet请求,但是只有leader会发送分区分配的方案(分区分配的方案其实是在消费者确定的),当coordinator收到leader发送的分区分配方案后,会通过SysnGroupResponse把方案同步到各个consumer中

小结

参考资料和推荐阅读

1.链接: 参考资料.

<think>好的,用户让我分析Dubbo的原理,我需要先回忆Dubbo的基本架构和工作机制。Dubbo是阿里巴巴开源的分布式服务框架,主要用于高性能的RPC通信。首先,我应该从核心组件开始,比如服务提供者、消费者、注册中心、监控中心等。 接下来,服务注册与发现的流程。当服务提供者启动时,它会将服务信息注册到注册中心,而消费者在启动时会从注册中心订阅所需的服务。注册中心负责维护服务列表,并通知消费者任何变更。这里可能需要提到Zookeeper作为常用的注册中心。 然后是RPC通信机制,Dubbo默认使用Netty进行网络通信,数据传输协议可以是Dubbo协议、HTTP等。需要解释调用过程,消费者如何通过代理发起请求,经过负载均衡选择提供者,然后序列化请求数据,发送到提供者,提供者反序列化并处理,返回结果。 负载均衡策略也很重要,Dubbo支持随机、轮询、最少活跃调用等策略,这些策略在集群容错时发挥作用。集群容错模式如Failover、Failfast等,需要简要说明它们的不同应用场景。 此外,SPI机制是Dubbo扩展性的关键,允许用户自定义组件,比如协议、序列化方式等。动态代理方面,Dubbo使用Javassist或JDK动态代理来生成服务接口的代理类,实现远程调用。 监控和管理部分,Dubbo通过暴露服务统计信息,帮助监控运行状态,并支持路由规则、权重调整等管理功能。最后,总结其核心原理,包括服务治理、通信机制和扩展性。 在回答时要确保结构清晰,分点说明各个组件和工作流程,同时要提到相关技术如Netty、Zookeeper、SPI等。最后的问题需要围绕Dubbo的核心概念、组件、通信协议、负载均衡策略、SPI机制等方面提出,帮助用户深入理解。</think><< Dubbo原理分析: Dubbo是阿里巴巴开源的分布式服务框架,核心目标是实现高性能RPC(远程过程调用)和服务治理。其核心原理可以分为以下模块: ### 1. **服务注册与发现** - **原理**: - 服务提供者(Provider)启动时向注册中心(如Zookeeper、Nacos)注册服务元数据(IP、端口、接口名等)。 - 服务消费者(Consumer)从注册中心订阅所需服务,获取提供者列表并缓存本地。 - 注册中心通过心跳检测实时维护服务可用性。 - **代码示例**(服务注册配置): ```java // Provider配置 <dubbo:service interface="com.example.DemoService" ref="demoService" /> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> ``` ### 2. **RPC通信机制** - **原理**: - 消费者通过动态代理生成服务接口的代理对象,调用方法时封装请求信息(方法名、参数等)。 - 默认使用Netty作为网络通信框架,通过自定义协议(Dubbo协议)传输数据。 - 序列化支持Hessian、JSON、Kryo等格式。 - **调用流程**: 消费者 -> 代理对象 -> 负载均衡选择Provider -> 网络传输 -> Provider处理请求 -> 返回结果。 ### 3. **负载均衡与集群容错** - **负载均衡策略**: - Random(随机)、RoundRobin(轮询)、LeastActive(最少活跃调用)等。 - **集群容错模式**: - Failover(失败自动切换)、Failfast(快速失败)、Failsafe(安全失败)等。 - **代码示例**(配置负载均衡): ```java <dubbo:reference interface="com.example.DemoService" loadbalance="roundrobin" /> ``` ### 4. **服务治理与监控** - **原理**: - 通过Admin控制台管理服务(路由规则、权重调整)。 - 监控中心统计调用QPS、耗时等指标。 ### 5. **SPI扩展机制** - **原理**: Dubbo通过SPI(Service Provider Interface)实现高度可扩展性,例如自定义协议、过滤器等。 ```java // 自定义Filter实现 @Activate(group = {"provider", "consumer"}) public class CustomFilter implements Filter { public Result invoke(Invoker<?> invoker, Invocation invocation) { // 前置逻辑 Result result = invoker.invoke(invocation); // 后置逻辑 return result; } } ``` ### 核心流程图 ``` +---------+ Register +-------------+ | Provider| --------------------->| Registry | +---------+ +-------------+ ^ | | Notify | Subscribe | v +---------+ Invoke +-------------+ | Consumer| <---------------------| Registry | +---------+ +-------------+ ``` **总结**:Dubbo通过注册中心解耦服务依赖,通过动态代理和网络通信实现透明化RPC,结合负载均衡和SPI机制提供高可用性和扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值