分布式消息队列

时光总嘲笑我的痴心妄想 提交于 2020-03-13 03:30:56

分布式消息队列

kafka介绍

基本架构

  Kafka是开源的分布式消息队列,能够轻松实现高吞吐、可扩展、高可用,并且部署简单快速、开发接口丰富。

kafka分布式消息队列的作用:

  • 解耦:将消息生产阶段和处理阶段拆分开,两个阶段互相独立各自实现自己的处理逻辑,通过kafka提供的消息写入和消费接口实现对消息的连接处理。降低开发复杂度,提高系统稳定性。
  • 高吞吐量:kafka通过顺序读写磁盘提供可以和内存随机读写相匹敌的读写速度,灵活的客户端API设计,利用Linux操作系统提供的“零拷贝”特性减少消息网络传输时间,提供端到端的消息压缩传输,对同一主题下的消息采用分区存储,kafka通过诸多良好的特性利用廉价的机器就可以轻松实现高吞吐率。
  • 高容错、高可用:kafka允许用户对分区配置多副本,kafka将副本均匀分配到各个broker存储,保证同一个分区的副本不会再同一台机器上存储(集群模式下),多副本之间采用Leader-Follower机制同步消息,只有Leader对外提供读写服务,当Leader以外失败、Broker进程关闭、服务宕机等情况导致数据不可用时,kafka会从Follwer中选择一个Leader继续提供读写服务。
  • 可扩展:理论上kafka的性能随着Broker的增多而增加,增加一个Broker只需要为新增加的Broker设置一个唯一编号,编写好配置文件后,kafka通过zookeeper就能发现新的Broker。
  • 峰值处理:例如秒杀系统、双十一等促销活动的爆发几种支付系统、推荐系统等都需要消息队列的介入,这类系统在某个时间点数据会爆发式增长,后台处理系统不能够及时处理峰值请求,如果没有消息队列的接入就会造成后台系统处理不及时,请求数据严重挤压,如此恶性循环最终导致系统崩溃。kafka的接入能够使数据进行冗余存储,并保证消息顺序读写,相当于给系统接入一个大的缓冲区,既能够接收持续暴增的的请求,又能根据后台系统的处理能力提供数据服务,进而提高各业务系统的峰值处理能力。

kafka相关名词解析

  • Broker:启动kafka的一个实例就是一个Broker,默认端口9092。一个kafka集群可以启动多个Broker同时对外提供服务,Broker不保存任何producer和consumer相关的信息。
  • Topic:主题,kafka中同一种类型数据集的名称,相当于数据库中的表,producer将同一类型的数据写入同一个topic下,consumer从同一个topic消费同一类型的数据。逻辑上同一数据集只有一个topic,如果设置一个topic有多个partition和多个replication,在物理机上同一个topic下的数据集会被分成多份存储到不同的物理机上。
  • Partition:分区,一个topic可以设置多个分区,相当于把一个数据集分成多份分别放到不同的分区中存储。一个topic可以有一个或者多个分区,在创建topic的时候可以设置topic的Partition数,如果不设置默认为1。理论上Partition数越多,系统的整体吞吐率就越高,但是在实际应用中并不是Partition越多越好,反而过多的Partition在broker宕机需要重新对Partition选主,在这个过程中耗时太久会导致Partition暂时无法提供服务,造成写入消息失败。分区命名规则是topicname-index。
  • Segment:段文件,kafka中最小数据存储单位,kafka可以存储多个topic,各个topic之间隔离没有影响,一个topic包含一个或者多个Partition,每个Partition在物理结构上是一个文件夹,文件夹名称以topic名称加Partition索引的方式命名,一个Partition包含多个segment,每个segment以message在Partition中的其实偏移量命名以log结尾的文件,productor想topic中发布消息会被顺序写入对应的segment文件中。kafka为了提高写入和查询速度,在Partition文件夹下每个segment log文件都有一个同名的索引文件,索引文件以index结尾。
  • Offset:消息在分区中的偏移量,用来在分区中唯一地表示这个消息。
  • Replication:副本,一个Partition可以设置一个或者多个副本,副本主要保证系统能够持续不丢失地对外提供服务。在创建topic的时候可以设置Partition的replication数。
  • Producer:消息生产者,负责向kafka中发布消息。
  • Consumer Group:消费者所属组,一个Consumer Group可以包含一个或者多个consumer,当一个topic被一个Consumer Group消费的时候,Consumer Group内只能有一个consumer消费同一条消息,不会出现Consumer Group中多个consumer同时消费一条消息造成一个消息被Consumer Group消费多次的情况。
  • Consumer:消息消费者,consumer从kafka指定的主题中拉取消息,如果一个topic有多个分区,kafka只能保证一个分区内消息的有序性,在不同的分区之间无法保证。
  • zookeeper:zookeeper在kafka集群中主要用于协调管理,kafka将元数据信息保存在zookeeper中,通过zookeeper协调管理来实现整个kafka集群的动态扩展、各个Broker负载均衡、Productor通过zookeeper感知Partition的Leader、Consumer消费的负载均衡并可以保存Consumer消费的状态信息,kafka0.9版本之前Consumer消费信息的偏移量记录在zookeeper中,0.9版本之后则由kafka自己维护Consumer消费消息的偏移量。

    高吞吐的实现

      kafka通过顺序读写磁盘提供可以和内存随机读写相匹敌的读写速度,使用“sendfile”技术实现“零拷贝”减少消息网络传输时间,通过对客户端的优化设计提高消息发布和订阅的性能,对同一主题下的消息采用多分区存储,kafka通过诸多良好的特性利用廉价的机器就可以轻松实现高吞吐率。

    kafka配置参数详解

    Broker配置参数

  • broker.id:broker的唯一标识,不同broker的值必须不同。
  • host.name:绑定的主机名称或IP。
  • port:监听端口。
  • auto.create.topics.enable:是否自动创建topic,默认值为true。
  • auto.leader.reblalance.enable:是否启动Leader自动平衡,如果设置为true,将会有一个后台线程定期检查是否需要触发leader平衡操作,默认值为true。
  • leader.imbalance.check.interval.seconds:检查分区是否平衡的时间间隔,默认值300秒。
  • leader.imbalance.per.broker.percentage:每个broker允许的不平衡Leader的百分比,超过该值则会触发Leader重新平衡,默认值为10。
  • compression.type:设置topic压缩格式,目前支持gzip、snappy、lz4压缩格式。
  • background.threads:后台处理任务线程数,默认值为8。
  • delete.topic.enable:是否启动删除主题功能,如果设置为true开启功能,则使用kafka管理工具就可以删除主题。默认值为false。
  • log.dir:日志数据保存目录。
  • log.retention.bytes:每个分区最大文件大小。
  • log.retention.hours:数据保存时长,超时文件会被删除。
  • socket.send.buffer.bytes:socket发送缓冲区大小。
  • socket.receive.buffer.bytes:socket最大请求大小。
  • zookeeper.connection.timeout.ms:客户端与zookeeper连接的超时时间。
  • zookeeper.session.timeout.ms:zookeeper最大超时时间。
  • log.segment.bytes:Segment文件大小。
  • replica.fetch.wait.max.ms:副本Follower与leader之间通信同步消息的超时时间。
  • replica.lag.time.max.ms:如果Follower没有向Leader发送同步消息请求的时间或者Follower一直没有同步到Leader最后一条消息的时间超过了该项配置的时间,则改Follower将会被移除出ISR。
    更多kafka相关信息请看新书Kafka技术内幕

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!