吐槽语:
17年初的时候听说了Kafka这个东西,传闻甚巨,传其有神鬼莫测之性能,于是抱着站在巨人肩膀上的态度开始虚心钻研,从此就踏上了一条踩巨人肩膀的坑之不归路。。。
初时,花了两天时间查阅了Kafka相关资料,胸有成竹之际从官网下载了最新的Kafka和最新的zookeeper,想搭建一个环境来测试一二。按照网上的教程一步一步,摩擦摩擦,结果biu的一下就搭建好了,so easy?! 遂开始着手写代码,千辛万苦终于找到了librdkafka这个用c语言封装的对Kafka客户端的使用库,OK,源码下载下来开始看,哎哟不错哟,竟然有对c++的封装,照着示例代码稀里糊涂一顿封装,终于封装出两个自己的c++类,一个Producer类,一个Consumer类。然后竟然就这么很简单很顺利的用起来了!what?这比我以前用的那些消息中间件都要容易百倍啊有木有!
但是,俗话说,凡事不要高兴的太早。。太早。。早。。。。
一.Kafka基础知识普及
研究kafka首先要搞清楚它到底是什么,能做什么事。官方定义如下:
Apache Kafka® is a distributed streaming platform. What exactly does that mean?
翻译过来就是:Apache Kafka®是一个分布式流媒体平台。这到底是个什么鬼呢?
具体是什么鬼,官方及非官方原理概念讲解一大堆,一抄二,二抄三,三抄万物,万物生太极。。咳咳,言归正传。
经过我潜心研究,给出如下定义:
kafka是一个消息队列。是为了分离业务,解耦合,面向微服务吹牛比的分布式消息队列。
还是有点懵怎么办,从代码角度看,在线程与线程之间传递数据时,我们惯用的屡试不爽的手法是通过一个线程安全的数据队列(list<some_data>)来进行线程间的数据交互。那进程与进程之间数据交互怎么办,通俗的方法一大堆。更大一点说,我一个web端的数据跟我另一台机器上的c++服务进行数据交互咋办呢。kafka就可以充当任意两者之间的数据队列,而且分布式的。
客户端1(web或者其它任意产生数据的端)--->kafka服务端---->客户端2(c++服务或者其它任意需要数据的端)
这就是
kafka所充当的角色了,任意多个
客户端1,和任意多个
客户端2,都通过socket与kafka
服务端进行数据交互。所以,这也就是我们使用
kafka为啥要先搭建一个kafka服务(集群)的原因,实际上就是运行了一个socket的Server端程序,其它管你什么端都是通过kafka这个服务端来进行数据交互的。而我们使用封装好的客户端库(python库,java库,c/c++库)实际上就是写了一个socket的Client端程序而已。
有了上面的概念之后,那zookeeper又是捣什么乱的呢,想一想,我们在线程之间数据交互需要加一把锁还有其他互斥量信号量之类的东西来保证数据的线程安全性,分布式系统里没有锁,信号量,互斥量怎么办,牛逼的人们于是就搞出了zookeeper这个东西来充当这些角色。zookeeper的功能(
配置管理,名字服务,提供分布式同步以及集群管理)。
所以就一句话,kafka这个分布式集群管理乱七八糟的数据客户端,zookeeper负责管理kafka这个分布式集群。
二.kafka的生产和消费机制
幼时懵懵懂懂之际,