系列文章目录


文章目录



前言

分布式的消息系统

一、Kafka是什么?

Kafka是由Linkedln开发的一个分布式的消息系统,最初是用作Linkedln的活动流(Activity Stream)和运营数据处理的基础。

Kafka使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera, Apache Storm, Spark都支持Kafka集成。

综上:Kafka是一种分布式,基于发布/订阅的消息系统,能够高效并实时的吞吐数据,以及通过分布式集群及数据复制冗余机制(副本冗余机制)实现数据的安全。

二、活动数据流是什么?

活动数据流包括页面访问量(Page View),被查看内容方面的信息以及搜索情况等内容。这种数据通常的处理方式是先把各种活动那个以及日志的形式写入某种文件,然后周期性的对这些文件进行统计分析。

三、运营数据是什么?

运营数据指的是服务器的性能数据(CPU,IO使用率,请求时间,服务日志等等数据)。运营数据的统计方法种类繁多。

四、常用LMassage Queue对比

1.RabbitMQ

RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP XMPP SMTP STOMP 正因为如此,他非常重量级,更适合企业级的开发。同时实现了Broker架构,这意味着消息在发送个客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。

2.Redis

Redis是一个基于Key-Value对的NoSQL数据库,开发维护很活跃。虽然他是一个Key-Value数据库存储系统,但他本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。

3.ZeroMQ

ZeroMQ号称最快的消息队列系统,尤其是针对大吞吐量的需求场景。ZeroMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。但是ZeroMQ仅提供非持久性的队列,也就是说如果宕机,数据将会丢失。其中,,Twitter的Storm 0.9.0以前的版本汇中默认使用ZeroMQ作为数据流的传输(Storm从0.9版本开始同时支持ZeroMQ和Netty(NIO)作为传输模块)

4.ActiveMQ

ActiveMQ是Apache下的一个子项目。类似于ZeroMQ.它能够代理任何点对点的技术实现队列。同时类似于RabbitMQ。他少量代码就可以高效地实现高级应用场景。

五.使用场景

Messaging

对于一些常规的消息系统。kafka是个不错的选择;partitons/replication和容错,可以使kafka具有良好的扩展性和性能优势,不过到目前为止,我们应该很清楚认识到,kafka并没有提供JMS中的“事务性”消息传输担保(消息确认机制)“”消息分组“等企业级特性;kafka只能使用作为”常规“的消息系统,在一定程度上。尚未确保消息的发送与接收绝对可靠(比如,消息重发,消息发送丢失等)。

Website activity tracking

kafka可以作为”网站活性跟踪“的最佳工具,可以将网页/用户操作等信息发送给kafka中,并实时监控,或者离线统计分析等

Metric

kfaka通常被用于可操作的监控数据。这包括从分布式应用程序来的聚合统计用来生产集中的运营数据提要。

Log Aggregatio

kafka的特性决定它非常适合作为”日志收集中心“;application可以将操作日志”批量“”异步“的发送到kafka集群中,而不是保存在本地或者DB中;kafka可以批量提交信息/压缩消息等,这对producer端而言,机会感觉不到性能的开支,此时consumer端可以使hadoop等其他系统化的存储和分析系统。

六.kafka架构

1.producer

消息生产者,发布消息到kafka集群的终端或服务/

2.broker

kafka集群中包含的服务器。broker(经纪人,消费转发服务)

3.topic

每条发布到kafka集群的消息属于的类别,即kafka是面向topic的。

4.partition

partition是物理上的概念,每个topic包含一个或多个partition。卡夫卡分配的单位是partition。

5.consumer

从kafka集群中消费信息的终端或服务

6.Consumer group

high-level consumer API中,每个 consumer 都属于一个 consumer group。每条消息只能被 consumer group中的一个 Consumer 消费,但是可以被多个consumer group 消费。(即组件数据是共享的,组内数据是竞争的)

7.replica

partition 的副本,保障partition 的高可用。

8.leader

replica中的一个角色,producer和 consumer只跟leader交互。

9.follower

replica中的一个角色,从leader中复制数据。

10.controller

kafka集群中的其中一个服务器,用来进行 leader election 以及 各种failover。

11.zookeeper

kafka通过zookeeper来存储集群的 meta 信息。

七.kafka消息流处理

流程说明

1.producer 先从 zookeeper 的 ”/brokers/…/state“节点找到改 partition 的leader

2.produce r将消息发送给 leader

3.leader 将消息写入本地

4.followers 从 leader pull 消息,写入本地log 后 leader发送到 ACK

5.leader 收到所有 lSR 中的replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset)并向 producer 发送 ACK(lSR指的是:比如有三个副本,编号是1 2 3 ,其中2是Leader 1 3是Follower。假设在数据同步过程中。1跟上Leader,但是3出现故障或美没有及时同步,则12是一个ISR成成员,后期在Leder选举时,会用到lSR机制,会优先从lSR中选择Leader)