为什么你要使用这么强大的分布式消息中间件——kafka

为什么是kafka?

在我们大量使用分布式数据库、分布式计算集群的时候,是否会遇到这样的一些问题:

  1. 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位
  2. 我想对用户的搜索关键词进行统计,分析出当前的流行趋势
  3. 有些数据,存储数据库浪费,直接存储硬盘效率又低

这些场景都有一个共同点: 数据是由上游模块产生,上游模块,使用上游模块的数据计算、统计、分析,这个时候就可以使用消息系统,尤其是分布式消息系统!

知道了我们有必要在数据处理系统中使用一个消息系统,但是我们为什么一定要选kafka呢?现在的消息系统可不只有kafka。

话说阿里中间件团队和LinkedIn团队都做了一个Kafka、RabbitMQ、RocketMQ的三者对比。这边就不献丑了,实际结果可以参考以下两篇博文:

阿里测试:http://jm.taobao.org/2016/04/01/kafka-vs-rabbitmq-vs-rocketmq-message-send-performance/

LinkedIn测试:https://blog.csdn.net/SJF0115/article/details/78480433

Kafka简介

Kafka是Linkedin于2010年12月份创建的开源消息系统,它主要用于处理活跃的流式数据。活跃的流式数据在web网站应用中非常常见,这些活动数据包括页面访问量(Page View)、被查看内容方面的信息以及搜索情况等内容。 这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计分析。

传统的日志分析系统是一种离线处理日志信息的方式,但若要进行实时处理,通常会有较大延迟。而现有的消息队列系统能够很好的处理实时或者近似实时的应用,但未处理的数据通常不会写到磁盘上,这对于Hadoop之类,间隔时间较长的离线应用而言,在数据安全上会出现问题。Kafka正是为了解决以上问题而设计的,它能够很好地进行离线和在线应用。

kafka部署结构

消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。其主要用途:不同进程Process/线程Thread之间通信。

几大特性

  • 高吞吐量:可以满足每秒百万级别消息的生产和消费——生产消费。
  • 负载均衡:通过zookeeper对Producer,Broker,Consumer的动态加入与离开进行管理。
  • 拉取系统:由于kafka broker会持久化数据,broker没有内存压力,因此,consumer非常适合采取pull的方式消费数据
  • 动态扩展:当需要增加broker结点时,新增的broker会向zookeeper注册,而producer及consumer会通过zookeeper感知这些变化,并及时作出调整。
  • 消息删除策略:数据文件将会根据broker中的配置要求,保留一定的时间之后删除。kafka通过这种简单的手段,来释放磁盘空间。

消息收发流程

  • 启动Zookeeper及Broker.
  • Producer连接Broker后,将消息发布到Broker中指定Topic上(可以指定Patition)。
  • Broker集群接收到Producer发过来的消息后,将其持久化到硬盘,并将消息该保留指定时长(可配置),而不关注消息是否被消费。
  • Consumer连接到Broker后,启动消息泵对Broker进行侦听,当有消息到来时,会触发消息泵循环获取消息,获取消息后Zookeeper将记录该Consumer的消息Offset。

Kafka服务

对于kafka而言,kafka服务就像是一个大的水池。不断的生产、存储、消费着各种类别的消息。那么kafka由何组成呢?

  • Broker : Kafka消息服务器,消息中心。一个Broker可以容纳多个Topic。
  • Producer :消息生产者,就是向Kafka broker发消息的客户端。
  • Consumer :消息消费者,向Kafka broker取消息的客户端。
  • Zookeeper :管理Producer,Broker,Consumer的动态加入与离开。
  • Topic :可以为各种消息划分为多个不同的主题,Topic就是主题名称。Producer可以针对某个主题进行生产,Consumer可以针对某个主题进行订阅。
  • Consumer Group: Kafka采用广播的方式进行消息分发,而Consumer集群在消费某Topic时, Zookeeper会为该集群建立Offset消费偏移量,最新Consumer加入并消费该主题时,可以从最新的Offset点开始消费。
  • Partition:Kafka采用对数据文件切片(Partition)的方式可以将一个Topic可以分布存储到多个Broker上,一个Topic可以分为多个Partition。在多个Consumer并发访问一个partition会有同步锁控制。

有的时候,不光是灯红酒绿的世界可以让人沉迷,技术的世界也同样如此。而且有的时候,技术的世界比前者更加可怕,它不但能让你悄无声息的陷入进去,还能让你产生一种你很上进,你很努力的假象,以至于等到你恍然大悟那天,已经悔之晚矣。

未来Kafka中间件

目前该中间件只完成了初级阶段功能,很多功能都不完善不深入,随着应用业务的拓展及Kafka未来版本功能支持。以Kafka消息中间件为中心的大数据处理平台还有很多任务去实现。

一般在互联网中所流动的数据由以下几种类型:

  • 需要实时响应的交易数据,用户提交一个表单,输入一段内容,这种数据最后是存放在关系数据库(Oracle, MySQL)中的,有些需要事务支持。
  • 活动流数据,准实时的,例如页面访问量、用户行为、搜索情况等。我们可以针对这些数据广播、排序、个性化推荐、运营监控等。这种数据一般是前端服务器先写文件,然后通过批量的方式把文件倒到Hadoop(离线数据分析平台)这种大数据分析器里面,进行慢慢的分析。
  • 各个层面程序产生的日志,例如http的日志、tomcat的日志、其他各种程序产生的日志。这种数据一个是用来监控报警,还有就是用来做分析。

原文发布于微信公众号 - JAVA高级架构(gaojijiagou)

原文发表时间:2018-11-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 开发者

Android Oreo 常见问题 4.0|Android 开发者 FAQ Vol. 12

25150
来自专栏

集装箱时代的分布式记录(第二部分)

欢迎回到我们的系列。在第一部分中,我们谈到了微服务和容器的最近兴起。我们介绍了这种类型的体系结构引起的日志记录问题以及可能的解决方案 - 聚合。现在我们已经完成...

18580
来自专栏WeTest质量开放平台团队的专栏

谷歌大开“吃”戒的产物,Andriod O全球发布

2017年3月26日,谷歌默默的发布了下一代OS的第一个开发者预览版:Android O,毫无悬念这应该就是安卓8.0了!发布之后,用户纷纷表示:我7.0都没升...

9420
来自专栏CSDN技术头条

Ansible 2.1支持Microsoft Azure和Docker

Ansible自动化框架的第2个版本添加了Microsoft Azure和Docker容器管理功能,从此不再只是一个Red Hat支持工具。 当年Red Hat...

22050
来自专栏DevOps时代的专栏

大型分布式团队的集中化持续交付

持续集成是一种软件开发实践,即团队开发成员集成他们的工作,通常每个成员每天至少集成一次,随着对自动化要求的不断提高,需要自动化构建来完成的应用也越来越多,此问题...

10110
来自专栏菩提树下的杨过

ActiveMQ笔记(4):搭建Broker集群(cluster)

上一篇介绍了基于Networks of Borkers的2节点HA方案,这一篇继续来折腾Networks of Brokers,当应用规模日渐增长时,2节点的b...

27490
来自专栏腾讯技术工程官方号的专栏

【TEGer 在全球架构师峰会】 : 腾讯企业级消息中间件 CMQ 技术解密

本文将对腾讯 TEG 基础架构部中间件团队研发的企业级消息中间件 CMQ 原理进行分享介绍。

40290
来自专栏Debian社区

Debian已着手部署补丁:修复WPA2安全漏洞

昨天最令人感到惊讶和担忧的就是,服役超过13年的WPA2加密协议已经被攻破,意味着在你家或办公室 Wi-Fi 物理覆盖范围内的攻击者,都可以向破解并发动入侵,监...

11130
来自专栏王亚昌的专栏

分布式消息队列浅析

队列作为一种比较抽象的数据结构,在程序世界中被广泛的应用,而实现方式和形态也各式各样,有使用进程内堆栈实现的,如stl库中的queue;有基于管道、Shmem实...

23930
来自专栏Spark学习技巧

开源消息中间件Kafka在华泰证券的探索与实践

32530

扫码关注云+社区

领取腾讯云代金券