kafka-分布式消息系统分布式消息系统
消息中间件MessageQuene
解耦且可扩展:业务复杂度的提升带来的也是耦合度的提高,消息队列在处理过程中间插入了一个隐含的、基于数据的接口
层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
冗余:有些业务在处理过程中如果失败了,数据在未进行持久化的时候就已经消失,消息队列把数据持久化直到他们被处理,
避免了数据的丢失
处理并发:大数据量访问的时候我们可以将消息放入队列中,然后在队列里面按照系统的吞吐能力来进行稳定的抽取数据并进
行业务处理。
可恢复:一部分系统出现问题,可能影响整个程序稳定,消息队列由于将数据持久化,所以在出现问题的时候可以起到一个备
份的作用,系统稳定之后可以进行数据重新消费。
送达保证:大多数消息队列都有一套自己的消息处理机制,一般分为消息处理多次,消息至少被处理一次等情况,这使得我们
处理业务减少了数据丢失情况的发生。
顺序处理:按照一定的顺序发送消息,使得消息在队列中是有序存在的,所以在消费数据的时候我们也是有序处理的(先进先
出)。
异步通信:很多时候,你不想也不需要立即处理消息。消息队列提供了异步处理机制,允许你把一个消息放入队列,但并不立
即处理它。你想向队列中放入多少消息就放多少,然后在你乐意的时候再去处理它们。
常用MQ对比
RedisMQ:Redis是基于Key-Value的NoSql数据库,本身支持MQ队列操作,是一个轻量级的队列服务,在使用Redis作为缓
存的项目中,可以优先使用RedisMQ作为消息队列进行业务处理。优点:轻量级,容易开发。缺点:数据大的时候入队速度
较慢
ActiveMQ:Apache的一个开源子项目,支持多种语言以及网络协议。优点:容易开发,并且有自带重连机制。缺点:传入文
件不方便,数据大的时候效率一般,消费失败的数据将会丢失。
Kafka:Apache的一个开源子项目,高性能大吞吐量并且能够满足跨语言平台分布式。优点:快速持久化,大吞吐量,支持
hadoop数据并行加载,可以进行离线消息处理。缺点:开发困难,配置文件复杂,开源代码较少。
Kafka元素介绍
broker:kafka搭建的集群服务器称为broker,集群中一台服务器可以搭载多个broker。
Topic:每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic。我们可以认为同一种类型的消息存到同一个topic
下,这点和Map的key值有相似之处。
Partiton:parition是物理上的概念,每个topic包含一个或多个partition,创建topic的时候可以指定partiton的数量。每一个
partition对应一个文件夹。文件夹里面存放索引文件以及数据文件。
Producer:负责发布消息到Broker中
Consumer:每个消费者属于特定的消费者组,每个消费者组只能消费一个partition的数据,多个组可以同时消费同一个
partition的数据。
Kafka的架构
一个典型的kafka集群中包含若干producer,若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高), 若
干consumer group,以及一个 Zookeeper 集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发
生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用pull模式从 broker订阅并消费消息。
Kafka处理消息的机制