说说 MQ 之 Kafka

bigpipe:以Kafka为存储介质,提供异步HTTP RPC的中间件 大烟斗 一个基于Kafka的中间件,预测简化服务间初始Http调用的复杂度 功能更新 2018-04-04:增加了消费者粒度的熔断器,防止下游不可用导致大量流量持续损失,这是一个可选功能 环境要求 卡夫卡> = 0.9 转到> = 1.8 特性 横向扩展:完全支持rebalanced-consumer-group,多进程部署即可实现分区自动负载均衡 配置热加载:在线服务无需重启即可立即加载配置,流量0损失 优雅退出:处理完剩余任务后退出,流量0损失 超强性能:无锁,协程并发,单进程即可充分利用多核,满足一般流量需求 容错机制:对下游实施限速,限并发,熔断三种保护机制 安装依赖 GO包依赖 编 立即下载

现代的互联网分布式系统,只要稍微大一些,就一定逃不开3类中间件:远程调用(RPC)框架、消息队列、数据库访问中间件。Kafka 是消息队列中间件的代表产品,用 Scala 语言实现,本文采用的是 Kafka_2.11 0.10.0.0 版本进行实验。

基本概念

首先,Kafka 中有一些基本的概念需要熟悉 1 2。

Topic,指消息的类别,每个消息都必须有;

Producer,指消息的产生者,或者,消息的写端;

Consumer,指消息的消费者,或者,消息的读端;

Producer Group,指产生者组,组内的生产者产生同一类消息;

Consumer Group,指消费者组,组内的消费者消费同一类消息;

Broker,指消息服务器,Producer 产生的消息都是写到这里,Consumer 读消息也是从这里读;

Zookeeper,是 Kafka 的注册中心,Broker 和 Consumer 之间的协调器,包含状态信息、配置信息和一些 Topic 的信息;

Partition,指消息的水平分区,一个 Topic 可以有多个分区;

Replica,指消息的副本,为了提高可用性,将消息副本保存在其他 Broker 上。

特别说明,Broker 是指单个消息服务进程,一般情况下,Kafka 是集群运行的,Broker 只是集群中的一个服务进程,而非代指整个 Kafka 服务,可以简单将 Broker 理解成服务器(Server)。Kafka 引入的术语都比较常见,从字面上理解相对直观。Kafka 的大致结构图是这样:

13467292-03608941aabdc6e2

Kafka 是 Pull 模式的消息队列,即 Consumer 连到消息队列服务上,主动请求新消息,如果要做到实时性,需要采用长轮询,Kafka 在0.8的时候已经支持长轮询模式。上图中 Consumer 的连接箭头方向可能会让读者误以为是 Push 模式,特此注明。更多关于 Kafka 设计的文章可以参考官方文档,或者一些比较好的博客文章 3。

关于顺序和分区

Kafka 是一个力求保持消息顺序性的消息队列,但不是完全保证,其保证的是 Partition 级别的顺序性,如下图:

13467292-5a3268a9bf9be318

此图是 Topic 的分区 log 的示意图,可见,每个分区上的 log 都是一个有序的队列,所以,Kafka 是分区级别有序的。如果,某个 Topic 只有一个分区,那么这个 Topic 下的消息就都是有序的。

分区是为了提升消息处理的吞吐率而产生的,将一个 Topic 中的消息分成几份,分别给不同的 Broker 处理。如下图:

13467292-60d1c45a70daba36

此图中有2个 Broker,Server 1 和 Server 2,每个 Broker 上有2个分区,总共4个分区,P0 ~ P3;有2个 Consumer Group,Consumer Group A 有2个 Consumer,Consumer Group B 有4个 Consumer。Kafka 的实现是,在稳定的情况下,维持固定的连接,每个 Consumer 稳定的消费其中某几个分区的消息,以上图举例,Consumer Group A 中的 C1 稳定消费 P0、P3,C2 稳定消费 P1、P2。这样的连接分配可能会导致消息消费的不均匀分布,但好处是比较容易保证顺序性。

维持完全的顺序性在分布式系统看来几乎是无意义的。因为,如果需要维持顺序性,那么就只能有一条线程阻塞的处理顺序消息,即,Producer -> MQ -> Consumer 必须线程上一一对应。这与分布式系统的初衷是相违背的。但是局部的有序性,是可以维持的。比如,有30000条消息,每3条之间有关联,1->2->3,4->5->6,……,但是全局范围来看,并不需要保证 1->4->7,可以 7->4->1 的顺序来执行,这样可以达到最大并行度10000,而这通常是现实中我们面对的情况。通常应用中,将有先后关系的消息发送到相同的分区上,即可解决大部分问题。

关于副本

副本是高可用 Kafka 集群的实现方式。假设集群中有3个 Broker,那么可以指定3个副本,这3个副本是对等的,对于某个 Topic 的分区来说,其中一个是 Leader,即主节点,另外2个副本是 Follower,即从节点,每个副本在一个 Broker 上。当 Leader 收到消息的时候,会将消息写一份到副本中,通常情况,只有 Leader 处于工作状态。在 Leader 发生故障宕机的时候,Follwer 会取代 Leader 继续传送消息,而不会发生消息丢失。Kafka 的副本是以分区为单位的,也就是说,即使是同一个 Topic,其不同分区的 Leader 节点也不同。甚至,Kafka 倾向于用不同的 Broker 来做分区的 Leader,因为这样能做到更好的负载均衡。

在副本间的消息同步,实际上是复制消息的 log,复制可以是同步复制,也可以是异步复制。同步复制是说,当 Leader 收到消息后,将消息写入从副本,只有在收到从副本写入成功的确认后才返回成功给 Producer;异步复制是说,Leader 将消息写入从副本,但是不等待从副本的成功确认,直接返回成功给 Producer。同步复制效率较低,但是消息不会丢;异步复制效率高,但是在 Broker 宕机的时候,可能会出现消息丢失。

关于丢消息和重复收到消息

任何一个 MQ 都需要处理丢消息和重复收到消息的,正常情况下,Kafka 可以保证:1. 不丢消息;2. 不重复发消息;3. 消息读且只读一次。当然这都是正常情况,极端情况,如 Broker 宕机,断电,这类情况下,Kafka 只能保证 1 或者 2,无法保证 3。

在有副本的情况下,Kafka 是可以保证消息不丢的,其前提是设置了同步复制,这也是 Kafka 的默认设置,但是可能出现重复发送消息,这个交给上层应用解决;在生产者中使用异步提交,可以保证不重复发送消息,但是有丢消息的可能,如果应用可以容忍,也可以接受。如果需要实现读且只读一次,就比较麻烦,需要更底层的 API 4。

Java工程化、高性能及分布式、高性能、高架构、zookeeper、性能调优、Spring、MyBatis、Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限及相关视频资料

点击资料获取

redis-rpc:使用Redis的pubsub的通用Lisp RPC客户端 redis-rpc redis-rpc提供了一个便民接口,可将redis用作rpc代理。 我将其构建为与节点服务器通信,以将JavaScript模板呈现为Lisp进程。 使用它 start (redis-rpc:start " response_channel " ) call 通过channel调用rpc函数,并将args传递给它。 (redis-rpc:call " request_channel " " function_call " ( lambda (message) (getf :|content| message)) 4 " banana " ) 所以,如果我们的远程功能看起来像 ( defun function_call (num word) ( format nil " ~d ~as " num word)) 然后, lambda应该返回“ 4根 立即下载

相关推荐

基于RabbitMQ+Redis的分布式事务框架

使用RabbitMQ和Redis实现的分布式事务框架。主要涉及AOP思想、多线程,使用注解实现事务的提交和回滚。内含基于Spring Cloud的使用案例。

MQ之Kafka

现代的互联网分布式系统,只要稍微大一些,就一定逃不开3类中间件:远程调用(RPC)框架、消息队列、数据库访问中间件。Kafka 是消息队列中间件的代表产品,用 Scala 语言实现; 基本概念 首先,Kafka 中有一些基本的概念需要熟悉。 Topic,指消息的类别,每个消息都必须有; Producer,指消息的产生者,或者,消息的写端; Consumer,指消息的消费者,或者,消息...

weixin_30591551的博客 263

华为2021年天线工程师笔试题目回忆总结(持续更新)

1. 判定长线和短线 所谓长线是指传输线的几何长度和线上传输电磁波的波长的比值(即电长度)大于或接近于1。反之称为短线。是相对于波长而言的。 1000m的传输线,对于频率为50hz(即波长为6000km)的交流电来说,仍远小于波长,应视为短线。长线和短线的区别还在于:长线为分布参数电路,而短线是集总参数电路。 2. 判定传输线的容性和感性 传输线上的输入阻抗具有以下特点: 1/4波长变换性:感性负载与容性负载变换,开路与短路变换; 1/2波长重复性:相距1/2波长的整数倍的两个点输入阻抗都相等。1/4开路传

ludashi3的博客 9530

轻松理解Spring、RPC、SOA、集群、分布式、kafka相关概念

本篇主要为个人对于相关技术及框架知识的理解。 内容仅作为交流、分享。

qq_40798777的博客 2876

苏州大学自动化考研842自动控制原理:手把手教你用胡寿松《自控》高效备考(附复试电工/电子/微机原理攻略)

本文详细解析苏州大学自动化考研842自动控制原理备考策略,以胡寿松《自动控制原理》为核心教材,提供三阶段高效学习路径和实战技巧。重点涵盖频域分析、根轨迹绘制等高频考点,并针对机电、光电、轨道三个学院的复试科目(电工电子技术、电子技术基础、微机原理与接口技术)给出差异化备考方案,助力考生全面提升笔试和面试表现。

weixin_42638178的博客 399

基因家族的鉴定-基于Windows系统上的HMMER

基因家族的鉴定-基于Windows系统上的HMMER。

liangjinghui123的博客 3247

Java面试题总结(rpc,kafka)

看到一个rpc的图画的很好 rpc进行网络通信一般用的netty

aasoga的博客 934

为什么先进工艺需要check那么多corner?

那么hold slack = launch clock path delay + data path delay - capture_clock_path_delay = -capture_clock_path_delay,也就是说,capture clock path delay越大,hold越难满足。而且,我们在设计的时候,一般clock频率都会过约,所以是有较大的margin的。有的foundry还会对rc的取值范围进行了约束,如cworst_T,采用的是1.5 sigma的取值范围。

芯冰乐 2087

kafka 请求处理与RPC原理解析(四)

kafka server启动后,会监听一些端口,然后开始接收请求进行日常的工作。 与请求处理相关的组件有 SocketServer、KafkaApis、KafkaRequestHandlerPool。这些都是在kafka server启动时初始化并开始运行的。SocketServer是一个NIO服务,基于N+M的线程模型,由N个Acceptor线程以及M个Processor线程组成,和netty...

u013332124的专栏 5188

逆强化学习:从专家示范中学习策略

逆强化学习(Inverse Reinforcement Learning,简称IRL)是强化学习(Reinforcement Learning,简称RL)的一个子领域,它的目标是从专家的行为中学习策略。在传统的强化学习中,智能体通过与环境交互,根据奖励信号来学习一个策略。而在逆强化学习中,我们没有直接的奖励信号,而是通过观察专家的行为来推断出奖励函数,从而学习到一个与专家类似的策略。逆强化学习作为强化学习的一个重要子领域,在许多实际应用场景中都取得了显著的成功。

AI天才研究院 1452

机器人动力学仿真软件:V-REP (CoppeliaSim)_(15).仿真项目案例分析

通过以上几个具体的仿真项目案例,我们展示了如何在V-REP (CoppeliaSim)中进行二次开发,实现复杂的机器人动力学仿真任务。这些案例涵盖了六轴机械臂的运动学仿真、移动机器人的路径规划和避障、以及无人机的飞行控制和环境感知。每个项目都通过编写Lua脚本实现了对机器人模型的控制和任务执行,并通过仿真结果分析验证了算法的有效性和系统性能。希望这些案例能够为读者在实际项目中使用V-REP (CoppeliaSim)提供有益的参考和启发。

kkchenjj的博客 1295

kafka和MQ

1.传统串行化服务的 缺点: 1.1各个模块之间耦合性太强(类似于高中时期的串联电路) 1.2系统吞吐量不大,耗时多 优点:系统架构简单,排查错误方便 2.消息队列 适合用户量很大的 优点2.1解耦,提升性能 缺点:分布事务解决方案 事务:只要是涉及到消息队列,肯定是要处理事务问题(事务的性质:原子性即我的所有动作要么执行要么全都不执行,比如张三给我100块,执行的是两个动作张三-100我加100) 架构设计: 从功能块的访问量来选择。消息队列,redis,zookeeper,锁,jvm,Spring,

qq_45703474的博客 7533

4. SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 方法实现指南

首先第19行CREATEDATA创建er_entityset实例,指定其类型为zcl_zbook_manage_mpc=>tt_book,接着把这个引用映射到刚刚第五行定义的FIELD-SYMBOLS变量上去,这样的话,接下来我们对FIELD-SYMBOLS进行的操作,就会自动反应回引用变量er_entityset.因为我们可能在这个方法里,返回多条图书信息,所以需要用内表类型,而非单条记录的ts_book.ts_book代表一本图书的数据结构。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2962

MQ和kafka的区别

AMQP简单来说就是规定好了MQ的各个抽象组件,RabbitMQ则是一款完全严格按照AMQP来实现的开源MQ,使得很好被开源框架所集成,比如Spring AMQP专门就是用来操作AMQP架构的中间件的,因此RabbitMQ可以被Spring Boot很方便的集成。这样在被调用的应用挂掉以后,应用之间的调用不会直接产生异常,请求仍可以正常发送,待被调用应用重新起来以后,再去消费处理MQ中挤压的调用请求,为系统的修复争取到了时间。向消费者推送message,消费者向MQ返回ack,告知所推送的消息消费成功。

srlahsly的博客 4044

(十五)CX20106A 中超声波测量的应用

(十五)CX20106A 中超声波测量的应用

m0_52555663的博客 4511

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Kafka 和 MQ 的区别

1.1.MQ简介消息中间件,其实准确的叫法应该叫消息队列(message queue),简称MQ。其本质上是个队列,有FIFO的性质,即first in first out,先入先出。RabbitMQRocketMQKafka1.2.MQ的应用场景流量削锋应用解耦异步任务1.流量削锋流量过大的时候,用MQ作为一个中间层,暂时存储流量,让流量在队列中排队去访问服务,从而控制直接访问服务的流量,减轻服务的实时流量压力。2.应用解耦使用MQ作为应用之间的中间层,从而使得应用之间不存在。

2401_83691559的博客 2586

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

kafka-connect-mq-source:将IBM MQ数据流无缝导入Apache Kafka

kafka-connect-mq-source:将IBM MQ数据流无缝导入Apache Kafka 项目介绍 kafka-connect-mq-source 是一个用于将IBM MQ中的数据复制到Apache Kafka的Kafka Connect源连接器。该连接器以源代码形式提供,你可以轻松地将其构建为一个JAR文件。它支持两种连接方式:客户端连接和绑定连接,使得在不同场景下都能够灵活使用。 ...

gitblog_01088的博客 1120

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

消息队列MQ 之 Kafka

目录前言一、消息队列 MQ为什么需要消息队列(MQ)使用消息队列的好处消息队列的两种模式二、Kafka 概述Kafka 简介Kafka 的特性三 实验 前言 一、消息队列 MQ MQ,Message Queue 消息队列 为什么需要消息队列(MQ) 主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发 too many connection 错误,引发雪崩效应。 我们使用消息队列,通过【异步处理】请求,从而缓解

段小宝的博客 1622

【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka

一文详解三大MQ,RabbitMQ、RocketMQ、Kafka,各自的使用、原理和适用场景。

BugMan的博客 2万+

MQ学习笔记(一)Kafka简介

Message Queue 消息队列 ,在消息的传递过程中保存消息的容器。父亲==》书架《==儿子好处:应用解耦,异步提速,限流削峰使用成本:引入复杂度,最终一致性,高可用性何时使用:生产者不需要从消费者处获得反馈能够容忍短暂的不一致性效果要大于副作用。

qq_36509457的博客 1356

MQ之初识kafka

MQ全称是Message Queue,直译过来叫消息队列,在消息的传输中用于保存消息的容器,主要是作为分布式应用之间实现异步通信的方式。主要由三部分组成,分别是 生产者、消息服务端和消费者生产者(Producer),是生产消息的一端,相当于消息的发起方,主要负责载业务信息的消息的创建。消息服务端(Server),是处理消息的单元,本质就是用来创建和保存消息队列,它主要负责消息的存储、投递以及跟消息队列相关的附加功能。消息服务端是整个消息队列最核心的组成部分。第三个是消费者(

still_five_Days的博客 969

主流MQ [Kafka、RabbitMQ、ZeroMQ、RocketMQ 和 ActiveMQ]

下面是关于主流的 Kafka、RabbitMQ、ZeroMQ、RocketMQ 和 ActiveMQ 的一些介绍:Kafka 是一个分布式流处理平台,设计用于处理高吞吐量的实时数据流。它具有高可靠性、可扩展性和持久性,适用于构建实时数据管道和流式处理应用程序。Kafka 使用发布-订阅模型,消息以主题(topic)的形式进行发布和订阅。RabbitMQ 是一个功能丰富且易于使用的开源消息队列系统,实现了高级消息队列协议(AMQP)。

小电玩 3122

MQ与kafka之间的对比

1.是否遵守JMS规范 MQ遵守了jms规范,kafka没有遵循jms规范。kafka利用文件系统来管理消息的生命周期 2. 吞吐量 kafka是顺序写磁盘,因此效率非常高。Kafka基于时间或者partition的大小来删除消息,同时broker是无状态的,consumer的消费状态(offset)是由consumer自己控制的(每一个consumer实例只会消费某一个或多个特定parti

MeiGe在路上。。。 2万+

kafka 和其他 MQ 之间的区别

qq_38748148的博客 1671

MQ - 闲聊MQ一二事儿 (Kafka、RocketMQ 、Pulsar )

ookeeper 是 cp 强一致架构的一种,其内部使用 zab 算法,进行信息同步和容灾,在信息量较小的情况下,性能较好,当信息交互变多,因为同步带来的性能损耗加大,性能和吞吐量降低。kafka 的整体性能收到了 topic 数量的限制,这和底层的存储有密不可分的关系,我们上面讲过,当消息来的时候,底层数据使用追加写入的方式,顺序写盘,使得整体的写性能大大提高,但这并不能代表所有情况,当我们 topic 数量从几个变成上千个的时候,情况就有所不同了。所以,针对不同场景选择合适的产品是非常关键的。

小工匠 1万+

浅识MQ的 Kafka、ActiveMQ、RabbitMQ、RocketMQ区别

MQ的 Kafka、ActiveMQ、RabbitMQ、RocketMQ区别

qq_37679639的博客 1820
上一篇: Redis教程
下一篇: 天天“crud”,如何成为技术大牛?
普通网友
博客等级 码龄8年 55粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值