从JMS到KafKa
从JMS到KafKa
JMS
(1)JMS概念
JMS(Java Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。
(2)消息模型
P2P:发送端将消息发送到消息队列(使用什么样的消息队列最优?),不用管接收端的行为,接受端只需要去消息队列中取消息,如果有消息就取出来进行消费,没有就进行等待。

图1:P2P模型
Publish-Subscribe:发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态

图2:发布者-订阅者
KafKa
(1) KafKa的概念
Kafka是Linkedin于2010年12月份开源的消息系统,是一个高性能,高可用,可持久化的,为分布式设计的消息中间件。
Kafka的集群算法做的很先进,大大强于ActiveMQ。ActiveMQ只有主从互备的HA,负载均衡做的不好,没有消息分片。而Kafka在HA,负载均衡和消息分片上做的很完美。
(2) 目标
1、消息数据保存在磁盘,存取代价为O(1)。一般数据在磁盘上是使用BTree存储的,存取代价为O(lgn)
2、高吞吐率。在普通的节点上,单机每秒10W消息读写
3、支持分布式,所有的producer、broker和consumer都会有多个,均为分布式的。
4、支持数据并行加载到Hadoop中。
(3) 相关概念
1、Topics/logs
一个Topic可以认为是一类消息,每个topic将被分成多个partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型数字,它是唯一的标记一条消息。kafka没有提供索引机制来存储offset,因为kafka中不对消息进行“随机读写”。
kafka和ActiveMQ不同的是:即使消息被消费,消息仍然不会被立即删除,日志文件将会根据broker中的配置要求,保留一定的时间之后删除;比如log文件保留2天,之后不管消息是否被消费,文件都会被删除。可以达到减少磁盘IO开支的效果。
2、Partitions
每个server(kafka实例)负责partitions中消息的读写操作;此外kafka还可以配置partitions需要备份的个数(replicas),每个partition将会被备份到多台机器上,以提高可用性。每个partition都有一个server为“leader”;leader负责所有的读写操作,如果leader失效,那么将会有其他follower来接管(成为新的leader);follower只是简单的跟进与leader,同步消息即可。leader server承载了全部的请求压力,因此从集群整体考虑,有多少个partitions就有多少个leader,kafka将leader均衡分散在每个实例上,确保整体的性能稳定。
3、Producers
将消息发布到指定的Topic中,同时Producer也能决定将消息归属到哪个partitions,比如基于“round-robin”方式,或者通过其他的一些算法等。
4、Consumers
每个consumer属于一个consumer group。发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费。
如果所有的consumer都具有相同的group(属于queue模式),消息将会在consumer之间负载均衡。
如果所有的consumer都具有不同的group(属于“发布-订阅”模式),消息将会广播给所有的消费者。
一个partition中的消息只会被group中的一个consumer消费,一个consumer可以消费多个partitions中的消息。kafka只能保证一个partitions中的消息被某个consumer消费是顺序的。
kafka的设计原理决定,对于一个topic,同一个group中不能有多余partitions个数的consumer同时消费,否则将某些consumer无法得到消息。
(4) KafKa的部署结构

图3:KafKa集群结构图
1、message(消息)是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息。如果consumer订阅了这个主题,那么新发布的消息就会广播给这些consumer。
2、Kafka是显式分布式的,多个producer、consumer和broker可以运行在一个大的集群上,作为一个逻辑整体对外提供服
务。对于consumer,多个consumer可以组成一个group,这个message只能传输给某个group中的某一个consumer.
(5) 大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合
1)数据采集:负责从各节点上实时采集数据,选用cloudera的flume来实现
2)数据接入:由于采集数据的速度和数据处理的速度不一定同步,因此添加一个消息中间件来作为缓冲,选用apache的kafka
3)流式计算:对采集到的数据进行实时分析,选用apache的storm
4)数据输出:对分析后的结果持久化,暂定用mysql

图4:大数据消息处理解决方案
从JMS到KafKa的更多相关文章
- 【原】Storm及特点
Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...
- Solr vs. Elasticsearch谁是开源搜索引擎王者
当前是云计算和数据快速增长的时代,今天的应用程序正以PB级和ZB级的速度生产数据,但人们依然在不停的追求更高更快的性能需求.随着数据的堆积,如何快速有效的搜索这些数据,成为对后端服务的挑战.本文,我们 ...
- Storm 系列(一)基本概念
Storm 系列(一)基本概念 Apache Storm(http://storm.apache.org/)是由 Twitter 开源的分布式实时计算系统. Storm 可以非常容易并且可靠地处理无限 ...
- hadoop15---activemq
java JMS技术 JMS是规范,activeMQ是实现. 用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. 它类似于JDBC,JDBC 是可以用来访问许多不同关系数据库的 API. ...
- 转 Solr vs. Elasticsearch谁是开源搜索引擎王者
转 https://www.cnblogs.com/xiaoqi/p/6545314.html Solr vs. Elasticsearch谁是开源搜索引擎王者 当前是云计算和数据快速增长的时代,今天 ...
- Flume的Source、Sink总结,及常用使用场景
数据源Source RPC异构流数据交换 Avro Source Thrift Source 文件或目录变化监听 Exec Source Spooling Directory Source Taild ...
- 1.RabbitMQ工作模型与基本原理
1.了解 MQ 的本质和 RabbitMQ 的特性: 2.掌握 RabbitMQ 的 Java API 编程和 Spring 集成 RabbitMQ 1. MQ 了解 1.1. 消息队列简介 ...
- Elasticsearch vs Solr 搜索引擎对比和选型
前言 全文搜索属于最常见的需求,开源的 Elasticsearch 是目前全文搜索引擎的首选. 基于Lucene它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Githu ...
- 论logstash的玩法(ELK)
本篇文章采用的采用的是logstash-7.7.0版本,主要从如下几个方面介绍 1.logstash是什么,可以用来干啥 2.logstash的基本原理是什么 3.怎么去玩这个elk的组件logsta ...
随机推荐
- java Calendar Date 获取指定日期所在月或年的第一天和最后一天
一.获取传入日期所在月的第一天 public static Date getFirstDayDateOfMonth(final Date date) { final Calendar cal = Ca ...
- ONNX预训练模型加载
tvm官网中,对从ONNX预训练模型中加载模型的教程说明 教程来自于:https://docs.tvm.ai/tutorials/frontend/from_onnx.html#sphx-glr-tu ...
- 《浏览器工作原理与实践》<05>渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?
在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段.这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可以解决一系列相关的问题,比如能熟练 ...
- linux基础4-压缩及其相关的命令
一 压缩的原理以及gzip.bzip2.tar三个命令的: Linux下文件的压缩与打包 二 zip.zipinfo.unzip: zip:压缩成.zip文件 zipinfo:列出压缩文件信息
- Linux Centos虚拟机扩容
Linux Centos虚拟机扩容(/dev/mapper/centos-root) 1:.首先查看我们的根分区大小是多少 df -h 文件系统 类型 容量 已用 可用 已用% 挂载点``/dev/m ...
- dynamic类型
dynamic类型在运行时做类型检查 可用于变量类型.方法参数和返回值类型 示例 dynamic person = new Student { Name = "张三", Age = ...
- 《SVG精髓》笔记(一)
本文是基于<SVG精髓>一书的简单总结,文中的demo均为该书提供,目的是方便大家使用时快速查阅. 1. 坐标系统 视口(viewport):文档使用的画布区域,表示SVG可见区域的大小, ...
- VSS使用技巧
理由很简单:迁出锁定!之所以强调这个,是因为这方面吃过的亏太多,我举几个例子:1.比如两个程序员增加了同一个功能,但是实现方法不同,比如甲:func1,乙 func2,两者代码也不一样第二个人在迁入代 ...
- 洛谷P1026 统计单词个数【区间dp】
题目:https://www.luogu.org/problemnew/show/P1026 题意: 给定一个字符串,要求把他分成k段.给定s个单词,问划分成k段之后每段中包含的单词和最大是多少. 一 ...
- 2、django后端:课程表、课程详细表
1.课程表录入数据 有些人卖接口,接口就是 数据 1.课程表 2张表+3张表 分布式数据库分表 数据库优化 垂直分表 1000w条数据,999w条数据不常看,经常查的1w条数据放在另一个表 水平分表 ...