最近闲来无事,搜集一些消息架构方面的资料进行学习,偶然在一个站点发现Kafka还是不错的,故想按着自己研究、学习的经历,写下一篇日记,以便后续在工作中可以 Ctrl + C & Ctrl + V , 嘿嘿

Kafak是谁?

Kafka源自LinkIn,主要支撑分布式日志服务,主要开发语言是Scala+少量的Java,设计目标是一种基于集群可处理流式数据的消息分布式系统,后开源交付给Apache基金会进行维护,目前是该基金会的顶级项目之一,当然还有一款大名鼎鼎消息系统ActiveMQ目前也是Apache基金会进行维护,后续在学习中会逐渐对两款消息机制进行对比

Apache对Kafka的定位

1. Publish & Subscribe (发布&订阅)

Kafka是一种基于发布&订阅(也有称为生产/消费模型)架构的一种消息机制,目前需要大吞吐量的架构大多基于消息机制。

2. Process (数据处理)

Kafka可高效的处理流式数据,并且可以进行实时处理

3. Store (存储)

Kafka的消息数据存储是基于自身一种叫 Isr 的东西来进行安全可靠的分布式存储

快速开始使用Kafka

1. 下载Kafka服务器端

目前Kafka最新版本是0.10.1.0,但坊间流传0.8.x系列才是最为流行的,原因是当时由于storm的流行,造就了目前的Kafka(当然你需要Linux系统来玩Kafka,我用的是Oracle VM VirtualBox)

http://kafka.apache.org/downloads

有多个版本可以(自行)进行选择

wget http://mirror.bit.edu.cn/apache/kafka/0.10.1.0/kafka_2.10-0.10.1.0.tgz

如果你这里没有wget工具的话,可以通过yum进行安装

yum install wget

解压

tar -zxvf kafka_2.10-0.10.1.0.tgz 

将Kafka移动到本地用户目录下面

mv kafka_2.10-0.10.1.0 /usr/local/

看一下Kafka里面有什么东西

[root@localhost kafka_2.10-0.10.1.0]# ls
bin  config  libs  LICENSE  NOTICE  site-docs

通过长期对Apache的东西使用,看名字也应该知道目录大概的用途(其实懂计算机的都应该知道)

bin:提供一些写好的脚本文件,用于管理、测试服务器

config:肯定是一堆相关的配置文件

libs:一对libs(依赖)

LICENSE:许可文件说明(开源不等于随便免费使用,各位开发者请注意一下版权)

NOTICE:没什么用的一些内容

site-docs:里面有一个 kafka_2.10-0.10.1.0-site-docs.tgz 压缩包,应该是使用手册的本地版本(API说明之类的)

2. 启动服务器(你没看错、就是这么简单..)

当然Kafka是依赖于zookeeper的(当年面试只知道是动物园管理员 :D),所以需要先启动zookeeper,由于kafka高度依赖zookeeper(目前基本算一个分布式JDNI实现),所以kafka压缩包内自带了一个简易版的zokeeper,使用下便命令启动(前提条件是服务器需要jvm支持,可以安装JDK解决)

bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

zookeeper-server-start.sh 脚本的参数如下:

[root@localhost kafka_2.10-0.10.1.0]# bin/zookeeper-server-start.sh
USAGE: bin/zookeeper-server-start.sh [-daemon] zookeeper.properties

-daemon:后台值守模式?(静默模式)反正就是后台启动,需要看到输出的同学可以不加这个参数

zookeeper.properties:properties当然是配置文件,通常会放在config目录下面

验证一下是否启动成功(lsof 也可以直接 yum install lsof)

[root@localhost kafka_2.10-0.10.1.0]# lsof -i:2181
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2236 root   83u  IPv6  19048      0t0  TCP *:eforward (LISTEN)

如果2181端口处于 LISTEN 状态的话,基本说明zookeeper已经启动完毕了,接下来就可以启动kafka服务器了,脚本看名字就知道是这个,看一下参数,大体和zookeeper一样

[root@localhost kafka_2.10-0.10.1.0]# bin/kafka-server-start.sh
USAGE: bin/kafka-server-start.sh [-daemon] server.properties [--override property=value]*

启动之

bin/kafka-server-start.sh -daemon config/server.properties

查看一下启动情况,(kafka默认服务端口是9092,可以通过看server.properties知道-当然也可以修改)

[root@localhost kafka_2.10-0.10.1.0]# lsof -i:9092
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2468 root   97u  IPv6  19365      0t0  TCP *:XmlIpcRegSvc (LISTEN)
java    2468 root  101u  IPv6  19367      0t0  TCP localhost:47108->localhost:XmlIpcRegSvc (ESTABLISHED)
java    2468 root  102u  IPv6  19368      0t0  TCP localhost:XmlIpcRegSvc->localhost:47108 (ESTABLISHED)
[root@localhost kafka_2.10-0.10.1.0]# lsof -i:2181
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2236 root   83u  IPv6  19048      0t0  TCP *:eforward (LISTEN)
java    2236 root   84u  IPv6  19360      0t0  TCP localhost:eforward->localhost:59873 (ESTABLISHED)
java    2468 root   82u  IPv6  19357      0t0  TCP localhost:59873->localhost:eforward (ESTABLISHED)

如果9092处于LISTEN,说明kafka(单机版)已经可以工作了

3. 创建一个 topic

topic 是一个话题,如果从rpc架构理解有点像接口名,通过kafka-topics.sh这个脚本就可以创建topic了,直接运行可以看到帮助

[root@localhost kafka_2.10-0.10.1.0]# bin/kafka-topics.sh
Create, delete, describe, or change a topic.
Option                                   Description
------                                   -----------
--alter                                  Alter the number of partitions,        replica assignment, and/or           configuration for the topic.
--config <name=value>                    A topic configuration override for the topic being created or altered.The   following is a list of valid         configurations:                      cleanup.policy                        compression.type                      delete.retention.ms                   file.delete.delay.ms                  flush.messages                        flush.ms                              follower.replication.throttled.       replicas                             index.interval.bytes                  leader.replication.throttled.replicas max.message.bytes                     message.format.version                message.timestamp.difference.max.ms   message.timestamp.type                min.cleanable.dirty.ratio             min.compaction.lag.ms                 min.insync.replicas                   preallocate                           retention.bytes                       retention.ms                          segment.bytes                         segment.index.bytes                   segment.jitter.ms                     segment.ms                            unclean.leader.election.enable      See the Kafka documentation for full   details on the topic configs.
--create                                 Create a new topic.
--delete                                 Delete a topic
--delete-config <name>                   A topic configuration override to be   removed for an existing topic (see   the list of configurations under the --config option).
--describe                               List details for the given topics.
--disable-rack-aware                     Disable rack aware replica assignment
--force                                  Suppress console prompts
--help                                   Print usage information.
--if-exists                              if set when altering or deleting       topics, the action will only execute if the topic exists
--if-not-exists                          if set when creating topics, the       action will only execute if the      topic does not already exist
--list                                   List all available topics.
--partitions <Integer: # of partitions>  The number of partitions for the topic being created or altered (WARNING:   If partitions are increased for a    topic that has a key, the partition  logic or ordering of the messages    will be affected
--replica-assignment                     A list of manual partition-to-broker   <broker_id_for_part1_replica1 :          assignments for the topic being      broker_id_for_part1_replica2 ,           created or altered.                  broker_id_for_part2_replica1 :                                                broker_id_for_part2_replica2 , ...>
--replication-factor <Integer:           The replication factor for each        replication factor>                      partition in the topic being created.
--topic <topic>                          The topic to be create, alter or       describe. Can also accept a regular  expression except for --create option
--topics-with-overrides                  if set when describing topics, only    show topics that have overridden     configs
--unavailable-partitions                 if set when describing topics, only    show partitions whose leader is not  available
--under-replicated-partitions            if set when describing topics, only    show under replicated partitions
--zookeeper <urls>                       REQUIRED: The connection string for    the zookeeper connection in the form host:port. Multiple URLS can be      given to allow fail-over.           

咱们使用如下命令创建一个测试的topic

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

创建的时候需要指定 zookeeper 集群的地址,--topice是指定名字test

如果没错会显示 Created topic "test". 说明创建成功

可以通过如下命令验证

[root@localhost kafka_2.10-0.10.1.0]# bin/kafka-topics.sh --zookeeper localhost:2181 --describe
Topic:test      PartitionCount:1        ReplicationFactor:1     Configs:Topic: test     Partition: 0    Leader: 0       Replicas: 0     Isr: 0

可以看到test topic已经创建成功

4. 通过Kafka发送消息

kafka提供命令行输入脚本来测试服务器是否工作正常,可以使用如下命令进行发送(同样方式查看帮助)

[root@localhost kafka_2.10-0.10.1.0]# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
kafka is cool

--broker-list:指定kafka服务器的信息

5. 接收信息

可以启动一个consumer(消费者,消息接收、处理者)来接收刚才producer(生产者,消息发送者)的消息

[root@localhost kafka_2.10-0.10.1.0]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
kafka is cool

--bootstrap-server:指定kafka服务器配置

--from-beginning:说明接收所有消息(从开始起)

终于可以开心的玩耍了

为什么要用消息中间件?

1. 解耦

其实很多架构及编程思想都是解决解耦的问题的,其实这个思想我自认为应该来自与工业制造,假设一台汽车如果没有合理的对发动机、地盘等结构进行解耦,估计是没有办法进行独立生产,然后进行组装的,把这种思想用于软件开发、架构设计里其实是一样的,目的就是让各个零部件(组件)可以单独开发(生产),然后进行拼转,当然如果符合某种制式(标准)的组件是可以随意更换的(其实就是接口的用途)

2. 冗余

电子电路的发明,以及替代了很多机械结构的好处之一就是电子电路很容易做到冗余,传说F22战斗机一般的电子系统都是四路冗余,被击干坏了一部分,并不影响整体的性能(服务),当然消息系统通过制定标准的接口,也可以简单的实现冗余(所有的分布式系统都可以实现冗余好吧)

3. 扩展

说到扩展一般要求是水平扩展能力(加十台服务器即可获得十台服务器的性能),并非垂直扩展(加十台服务器可能只获得两台服务器的能力提升),当然这种水平扩展能力一般都需要无状态的组件设计(通常理解没有SESSION,或者自己封装SESSION),如果没个几百上千万的用户,还是不要劳民伤财了

4. 峰值处理能力

说道峰值处理能力(消峰),也是消息中间件在部分架构中优于RPC(远程方法调用)的原因之一,因为消息中间件可以用一个列队(内存Queue)之类的东西,把所有的业务请求缓存其中,等待业务服务器在列队中自助取用,这个列队(内存)就好比一个请求的缓冲垫,当然只要良好的监控这个内存缓冲垫(不要溢出),并且有良好的机制防止这块内存crash(崩溃),这种方法还是挺安全的,当然还是有一个另外的缺点,就是由于有这个内存的列队,很多请求处理都是异步的,是的如果你用过AJAX,你就会明白所有的业务请求都需要一个回调,同时还要处理这个回调,但JS是在浏览器运行与用户及时交互,但后台架构如果是异步+回调,同时还需要把响应反馈给前端(oh omg),还是不要劳民伤财了

5. 异步通讯

由于有这个内存,当然就可以异步通讯,如果业务没必要需要处理这么大的数据,还是不要劳民伤财了

常用的消息中间件有哪些?

1. RabbitMQ

Erlang语言,支持AMQP、XMPP、SMTP、STOMP,支持负载均衡、数据持久,支持P2P和发布/订阅

2. Redis

基于键值对的NoSql数据库(Map集合能干的事太多了,当然Map就是键值对),同时支持列队服务(据说是轻量级),消息小于10k时性能比RabbitMQ好,大于的时候会比RabbitMQ差(据传说)

3. ZeroMQ

没有服务器中间件,应用程序集成需要通过库(SDK)来集成服务器功能,很明显开发工作量亚历山大

4. ActiveMQ

Apache的又一产品线,据说是最为流行的中间件(为什么没研究它呢?见后面),实现了JMS of J2EE,支持持久化、P2P,传说支持XA事务(二段事务),这个有点牛,就是不知道性能怎么样

5. Kafka

Apache维护的产品线(顶级项目),主要是为高性能而生,据说可以做到O1的性能,宣传是下一代消息中间件(我们要研究下一代,嘿嘿),支持数据持久化、同时支持数据在线、离线处理,不支持XA事务(由于侧重点不同)

Kafka架构简介

1. Producer 生产者

一般理解生产数据的一方,有的时候也可以理解为发起请求需要服务的一方,Kafka中Producer直接访问Kafka集群,并且是数据通过push(推送)的方式,压入到Kafka的列队中,这里采用push的方式可以确保数据及时到达列队中

2. Broker 代理

topic是数据保存的名字(文件名),每一个topic对应一个Broker(Broker负责保存Topic的内容),一个Broker由多个Partition组成,每个Partition均匀分布在kafka集群之中(Partition分布于多台服务器,致使Kafka具备冗余)

3. Consumer 消费者

一般消费者指的是提供服务的一方,记录日志、处理业务逻辑之类的,Kafka的Consumer设计通过pull(拉)的方式,到Kafka集群中拉数据,这样的设计可以降低Consumer的压力(吃多少拿多少,当然降低压力)

4. Kafka 与 Zookeeper

Kafka 经历数次改版,老的版本消费者并非从Kafka集群,而是zookeeper集群中直接拿数据,新版本已经修复这个设计问题

结后语

通过对kafka的简单了解,后面就准备开始开发Producer和Consumer拉,动手写代码的感觉总是很好 :D

同时感谢 郭俊 先生的指导,他的博客 http://www.jasongj.com/

参考资料

1. http://kafka.apache.org/

转载于:https://my.oschina.net/u/2279119/blog/774700

Kafka深入浅出(一)相关推荐

  1. 自动化测试工程师_所以你想成为一名测试自动化工程师

    自动化测试工程师 I see many people and personally have several friends and acquaintances that are interested ...

  2. 学Java对一个专科生,对一个穷人来说,是一条好的出路吗?

    这个问题让我想起中午刚看的帖子考研大神,张雪峰靠"考研"发家,年收入超8位数,却对女儿说:不用考研!评论直戳人心:考研只是穷人孩子的最好的出路.那专科生能做什么才能有发展呢?咱也不 ...

  3. 值得收藏的Java 命名规范参考!

    算机运行使用二进制机器语言,不管什么编程语言,最终都是要翻译成机器语言的.编程语言使用英语表达,是路径依赖的原因,命名一定要规范,杜绝拼音(多音字伤人啊拼音有时候有歧义),一定要用英文.注释和命名是一 ...

  4. 为什么学编程的人大多数都去了深圳和北京?

    说白了,还是机会多,薪资可观,在中国600多个城市中,北京.上海.广州.深圳的经济最为发达.你知道,四大城市之中,哪个区的GDP最高吗? 答案分别是:海淀区(2020年GDP为8504.6亿元).浦东 ...

  5. 有哪些编程后找错误的心得?

    绝大部分的不良编程习惯都源于无知,而没有任何其他原因.必须一个一个的去掉这些无知.这也是那些好的编程书籍所尽力展示给我们的. 一.请确保你不会在编程的时候犯下面的这些普遍的错误: 1. 盲目拷贝代码 ...

  6. 大一计算机新生,感觉什么都学不会怎么办?

    虽然今天什么都没做,但是还是辛苦我了...刚开始难是正常现象,可以先梳理一下 计算基础基础很重要,实践为上 计算机组成与原理.数据结构.计算机网络.操作系统.编程语言 书看得越多,其实你越能找到自己的 ...

  7. Java程序员你自己的菜鸟气质霸气侧漏了吗?

    对于刚入行的程序员来说,面对各种各样的陌生配置环境和代码库,难免会手忙脚乱,尽显菜鸟本色. 但从啥都需要教的菜鸟到啥都懂的大神程序员,并不简单,这需要牺牲一根又一根宝贵的头发,直到它们肉眼可数. 那么 ...

  8. Java程序员薪资大比拼,网友:竟然达标了?

     Java程序员分几级?  不同Java程序员能拿多少钱? 根据当下各大企业招聘需求,播妞粗略的总结了一下,Java工程师通常分为6个等级:初级开发工程.中级开发工程.高级开发工程.开发组长/系统架构 ...

  9. 深入浅出kafka原理-5-kafka同步副本ISR高低水位HW

    kafka replication副本 所谓副本,通产指分布式系统中不同机器中保存相同的数据拷贝,本质就是一个只能追加写消息的提交日志 提供数据冗余.即使系统部分组件失效,系统依然能够继续运转,因而增 ...

最新文章

  1. Python 中的hash
  2. vue 固定div 滚动_vue移动端 导航吸顶(固定定位)页面滚动出现抖动
  3. java有var吗_java – Var和Var之间的区别
  4. 存储过程双层循环_别出心裁,为锂金属负极贴上“双层保护膜”!
  5. 用FRP,内网端口映射到外网,记录
  6. 从零开始刷Leetcode——数组(532.561)
  7. detours介绍与使用
  8. matlab矩阵对角线上下加减,matlab – 如何在相关矩阵中移动靠近矩阵对角线的较大值...
  9. Rayman的绝顶之路——Leetcode每日一题打卡9
  10. office基础操作
  11. linux nfs共享目录访问速度慢,linux之间共享文件夹选nfs还是选samba--
  12. 信息安全实习:实习一 古典加密算法 Swing图形化 (报告+详细代码)
  13. ECharts-中国省市地图
  14. IP地址划分、组播地址、公有IP、私有IP
  15. python安装包问题小结
  16. Python+Pycharm和 VisualStudio C++社区版使用PK及易混淆的语法问题
  17. wp7开发实例:Baby Sign Language
  18. 为什么说我学计算机是误入歧途,致贪玩的初中生:为什么别人在学习,而你却要玩,你要赶紧警醒!...
  19. crypto buuctf 权限获得第一步
  20. 2019-11-29-dotnet-代码调试方法

热门文章

  1. 常见的GC算法(GC的背景与原理)
  2. 概率论_证明_辛钦大数定律
  3. RS232和RS485概念与区别
  4. mysql 自动化运维开发_Python自动化运维开发----基础(十三)Mysql数据库基础
  5. ElasticSearch索引生命周期管理(ILM)
  6. SveletJs学习——运动动画
  7. 查看电脑已安装的cuda版本
  8. 2022-2028年全球与中国智能咖啡机行业市场前瞻与投资战略规划分析
  9. mysql8.0.15下载后怎么打开_mysql8.0.15下载安装详细教程新手必备!
  10. windows上配置深度学习(李沐-动手学深度学习)