首页 > 其他分享 >kafka01 kafka及消息队列简介

kafka01 kafka及消息队列简介

时间:2023-06-25 14:13:53浏览次数:31  
标签:队列 数据 系统 Kafka 消息 ZeroMQ kafka kafka01

 

1 Kafka是什么

  Kafka是一种高吞吐量的分布式发布订阅消息系统(消息引擎系统)。

 

2 消息系统简介

  一个消息系统负责将数据从一个应用传递到另外一个应用,应用只需关注于数据,无需关注数据在两个或多个应用间是如何传递的。分布式消息传递基于可靠的消息队列,在客户端应用和消息系统之间异步传递消息。有两种主要的消息传递模式:点对点传递模式、发布-订阅模式。大部分的消息系统选用发布-订阅模式。Kafka就是一种发布-订阅模式。

 

3 点对点消息传递模式

  在点对点消息系统中,消息持久化到一个队列中。此时,将有一个或多个消费者消费队列中的数据。但是一条消息只能被消费一次。当一个消费者消费了队列中的某条数据之后,该条数据则从消息队列中删除。该模式即使有多个消费者同时消费数据,也能保证数据处理的顺序。这种架构描述示意图如下:

 

  生产者发送一条消息到queue,只有一个消费者能收到。

 

4 发布-订阅消息传递模式

  在发布-订阅消息系统中,消息被持久化到一个topic中。与点对点消息系统不同的是,消费者可以订阅一个或多个topic,消费者可以消费该topic中所有的数据,同一条数据可以被多个消费者消费,数据被消费后不会立马删除。在发布-订阅消息系统中,消息的生产者称为发布者,消费者称为订阅者。该模式的示例图如下

  发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。

 

5 kafka作用

  kafka的作用是是“削峰填谷”。
  所谓的“削峰填谷”就是指缓冲上下游瞬时突发流量,使其更平滑。特别是对于那种发送能力很强的上游系统,如果没有消息引擎的保护,“脆弱”的下游系统可能会直接被压垮导致全链路服务“雪崩”。但是,一旦有了消息引擎,它能够有效地对抗上游的流量冲击,真正做到将上游的“峰”填满到“谷”中,避免了流量的震荡。消息引擎系统的另一大好处在于发送方和接收方的松耦合,这也在一定程度上简化了应用的开发,减少了系统间不必要的交互。

6 Kafka的优点特点

1)解耦
  在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

 

2)冗余(副本)
  有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

 

3)扩展性
  因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。

 

4)灵活性&峰值处理能力
  在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

 

5)可恢复性
  系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

 

6)顺序保证
  在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个Partition内的消息的有序性。

 

7)缓冲
  在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行———写入队列的处理会尽可能的快速。该缓冲有助于控制和优化数据流经过系统的速度。

 

8)异步通信
  很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

 

7 常用Message Queue对比

 

7.1 RabbitMQ

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

 

7.2 Redis

  Redis是一个基于Key-Value对的NoSQL数据库,开发维护很活跃。虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

 

7.3 ZeroMQ

  ZeroMQ号称最快的消息队列系统,尤其针对大吞吐量的需求场景。ZeroMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演这个服务器角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果宕机,数据将会丢失。其中,Twitter的Storm 0.9.0以前的版本中默认使用ZeroMQ作为数据流的传输(Storm从0.9版本开始同时支持ZeroMQ和Netty作为传输模块)。

 

7.4 ActiveMQ

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

 

7.5 Kafka/Jafka

  Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制统一了在线和离线的消息处理。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。

标签:队列,数据,系统,Kafka,消息,ZeroMQ,kafka,kafka01
From: https://www.cnblogs.com/jthr/p/17502777.html

相关文章

  • kafka stream
       ......
  • kafka学习之五_多个磁盘的性能验证
    kafka学习之五_多个磁盘的性能验证背景周末在家学习kafka上午验证了grafana+kafka_exporter的监控下午想着验证一把性能相关.kafka学习之三里面,有成套的脚本.我这边想起来之前还有一个机器,是四个单盘HDD,我可以直接进行使用和验证.测试思路计划创建四个partitio......
  • 剑指 Offer 09. 用两个栈实现队列
     ====思路:两个stack,stack1和stack2,如果stack2每只,stack1都没值返回-1,,如果stack1有值就把stack1的值都推到stack2中,返回stack2pop的值 ......
  • Kafka部署指南:详细步骤解析
    引言:Kafka是一个高性能、分布式的消息队列系统,被广泛应用于大数据和实时数据处理场景。本文将详细介绍如何在Linux系统上部署和配置Kafka,以便您能够快速开始使用这个强大的消息传递平台。步骤1:准备工作确保您已经安装了JavaDevelopmentKit(JDK),并设置了JAVA_HOME环境变量。......
  • 通过Maxwell同步mysql数据至kafka
    实验环境本地虚拟机maraidb10.8.8kafka2.12-3.3.1maxwell由容器部署1mariadb1.1配置log_bin配置文件中加入如下内容server-id=111log_bin=mysql-binbinlog_format=ROWexpire_logs_days=1重启服务systemctlrestartmariadb查询命令SHOWVARIABLESLI......
  • debezium同步mysql数据至kafka(未完待续)
    实验环境全部部署于本地虚拟机1mysql参考官方文档和根据官方示例镜像(debezium/example-mysql,mysql版本为8.0.32)1.1创建用户官方镜像里一共有三个账号debezium:connect用户mysqluser:普通用户replicator:用于主从?设置命令createuser'debezium'@'%'identifiedby"db......
  • 任务在就绪队列的等待时间--run_delay分析
    1什么是run_delay  在linux中一个任务被创建、被唤醒后并非立刻运行,而是需要先放置到一个叫做”就绪队列”的合适位置上等待CPU调度运行;此外,一个任务运行过程中由于时间片到期或者高优先级任务抢占或者主动放弃CPU等情况发生时,内核会将当前运行的任务暂放到就绪队列上选择其......
  • 【数据结构】用栈实现队列
    ......
  • 基于C语言的泛类型循环队列
    循环队列多用于通信数据缓存中,尤其是在双方设备接收数据与处理数据不同步的情况下,使用循环队列先缓存通信数据,然后按照时间戳数据出队作出相应的处理,是一种比较合适的做法,在嵌入式编程中亦是如此。使用循环队列的数据结构可以实现上述功能,在一些低端的编程平台手写一个循环队列既......
  • celery笔记五之消息队列的介绍
    本文首发于公众号:Hunter后端原文链接:celery笔记五之消息队列的介绍前面我们介绍过task的处理方式,将task发送到队列queue,然后worker从queue中一个个的获取task进行处理。task的队列queue可以是多个,处理task的worker也可以是多个,worker可以处理任意queue......