Xiaomi Galaxy Talos Book

Talos基本概念


talos architecture

基本概念

如图是Talos的架构图,Producer持续地生产消息并发送给指定Topic,Consumer从Topic中读取消息进行消费;Topic中的消息分布在不同的Partition里。

Topic & Partition

Topic即逻辑上的消息队列,由一个或多个partition组成;partition的个数决定了Topic的最大并发度;

Topic创建时需要指定partition的个数,Topic创建后partition只能增加不能减少。

【注】:Partition个数的指定,请用户参照如下的标准来设置,每个partition允许最大512K/s的写,最大1M/s的读,请用户根据业务的数据量来合理设置partition个数;

TopicName & TopicTalosResourceName
  • TopicName即Topic的名字,创建时指定,某一时刻系统中相同TopicName的Topic只能有一个。

  • TopicTalosResourceName是Topic创建后的唯一标识,请用户注意,创建一个topic,然后删除,再创建一个同名topic,它们的TopicTalosResourceName是不同的

  • Topic创建后,后续的读写操作都使用TopicTalosResourceName作为唯一标识。

  • TopicTalosResourceName的组成格式:developerId#topicName#UUID

TalosAdmin

TalosAdmin是Talos的数据控制接口,用来进行Topic的创建/删除等DDL操作,详细信息参考TalosAdmin API

SimpleProducer

SimpleProducer是发送数据的同步接口,每个SimpleProducer只对应一个partition,详细信息可参见SimpleProducer API

SimpleConsumer

SimpleConsumer是消费数据的同步接口,每个SimpleConsumer只对应一个partition,详细信息可参见SimpleConsumer API

【注】:SimpleProducer和SimpleConsumer是Talos提供数据读写的低阶API,它们都是以同步的方式发送/读取数据;与之相对应的,Talos也提供了一套高阶API,即TalosProducer和TalosConsumer,它们都是以异步的方式发送/读取数据。

TalosProducer

TalosProducer是发送数据的高阶API,它会根据Topic的partition个数构造相应数目的线程发送数据,每个线程会有一个队列用来缓存用户数据;TalosProducer采用异步方式,支持用户注册回调来处理发送消息的结果;

关键点

  • PartitionKey

如果用户在Message中指定PartitionKey,则TalosProducer会将PartitionKey映射成一个32位正整数,然后根据这个整数分配到相应的partition

如果用户在Message中没有指定PartitionKey,则TalosProducer会为Message随机指定一个partitionId,指定partitionId的策略是可configurable的,具体可以参见TalosProducer API与配置中可选配置项的场景4

  • Buffer

如上所述,TalosProducer是异步方式,会将用户的消息缓存在队列中,需要注意的是,如果client进程挂掉,buffer中的数据是会丢失的,请使用高阶API的用户知悉;

TalosConsumer

TalosConsumer是消费数据的高阶API,它会自动进行Re-Balancer;自动进行消息的Commit,用户也可以通过配置自己控制消息的commit;关于TalosConsumer有一些关键概念需要清楚,具体如下:

  • TalosConsumer & ConsumerGroup

每个TalosConsumer属于一个特定的consumer group,初始化的时候会指定ConsumerGroup的名字,需要注意的是,某个Topic的某个partition同一时刻只能被同一consumer group内的一个consumer消费,但多个consumer group可同时消费这个partition

consuemr group

如图所示,partition 1正在被consumer group A中的Consumer-1消费,那么consumer group A中的Consumer-2就无法消费partition 1;而图右边所示,partition 1可以同时被consumer group A中的Consumer-1consumer group B中的Consumer-1消费。

  • Re-Balancer

Re-Balance的意思是TalosConsumer会根据用户启动的实例个数来自动分配对Topic partition的消费,如果TalosConsumer实例个数发生变化时,即出现TalosConsumer的上下线,它会自动感知,并对Partition的分配进行重新计算;

consueming

如图所示,开始时只有一个TalosConsumer-1进程,该Topic的5个partition全部被TalosConsumer-1消费,当用户又启动了另一个相同consumer group的consumer实例,即TalosConsumer-2上线后,TalosConsumer-1会自动感知到TalosConsumer-2的上线,并通过算法释放出2个partition,TalosConsumer-2会接手消费被TalosConsumer-1释放的2个partition;

关于TalosConsumer的详细介绍以及如何自己控制消息的commit逻辑请参考TalosConsumer API