自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(161)
  • 收藏
  • 关注

原创 第7个1024

第7个1024,忘下个1024,更上一层楼,加油!1024 祝程序员们,永无bug。

2023-10-24 17:04:02 205

原创 kafka的请求处理机制

无论是 Kafka 客户端还是 Broker 端,它们之间的交互都是通过。比如,客户端会通过网络发送消息生产请求给 Broker,而 Broker 处理完成后,会发送对应的响应给到客户端。Kafka 自己定义了一组请求协议,用于实现各种各样的交互操作。比如常见的。

2023-10-08 18:18:21 470

原创 kafka副本机制

现在的很多的分布式系统都支持副本的机制,比如Mysql就有副本的机制,一般使用副本有如下特性和好处。提供数据冗余。即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性。提供高伸缩性。支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量。改善数据局部性。允许将数据放入与用户地理位置相近的地方,从而降低系统延时。而kafka的副本机制仅仅享受到了第一个好处。但是即使是这样,kafka的副本机制也是确保系统高可用和消息高持久性的重要基石。

2023-09-21 18:28:02 435

原创 kafka消费者多线程开发

目前,计算机的硬件条件已经大大改善,即使是在普通的笔记本电脑上,多核都已经是标配了,更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单线程架构,那实在是有点暴殄天物了。不过,Kafka Java Consumer 就是单线程的设计,你是不是感到很惊讶。所以,探究它的多线程消费方案,就显得非常必要了。

2023-09-20 18:18:24 762

原创 kafka的commitFaildException异常处理

CommitFailedException,顾名思义就是 Consumer 客户端在提交位移时出现了错误或异常,

2023-09-12 10:02:11 267

原创 kafka位移提交

因为 Consumer 能够同时消费多个分区的数据,所以位移的提交实际上是在分区粒度上进行的,

2023-09-07 16:51:40 521

原创 kafka如何避免消费组重平衡

Rebalance 就是让一个 Consumer Group下所有的 Consumer 实例就如何消费订阅主题的所有分区达成共识的过程。在 Rebalance 过程中,所有 Consumer 实例共同参与,在协调者组件的帮助下,完成订阅主题分区的分配。但是,在整个过程中,所有实例都不能消费任何消息,因此它对 Consumer 的 TPS 影响很大。组成员数发生变更。比如有新的 Consumer 实例加入组或者离开组,抑或是有 Consumer 实例崩溃被“踢出”组。订阅主题数发生变更。

2023-08-28 18:30:53 547

原创 kafka消费组及位移主题

消费者组,即 Consumer Group,应该算是 Kafka 比较有亮点的设计了。那么何谓 Consumer Group 呢?用一句话概括就是:Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制。

2023-08-24 18:29:21 706

原创 kafka生产者幂等与事务

幂等性 Producer 和事务型 Producer 都是 Kafka 社区力图为 Kafka 实现精确一次处理语义所提供的工具,只是它们的作用范围是不同的。幂等性 Producer 只能保证单分区、单会话上的消息幂等性;而事务能够保证跨分区、跨会话间的幂等性。从交付语义上来看,自然是事务型 Producer 能做的更多。不过,切记天下没有免费的午餐。比起幂等性 Producer,事务型 Producer 的性能要更差,在实际使用过程中,我们需要仔细评估引入事务的开销,切不可无脑地启用事务。

2023-08-14 18:53:03 1355

原创 kafka生产端TCP连接管理

在网络层协议中,TCP作用在第四层传输层、Http协议作用在第七层最上层应用层,一个完整的网络传输,信息会优先到达第四层,然后在往上传输到第七层,TCP协议相比于Http协议提供更好的连接稳定性及TCP提供的多路复用请求及可靠的消息交付语义保证,如自动重传丢失的报文等,kafka在设计上使用TCP协议作为所有请求通信的底层协议。KafkaProducer实例创建时启动Sender线程,从而创建与bootstrap.servers中所有Broker的TCP连接。

2023-07-18 19:53:11 2295

原创 kafka无消息丢失配置

使用消息中间件时,我们遇到最头疼的事就消息丢失,小则影响程序错误,大则影响到某个重要业务失败。如果kafka配置不当或者使用不当,是很有可能出现消息丢失的。本篇博文重点探讨主要的kafka消息丢失的场景及我们应该如何配置kafka参数来避免消息的丢失。

2023-07-13 18:48:27 1605

原创 kafka分区策略

我们都知道kafka以高吞吐闻名,那为什么kafka能支持很高的吞吐量勒?其中有一个重要的原因就是使用了分区,我们知道kafka是按照主题存储消息的,其实kafka是按照如下三层结构主题-分区-消息 将通过日志追加的方式存储到磁盘上。每条消息只会保存到某个分区上,不会保存到多个分区上。如果要自定义分区策略,你需要显式地配置生产者端的参数。这个参数该怎么设定呢?

2023-07-11 17:35:28 822

原创 kafka集群配置

Kafka作为一个优秀的开源组件,在业界别广泛使用,kafka官方提供了很多配置,供使用者不同的场景下进行配置以提升kafka的效率,合理的配置将直接提升kafka的吞吐量等,而错误的配置则可能引入生产事故等。

2023-07-05 18:34:05 921

原创 kafka基础介绍

kafka根据维基百科的定义,消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递。通俗来说就是:系统 A 发送消息给消息引擎系统,系统 B 从消息引擎系统中读取 A 发送的消息。那系统A为什么不能直接发送消息给B了,要使用kafka中转了,其中就利用消息中间件一个很重要的特性,那就是削峰填谷。

2023-05-24 20:33:54 986

原创 迭代器设计模式

迭代器模式,也叫游标模式。它用来遍历集合对象。这里说的集合对象,我们也可以叫容器”“聚合对象,实际上就是包含一组对象的对象,比如,数组、链表、树、图、跳表。遍历集合一般有三种方式:for循环、foreach循环、迭代器遍历。后两种本质上属于一种,都可以看作迭代器遍历。相对于for循环遍历,利用迭代器来遍历有下面三个优势:迭代器模式封装集合内部的复杂数据结构,开发者不需要了解如何遍历,直接使用容器提供的迭代器即可;

2023-04-27 17:10:57 490

原创 状态设计模式

状态模式是状态机的一种实现方式即可。状态机又叫有限状态机,它有3个部分组成:状态、事件、动作。其中,事件也称为转移条件。事件触发状态的转移及动作的执行。不过,动作不是必须的,也可能只转移状态,不执行任何动作。状态机的三种实现方式第一种实现方式叫分支逻辑法。利用if-else或者分支逻辑,参照状态转移图,将每一个状态转移原模原样地直译成代码。对于简单的状态机来说,这种实现方式最简单、最直接,是首选。第二种实现方式叫查表法。对于状态很多、状态转移比较复杂的状态机来说,查表法比较合适。

2023-04-26 18:25:59 3671

原创 责任链设计模式

在我们日常工作中,对过滤器、拦截器应该不会陌生,我们经常会Servelet Fliter、Spring Inerceptor去做一些复用或者扩展的功能,其实他们都使用了一种设计模式,就是责任链模式。

2023-04-24 19:06:04 419

原创 策略设计模式

我们在日常工作中,会经常看见代码中维护着大量的if/else,特别是在一些特别久的系统中,一个方法又长、无用的判断又不敢确认,是否可以及时清理掉。今天我们要说策略模式就能很好的解决这个问题。策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口,所以,客户端代码基于接口而非实现编程,可以灵活地替换不同的策略。@Override//具体的算法...@Override//具体的算法...

2023-04-23 19:58:45 557

原创 模板方法设计模式

这里的算法,我们可以理解为。

2023-04-19 20:22:31 450

原创 观察者设计模式

一般情况下,被依赖的对象为被观察者(Observable),依赖的对象叫做观察者(Observer)。

2023-04-18 19:33:19 526

原创 享元设计模式

享元模式的代码实现非常简单,主要是通过工厂模式,在工厂类中,通过一个Map或者List来缓存已经创建好的享元对象,以达到复用的目的。应用单例模式是为了保证对象全局唯一。应用享元模式是为了实现对象复用,节省内存。缓存是为了提高访问效率,而非复用。池化技术中的复用理解为重复使用,主要是为了节省时间。

2023-04-13 18:34:10 476

原创 组合设计模式

组合模式是一种比较容易混淆的设计模式,主要在于组合二字,我们知道有个设计原则组合优于继承,这里的组合和组合设计模式又不一样?

2023-04-12 19:22:14 508

原创 门面设计模式

这个定义很简洁,我再进一步解释一下。假设有一个系统A,提供了abcd四个接口。系统B完成某个业务功能,需要调用A系统的abd接口。利用门面模式,我们提供一个包裹abd接口调用的门面接口x,给系统B直接使用。门面模式的应用场景。

2023-04-11 18:55:27 558

原创 适配器设计模式

适配器模式这个模式相对来说还是比较简单、好理解的,应用场景也很具体,总体上来讲比较好掌握。顾名思义其主要是为了做适配、为了兼容不同的接口。适配器模式有两种不同的实现模式,类适配器和对象适配器。有5种比较常见的应用场景。 适配器模式顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。 原理很简单

2023-04-10 19:19:33 409

原创 装饰器设计模式

装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。

2023-04-06 18:31:59 228

原创 桥接设计模式

桥接模式是我们平时接触比较少的一种设计模式,虽然从字面意思来看,这个设计模式比较好理解,其实不然,这是一个比较难理解的设计模式。

2023-03-28 19:19:32 168

原创 代理设计模式

代理模式的原理与实现在不改变原始类(或叫被代理类)的情况下,通过引入代理类来给原始类附加功能。一般情况下,我们让代理类和原始类实现同样的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。在这种情况下,我们可以通过让代理类继承原始类的方法来实现代理模式。动态代理的原理与实现静态代理需要针对每个类都创建一个代理类,并且每个代理类中的代码都有点像模板式的重复代码,增加了维护成本和开发成本。对于静态代理存在的问题,我们可以通过动态代理来解决。

2023-03-20 20:45:36 298

原创 原型设计模式

原型模式是我们日常开发过程中,不常用的一种设计模式,熟悉java的同事,应该清楚java中的深拷贝与浅拷贝,其实深浅拷贝就是原型模式运用的一个场景。

2023-03-15 19:48:22 398

原创 建造者设计模式

如果一个类中有很多属性,为了避免构造函数的参数列表过长,影响代码的可读性和易用性,我们可以通过构造函数配合 set() 方法来解决。但是,如果存在下面情况中的任意一种,我们就要考虑使用建造者模式了。我们把类的必填属性放到构造函数中,强制创建对象的时候就设置。如果必填的属性有很多,把这些必填属性都放到构造函数中设置,那构造函数就又会出现参数列表很长的问题。如果我们把必填属性通过 set() 方法设置,那校验这些必填属性是否已经填写的逻辑就无处安放了。

2023-03-14 20:26:44 199

原创 设计模式之工厂模式

当创建逻辑比较复杂,是一个“大工程”的时候,我们就考虑使用工厂模式,封装对象的创建过程,将对象的创建和使用相分离。何为创建逻辑比较复杂呢?第一种情况:类似规则配置解析的例子,代码中存在 if-else 分支判断,动态地根据不同的类型创建不同的对象。针对这种情况,我们就考虑使用工厂模式,将这一大坨 if-else 创建对象的代码抽离出来,放到工厂类中。还有一种情况,尽管我们不需要根据不同的类型创建不同的对象,但是,单个对象本身的创建过程比较复杂,比如前面提到的要组合其他类对象,做各种初始化操作。

2023-03-13 20:13:46 286

原创 如何实现一个单例模式

在日常的工作中使用枚举类的方式创建单例是最安全的。枚举可避免被反序列化破坏单例。原因:枚举对象的序列化、反序列化有自己的一套机制:序列化时,仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf()方法来根据名字查找枚举对象。推荐大家使用枚举的方式创建单例。

2023-03-09 20:13:33 1336

原创 组合优于继承

我们在平时日常开发设计的过程中,经常会有人提到一条经典的设计模式,”组合由于继承”,其实我们做更深层次的思考,我们想搞清楚这个问题,我们首先的明白,什么是组合?、什么是继承?组合的优势是什么?继承的劣势是什么?如何判断该使用组合还是继承?继承是面向对象的四大特性之一,用来表示类之间的is-a关系。

2023-02-20 18:59:36 392

原创 算法之拓扑关系

如何确定代码源文件的编译依赖关系?我们知道,一个完整的项目往往会包含很多代码源文件。编译器在编译整个项目的时候,需要按照依赖关系,依次编译每个源文件。比如,A.cpp依赖B.cpp,那在编译的时候,编译器需要先编译B.cpp,才能编译A.cpp。编译器通过分析源文件或者程序员事先写好的编译配置文件(比如Makefile文件),来获取这种局部的依赖关系。算法解析这个问题的解决思路与图这种数据结构的一个经典算法拓扑排序算法有关。那什么是拓扑排序呢?

2023-01-11 18:53:52 600

原创 算法之动态规划实战

利用Trie树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输入搜索关键词的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。如何量化两个字符串的相似度?如何量化两个字符串之间的相似程度呢?有一个非常著名的量化方法,那就是编辑距离(顾名思义,编辑距离指的就是,将一个字符串转化成另一个字符串,需要的最少编辑操作次数(比如增加一个字符、删除一个字符、替换一个字符)。编辑距离越大,说明两个字符串的相似程度越小;

2023-01-10 18:53:01 371

原创 算法之动态规划理论

一个模型三个特征。其中,一个模型指的是,问题可以抽象成分阶段决策最优解模型。三个特征指的是最优子结构、无后效性和重复子问题。状态转移表法解题思路大致可以概括为,回溯算法实现定义状态画递归树找重复子问题画状态转移表根据递推关系填表将填表过程翻译成代码。状态转移方程法的大致思路可以概括为,找最优子结构写状态转移方程将状态转移方程翻译成代码。贪心、回溯、动态规划可以解决的问题模型类似,都可以抽象成多阶段决策最优解模型。

2023-01-09 18:48:07 367

原创 算法之初始动态规划

大部分动态规划能解决的问题,都可以通过回溯算法来解决,只不过回溯算法解决起来效率比较低,时间复杂度是指数级的。动态规划算法,在执行效率方面,要高很多。尽管执行效率提高了,但是动态规划的空间复杂度也提高了,所以,很多时候,我们会说,动态规划是一种空间换时间的算法思想。贪心、分治、回溯、动态规划,这四个算法思想有关的理论知识,大部分都是后验性的,也就是说,在解决问题的过程中,我们往往是先想到如何用某个算法思想解决问题,然后才用算法理论知识,去验证这个算法思想解决问题的正确性。参考资料。

2023-01-05 18:49:38 897 2

原创 算法之回溯算法

回溯算法的思想非常简单,大部分情况下,都是用来解决广义的搜索问题,也就是,从一组可能的解中,选择出一个满足要求的解。回溯算法非常适合用递归来实现,在实现的过程中,剪枝操作是提高回溯效率的一种技巧。利用剪枝,我们并不需要穷举搜索所有的情况,从而提高搜索效率。尽管回溯算法的原理非常简单,但是却可以解决很多问题,比如我们开头提到的深度优先搜索、八皇后、0-1背包问题、图的着色、旅行商问题、数独、全排列、正则表达式匹配等等。如果感兴趣的话,你可以自己搜索研究一下,最好还能用代码实现一下。

2023-01-04 18:26:17 453

原创 算法之分治算法

不过,这里有一个点要注意,就是数据的存储与计算所在的机器是同一个或者在网络中靠的很近(比如一个局域网内,数据存取速度很快),否则就会因为数据访问的速度,导致整个处理过程不但不会变快,反而有可能变慢。原问题分解成的子问题可以独立求解,子问题之间没有相关性,这一点是分治算法跟动态规划的明显区别,等我们讲到动态规划的时候,会详细对比这两种算法;个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。的订单排序,我们就可以先扫描一遍订单,根据订单的金额,将。

2022-12-23 15:51:49 91

原创 算法之贪心算法

贪心算法有很多经典的应用,比如霍夫曼编码()、Prim和Kruskal最小生成树算法、还有Dijkstra单源最短路径算法。

2022-12-23 14:53:08 804

原创 算法之AC自动机

很多支持用户发表文本内容的网站,比如BBS,大都会有敏感词过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容。你有没有想过,这个功能是怎么实现的呢?实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的这段文字,是否包含敏感词。如果有,就用“***”把它替代掉。我们前面讲过好几种字符串匹配算法了,它们都可以处理这个问题。但是,对于访问量巨大的网站来说,比如淘宝,用户每天的评论数有几亿、甚至几十亿。

2022-12-22 16:16:28 451

ChatGPT使用版,开箱即用

ChatGPT开箱即用,非常靠谱

2023-04-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除