kafka分布式消息队列 — 基本概念介绍
【http://www.inter12.org/archives/818】
这个应该算是之前比较火热的词了,一直没时间抽出来看看。一个新东西出来,肯定是为了解决某些问题,不然不会有它的市场。先简单看下。
官方介绍:分布式、分区、支持复制的日志提交系统
适用场景:顾名思义,特别适合用于系统日志的异步记录,对于数据稳定性、一致性、可靠性要求不高的场景,追求的是高吞吐量。非传统的MQ产品!
核心模型抽象:
topics:某种消息的高层抽象
producers:消息的生产者
consumers:消息的消费者
broker:集群中的每一个节点服务器,多个broker组成一个集群
整体结构图
topic:
1.kafka集群会将每个topic进行分区,每个分区都是一个排序且不可改变的队列,新的消息会进入队尾并分配一个唯一ID,官方称之为偏移量(offset)
2.无论消息是否被消费,集群都会保留消息,有一个配置的时间(过期时间),超过这个时间后,消息会被清除
3.消费端唯一记录的元信息就是自己在topic中的位置(offset),
4.分布式的原因:第一集群可以容纳大量的数据 第二:可以并行的处理
分布式
1.每一份数据都会复制到不同的服务器上,以便与容错处理
2.每一个topic的分区都会有一个leader,并有零个或是多个follower,所有的读写请求都会经过leader来进行分发,若是leader发生错误的话,那么就会有一个follower上位成为leader
生产者
Producers会将数据发送消息到topic,发送的目的地可以根据轮训策略或是到指定的分区策略
消费者
消息一般有两种模式,其一是队列,另一种是发布订阅。
队列:有很多消费者,每一个消费者从队列中获取其中一个数据,一个数据只被消费一次。
发布订阅模式:将一个消费广播到所有的消费者,一个数据会被消费N次。
kafka对于消费者提供了一种简单的抽象 — 消费组。每一个消费者都会有一个消费组的名称,一个消费会发布到一个topic上,同时递送到订阅了这个消息的消费组下的所有消费者。具体如下图所示:
若是所有的消费者都是相同的消费组,那么就是一个队列模式。
若是消费者有不同的组,那么就是发布订阅模式,那么消费就会递送到所有的消费者。
通过对于消费组的名称不同来区分了队列和发布订阅模式。
每一个topic都会有一定数量的消费组,每个消费组(逻辑订阅者)包含了多个消费者,这样就可以保证可伸缩性金额容错。这样订阅者就是一个集群而不是单个实例。保证单点故障问题。
在强一致性上kafka同传统的MQ也在靠近。
传统的队列是将消息按照存储时候的顺序进行发送,但是有多个消费者的时候,有可能发生到底每个消费者的顺序不一定,一是导致无法并行,二是导致消费的顺序不一致。为了解决这个问题,通常的手段是只有一个消费者来保证顺序。
针对上面两个问题,kafka有自己的解决方案。解决并行是将多个分区分别指定对应的消费者,这样就保证了并行,同时保证了消息消费的顺序,限制是消费者的数量不能多于分区数目(通过配置指定).
但是这样就只能保证一个分区中的消息是保证顺序,无法保证不同分区的消息的顺序一致性。在大多数应用场景下,这样是能满足要求的,若是你要求非常强烈的一致性话,就只能单消费者了。
一致性
1.topic接受到消息并保存到队列中,若是收到M1,M2两个消息,那么在队列中M1的偏移量会小于M2
2.消费者看到消息的顺序就是在保存到日志上的顺序
3.一个topic的复制因子是N,那么消息会被复制到N-1服务器上,保证消息的不丢失
一些常见的使用场景
1.作为消息处理系统
作用:解耦消息的生产和处理、缓存消息以缓解对于后端处理承受的压力
可以比较的类似产品是ActiveMQ or RabbitMQ.
2.网页行为记录
一个用户的行为记录的消费者一般是多个,可能是实时处理系统,也可能是离线处理系统,同时吞吐量非常的大,kafka就非常的适合
3.监控 对于一些监控数据的处理
4.日志聚合方案
这个是kafka最常用的地方,用于分散到多个地方的日志做一个聚合,以便于后续的分析处理
5.流式处理
官方的说法是也可以把kafka当做类似Strom或Samza的流式处理框架来用,至于效果如何就未知
6.事件驱动架构
这种架构风格中的候选者之一
消息框架的出现解决了很多问题,例如解耦消息的生产和处理、缓存消息以缓解对于后端处理承受的压力(提升性能.不同框架的设计决定了它的适用场景,kafka的topic分区并行设计决定了它的高吞吐量,但是不保证顺序一致性,对于feed类就不友好
其他:
1.支持批量发布
2.基于TCP协议,传输层协议,不需要任何的语义
3.有不同客户端实现
参考资料:
http://kafka.apache.org/documentation.html#introduction
http://www.zhihu.com/question/22480085
kafka分布式消息队列 — 基本概念介绍的更多相关文章
- Kafka 分布式消息队列介绍
Kafka 分布式消息队列 类似产品有JBoss.MQ 一.由Linkedln 开源,使用scala开发,有如下几个特点: (1)高吞吐 (2)分布式 (3)支持多语言客户端 (C++.Java) 二 ...
- 【转】快速理解Kafka分布式消息队列框架
from:http://blog.csdn.net/colorant/article/details/12081909 快速理解Kafka分布式消息队列框架 标签: kafkamessage que ...
- EQueue - 一个C#写的开源分布式消息队列的总体介绍(转)
源: EQueue - 一个C#写的开源分布式消息队列的总体介绍 EQueue - 一个纯C#写的分布式消息队列介绍2 EQueue - 详细谈一下消息持久化以及消息堆积的设计
- Kafka分布式消息队列
基本架构 Kafka分布式消息队列的作用: 解耦:将消息生产阶段和处理阶段拆分开,两个阶段互相独立各自实现自己的处理逻辑,通过Kafka提供的消息写入和消费接口实现对消息的连接处理.降低开发复杂度,提 ...
- EQueue - 一个C#写的开源分布式消息队列的总体介绍
前言 本文想介绍一下前段时间在写enode时,顺便实现的一个分布式消息队列equeue.这个消息队列的思想不是我想出来的,而是通过学习阿里的rocketmq后,自己用c#实现了一个轻量级的简单版本.一 ...
- kafka分布式消息队列介绍以及集群安装
简介 首先简单说下对kafka的理解: 1.kafka是一个分布式的消息缓存系统: 2.kafka集群中的服务器节点都被称作broker 3.kafka的客户端分为:一是producer(消息生产者) ...
- 快速理解Kafka分布式消息队列框架
作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ ==是什么 == 简单的说,K ...
- [转载] 快速理解Kafka分布式消息队列框架
转载自http://blog.csdn.net/xiaolang85/article/details/18048631 ==是什么 == 简单的说,Kafka是由Linkedin开发的一个分布式的消息 ...
- Apache Kafka 分布式消息队列中间件安装与配置 转载
bin/zkServer.sh start /home/guym/down/kafka_2.8.0-0.8.0/config/zookeeper.properties& bin/kafka-s ...
随机推荐
- yaf框架流程三
路由的原理请看http://yaf.laruence.com/manual/yaf.routes.html这个链接 要点:路由的顺序是堆栈模式的,及最后添加的路由规则最优先.由上两篇可知,定义的第一条 ...
- 【转】bash调试经验
原文网址:http://blog.csdn.net/yfkiss/article/details/8636758 bash是Unix/Linux操作系统最常用的shell之一,它非常灵活,和awk.c ...
- RAC 环境下修改归档模式
RAC环境下的归档模式切换与单实例稍有不同,主要是共享存储所产生的差异.在这种情况下,我们可以将RAC数据库切换到非集群状态下,仅仅在一个实例上来实施归档模式切换即可完成RAC数据库的归档模式转换问题 ...
- C++类构造函数初始化列表
C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public: ...
- MySQL基础之第17章 MySQL日志
17.1.日志简介 二进制日志错误日志通用查询日志慢查询日志 17.2.二进制日志 二进制日志也叫作变更日志(update log),主要用于记录数据库的变化情况.通过二进制日志可以查询MySQL数据 ...
- IOS 单例 创建方式
@implementation Me static Car *sharedInstance= nil;//声明一个静态对象引用并赋为nil +(Me *) sharedInstance//声明类方法( ...
- [Everyday Mathematics]20150301
设 $f(x)$ 在 $[-1,1]$ 上有任意阶导数, $f^{(n)}(0)=0$, 其中 $n$ 是任意正整数, 且存在 $C>0$, $$\bex |f^{(n)}(x)|\leq C^ ...
- PHP 解压zip文件的函数封装
/** * zip文件解压 * * @param $zipFilePath zip文件的路径,可以不加zip文件后缀.如果其他类型的文件伪装成zip解压也会失败 * @param $directory ...
- WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5
以下是我的程序(取自headfirst Java): import javax.sound.midi.*; public class MiniMiniMusicApp { public static ...
- _margin和margin的区别
_margin和margin的区别 _margin和margin的区别 Question: margin:15px 300px 0px 100px; height:72px; width:188px; ...