kafka是什么?
Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目。
Kafka最初是由LinkedIn开发,并于2011年初开源。
该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。
Kafka是一个分布式消息队列:具有生产者、消费者的功能。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。
Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。
kafka依赖于zookeeper集群保存元数据信息,来保证系统可用性。
注:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
消息队列的作用
消息队列的核心作用是:
解耦,异步和并行
以用户注册的案列来说明: #### 用户注册的一般流程 ![在这里插入图片描述](https://img-blog.csdn.net/20181002132647519?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ZlbmdnbXM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 问题:随着后端流程越来越多,每步流程都需要额外的耗费很多时间,从而会导致用户更长的等待延迟。 #### 用户注册的并行执行 ![在这里插入图片描述](https://img-blog.csdn.net/20181002132742229?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ZlbmdnbXM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
问题:系统并行的发起了4个请求,4个请求中,如果某一个环节执行2分钟,其他环节再快,用户也需要等待2分钟。如果其中一个环节异常之后,整个服务便异常。
用户注册的最终一致
保证主流程的正常执行、执行成功之后,发送消息出去。
需要这个destination的其他系统通过消费数据再执行,最终一致。
kafka与传统消息系统的区别
kafka与activeMQ的对比:
1、 activeMQ是一个标准的JMS的实现,kafka不是JMS的实现。
2、 activeMQ当中的消费者,订阅某一类主题之后,等着服务端把消息给推送过来,kafka当中是消费者主动去拉取消息
3、 activeMQ当中可以有事务的保证,kakfa当中没有
4、 activeMQ当中的消息消费结束后就不存在了,kafka当中的消息都是保存在磁盘当中
5、 kafka当中采用的是zookeeper保存一些topic,以及一些其他的元数据信息
kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。
kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。
在可用性方面,kafka的broker支持主备模式。
在集群负载均衡方面,kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。