十五、kafka高性能、高吞吐的原因

1、应用

日志收集(高频率、数据量大)

2、如何保证

(1)磁盘的顺序读写-pagecache关联

rabbitmq基于内存读写,而kafka基于磁盘读写,但却拥有高性能

传统磁盘读写都是随机读写,数据没有存到一起,浪费了寻址时间和旋转时间

如果是顺序读写:无需寻址 ,一次往后读,同时还有按page预读到内存的机制

容量大,消息堆积能力比内存更强大

(2)零拷贝技术-Linux支持(kafka高性能的原因)

传统方式:用户访问网卡

需要将用户态切换到内核态,由内核线程操作磁盘

使CPU存在上下文切换

此外,读取数据是将文件读到内核缓冲区,并拷贝到用户缓冲区,最后拷贝到内核态的socket缓冲区,将数据发到网卡,响应到客户端(用户态和内核态的两次切换)

零拷贝方式:

磁盘文件--内核缓冲区--网卡接口--消费者进程(不存在CPU的切换,直接在内核态完成消息的读取)

(原因:消息没有必要读到用户,消息只负责传递,无需读到用户缓冲区)【与java应用程序进行数据传递不同】

(3)分区分段+索引

partition可以保证topic的消息堆积,分区可以分散到多个broker,减轻了消息堆积

partition也是逻辑概念,实际存储:多个segment文件存储,针对segment又包含索引文件,提升读取效率,提高了读取数据的并行度(分段加锁)

(4)批量压缩

把多条消息使用gzip压缩,对压缩后的数据进行传输

(5)批量读写

堆积到一定的数量再进行发送,可以节省带宽,并提高效率

(6)直接操作页存

直接操作pagecache(页存),而不是jvm-不需要创建对象等操作

避免了对象创建及GC的耗时,读写速度会更快,进程重启时,数据也不会丢失【堆中的数据会丢失】

pagecache的刷盘时间由操作系统完成,基于内存,效率高

十二、kafka的pull和push各有什么优缺点

1、pull-主动拉取

由消费者根据处理能力,自己控制

按需所取,但不实时

2、push-推送

实时发送消息

缺点:可能会导致消费者压力大,可能会压垮

十三、Kafka、ActiveMQ、RabbitMQ、RocketMQ对比

1、ActiveMQ-半死不活

生产环境中较少,支持的数据量较小

遵循JMS消息中间件的规范,支持事务的ACID特性

支持XA协议(两段式提交,MySQL也支持)

官方维护少,社区不活跃

万级别吞吐量

2、RabbitMQ

基于AMQP协议

使用erlang开发,性能比较好,支持高并发

客户端支持多种语言

社区活跃、文档全面

但erlang语言对java不友好,不利于二次开发

学习成本高、架构复杂

万级别吞吐量,不适用于高并发

3、kafka-高性能、高并发

高可用

生产环境大量使用

ELK使用kafka收集日志

缺陷:单机容量有限,一台broker能放的partition数量有限,64以内最好

社区更新慢,部分代码使用java开发,二次开发有限制

吞吐量百万级别,Apache大数据标配

4、RocketMQ-基于阿里-火箭

性能和吞吐较高,高可用

基于java,利于二次开发

☆高可靠,消息零丢失(适用于互联网金融)

已经被捐赠给阿帕奇,社区活跃度一般

支持语言比较少-java、c++

吞吐量十万级别

【消息队列面试】15-17:高性能和高吞吐、pull和push、各种MQ的区别的更多相关文章

  1. RabbitMQ消息队列(十一)-如何实现高可用

    在前面讲到了RabbitMQ高可用集群的搭建,但是我们知道只是集群的高可用并不能保证应用在使用消息队列时完全没有问题,例如如果应用连接的RabbitMQ集群突然宕机了,虽然这个集群时可以使用的,但是应 ...

  2. 【消息队列】kafka是如何保证高可用的

    一.kafka一个最基本的架构认识 由多个broker组成,每个broker就是一个节点:创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的br ...

  3. kafka高吞吐量的分布式发布订阅的消息队列系统

    一:kafka介绍kafka(官网地址:http://kafka.apache.org)是一种高吞吐量的分布式发布订阅的消息队列系统,具有高性能和高吞吐率. 1.1 术语介绍BrokerKafka集群 ...

  4. kafka消息队列、环境搭建与使用(.net framework)

    一:kafka介绍 kafka(官网地址:http://kafka.apache.org)是一种高吞吐量的分布式发布订阅的消息队列系统,具有高性能和高吞吐率. 1.1 术语介绍 BrokerKafka ...

  5. .NET中 kafka消息队列、环境搭建与使用

    前面几篇文章中讲了一些关于消息队列的知识,就每中消息队列中间件,我们并没有做详细的讲解,那么,今天我们就来详细的讲解一下消息队列之一kafka的一些基本的使用与操作. 一.kafka介绍 kafka: ...

  6. 高性能、高可用、高扩展ERP系统架构设计

    ERP之痛 曾几何时,我混迹于电商.珠宝行业4年多,为这两个行业开发过两套大型业务系统(ERP).作为一个ERP系统,系统主要功能模块无非是订单管理.商品管理.生产采购.仓库管理.物流管理.财务管理等 ...

  7. 深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议

    前言 消息队列在现今数据量超大,并发量超高的系统中是十分常用的.本文将会对现时最常用到的几款消息队列框架 ActiveMQ.RabbitMQ.Kafka 进行分析对比.详细介绍 RabbitMQ 在 ...

  8. 消息队列高手课,带你从源码角度全面解析MQ的设计与实现

    消息队列中间件的使用并不复杂,但如果你对消息队列不熟悉,很难构建出健壮.稳定并且高性能的企业级系统,你会面临很多实际问题: 如何选择最适合系统的消息队列产品? 如何保证消息不重复.不丢失? 如果你掌握 ...

  9. [Java] 分布式消息队列(MQ)

    概述 场景 服务解耦 削峰填谷 异步化缓冲:最终一致性/柔性事务 MQ应用思考点 生产端可靠性投递 消费端幂等:消息只能消费一次 高可用.低延迟.可靠性 消息堆积能力 可扩展性 业界主流MQ Acti ...

  10. rabbitmq学习(九) —— 关于消息队列的选型

    转自http://cmsblogs.com/?p=3846 在IM这种讲究高并发.高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转.消息削峰.消息交 ...

随机推荐

  1. 基于深度学习的文本分类案例:使用LSTM进行情绪分类

    Sentiment classification using LSTM 在这个笔记本中,我们将使用LSTM架构在电影评论数据集上训练一个模型来预测评论的情绪.首先,让我们看看什么是LSTM? LSTM ...

  2. Elastic:创建你的第一个Elastic alert

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/105340379 在Elasticsearch可以提供给我们数据的存储及快速的搜索,但 ...

  3. 第二章:视图层 - 10:动态生成PDF文件

    可以通过开源的Python PDF库ReportLab来实现PDF文件的动态生成. 一.安装ReportLab ReportLab库在PyPI上提供,可以使用pip来安装: $ pip install ...

  4. 第六章:Django 综合篇 - 1:配置 Django

    Django项目的设置文件位于项目同名目录下,名叫settings.py.这个模块,集合了整个项目方方面面的设置属性,是项目启动和提供服务的根本保证. 一.简述 settings.py文件本质上是一个 ...

  5. 实战---在Portainer中编排docker-compose.yml文件

    选择要部署容器的主机上,不用事先安装配置docker-compose 官方示例文档地址,2.0版本的:https://docs.docker.com/compose/compose-file/comp ...

  6. Docker网络详细理解-容器网络互通

    这篇文章主要解决以下几个问题: 1.同一个网段的容器互相之间通过ip进行ping通 2.同一个网段的容器互相之间通过容器名,通过使用--link进行ping通,已放弃这种方法 3.同一个网段的容器互相 ...

  7. 9. Fluentd部署:日志

    Fluentd是用来处理其他系统产生的日志的,它本身也会产生一些运行时日志.Fluentd包含两个日志层:全局日志和插件级日志.每个层次的日志都可以进行单独配置. 日志级别 Fluentd的日志包含6 ...

  8. Beats:在 Beats 中实现动态 pipeline

    转载自:https://blog.csdn.net/UbuntuTouch/article/details/107127197 在我们今天的练习中,我们将使用 Metricbeat 来同时监控 kib ...

  9. 货币转换I

    A=input() if A[0] in ['U','u']: RMB=(eval(A[3:]))*6.78 print("RMB{:.2f}".format(RMB)) else ...

  10. nsis利用ButtonEvent插件移动无标题窗口

    众所周知,普通win窗口是带有标题栏的,标题栏的主要功用之一,就是可以方便的拖动窗体,但为了各式各样的目的,有时候我们不得不想办法将其消除,在nsis中主要是靠system插件调用系统函数改变窗体风格 ...