- 博客(139)
- 收藏
- 关注
原创 什么是死锁,如何解决?
死锁是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。当事务1持有资源A的锁,但是尝试获取资源B的锁,而事务2持有资源B的锁,尝试获取资源A的锁的时候,这时候就会发生死锁的情况。或者可以考虑保证操作的顺序,比如多个事务都是先操作资源A、再操作资源B,这样就能有效的避免死锁。如事务1:A->B->C ,事务2:C->D->A,这种情况就有可能导致死锁。即事务1占有了A,等待C,而事务2占有了C在等待A。
2024-05-28 15:39:03 442
原创 如何从零搭建10万级 QPS 大流量、高并发优惠券系统
一、问题解析一、问题解析春节活动中,多个业务方都有发放优惠券的需求,且对发券的 QPS 量级有明确的需求。所有的优惠券发放、核销、查询都需要一个新系统来承载。因此,我们需要设计、开发一个能够支持十万级 QPS 的券系统,并且对优惠券完整的生命周期进行维护。
2024-05-28 15:32:26 1467
原创 如何设计一个秒杀系统
不到的情况,所以要保证系统的高可用和正确性,我们还要设计一个 PlanB 来兜底,说起秒杀,我想你肯定不陌生,这两年,从双十一购物到春节抢红包,再到 12306。的系统,在整个用户请求路径上从浏览器到服务端我们要遵循几个原则,就是要保证用。所谓“稳”,就是整个系统架构要满足高可用,流量符合预期时肯定要稳定,就是超出。预期时也同样不能掉链子,你要保证秒杀活动顺利完成,即秒杀商品顺利地卖出去,这。最后再看“快”,“快”其实很好理解,它就是说系统的性能要足够高,否则你怎么支。抢火车票,“秒杀”的场景处处可见。
2024-05-23 16:14:47 720
原创 数据库乐观锁和悲观锁以及redis分布式锁的区别和使用场景?
乐观锁和悲观锁还有个区别:乐观锁因为比较乐观,所以一般是先做业务逻辑操作,比如参数处理,内存中进行模型组装调整,然后再去更新数据库。即在做并发操作前,先尝试获取锁,如果获取锁成功,在进行业务操作,否则就直接返回失败。而高并发的写操作时,你干了一大堆活,把模型都组装好了,内存计算也都做完了,结果最后去数据库那更新的时候发现版本号变了。所以,应该是先尝试获取锁,如果获取锁成功,再进行业务操作,否则就直接返回失败。●当数据竞争较少,冲突不频繁时,乐观锁能减少锁的开销,提高系统的整体性能。悲观锁是先加锁,再干活。
2024-05-21 11:55:27 607
原创 为什么不建议使用MQ实现订单到期关闭?
2延迟消息的限制(重要):首先并不是所有的消息队列服务都支持延迟消息,即使有一些支持,也可能对消息的延迟时间有限制。例如,某些服务可能限制延迟时间的最大值,这可能无法满足所有订单的到期关闭需求。1资源占用与成本:如果系统中存在大量订单,为每一个订单都创建一个延迟消息可能会导致消息队列中积压大量的消息,这不仅增加了消息队列的资源消耗,也可能导致增加成本,尤其是在使用云服务提供商的消息队列服务时。这里尤其是可靠性及无效消息的问题比较明显,所以在一个订单量比较大的场景,不是特别建议用MQ实现订单的到期关闭。
2024-05-21 11:53:54 412
原创 ✅什么是时间轮?
在时间轮中增加一个round的标识,标识运行的圈数,比如说上面的60s的时间轮,如果我要200s之后运行,那么我在设置这个任务的时候,就把他的round设置为 200/60 = 3 ,然后再把它放到 200%60 = 20的这个槽位上。也就是说我们对于200s以后执行这个任务,我们先把他放到分钟级时间轮上,这个时间轮的槽位每一分钟移动一次,当移动时候,发现某个槽位上有这一分钟内需要执行的任务时。时间轮用于清理过期消息,以释放存储空间。通常,粒度较细的时间轮拥有更短的周期,而粒度较粗的时间轮拥有更长的周期。
2024-05-15 17:23:04 1289 1
原创 ✅为什么定时任务可以定时执行?
具体来说,当我们在系统中设置了一个 Cron 任务后,Cron 服务会根据 Cron 表达式计算出任务下一次应该执行的时间点,并将这个时间点与当前时间点进行比较。在定时任务中,操作系统或应用程序会利用计时器或定时器来定期检查当前时间是否达到了预定的执行时间,如果当前时间已经达到了预定的时间,系统会自动执行相应的任务。不同的操作系统或程序库对于定时器的实现方式可能有所不同,但它们的基本思想都是一致的:在指定的时间点触发一个定时器事件,然后执行相应的任务或操作。这样,定时任务就可以按照预定的时间定时执行了。
2024-05-15 17:20:26 423
原创 什么是TCP的粘包、拆包问题?
TCP粘包和拆包问题是指在进行TCP通信时,因为TCP是面向流的,所以发送方在传输数据时可能会将多个小的数据包粘合在一起发送,而接收方则可能将这些数据包拆分成多个小的数据包进行接收,从而导致数据接收出现错误或者数据粘连的问题。2接收方缓存区大小限制:接收方在接收数据时,如果接收缓存区的大小有限,可能会将一个大的数据包拆分成多个小数据包进行接收,从而导致粘包和拆包问题的出现。80W字面试解析文档、简历模板、学习路线图、java必看学习书籍。资料,我根据我从小白到架构师多年的学习经验整理出来了一份。
2024-05-15 17:19:08 487
原创 ✅HTTPS和HTTP的区别是什么?
○HTTPS: HTTPS使用SSL(Secure Sockets Layer)或其继任者TLS(Transport Layer Security)来加密数据传输,使数据在传输过程中加密,更难被中间人攻击窃取。○HTTP: HTTP是明文传输的,这意味着数据在传输过程中不加密,容易受到中间人攻击。○HTTPS: HTTPS需要使用数字证书,这个证书由受信任的第三方机构(如CA,Certificate Authority)颁发,用于验证网站的身份。○HTTP: HTTP的URL以http://开头。
2024-05-15 17:15:01 495
原创 ✅什么是TCP三次握手、四次挥手?
对于四次挥手,因为 TCP 是全双工通信,在主动关闭方发送 FIN 包后,接收端可能还要发送数据,不能立即关闭服务器端到客户端的数据通道,所以也就不能将服务器端的 FIN 包与对客户端的 ACK 包合并发送,只能先确认 ACK,然后服务器待无需发送数据时再发送 FIN 包,所以四次挥手时必须是四次数据包的交互。如果是三次握手,服务器需要回复 SYN+ACK 包,客户端会对比应答的序号,如果发现是旧的报文,就会给服务器发 RST 报文,直到正常的 SYN 到达服务器后才正常建立连接。
2024-05-15 17:13:21 270
原创 volatile能保证原子性吗?为什么?
synchronized可以保证原子性 ,因为被synchronized修饰的代码片段,在进入之前加了锁,只要他没执行完,其他线程是无法获得锁执行这段代码片段的,就可以保证他内部的代码可以全部被执行。以上程序,正常情况下,输出结果应该是10000,但是真正执行的话就会发现,没办法保证每次执行结果都是10000,这就是因为i++这个操作没办法保证他是原子性的。因为他不是锁,他没做任何可以保证原子性的处理。但是, volatile在线程安全方面,可以保证有序性和可见性,但是是不能保证原子性的。
2024-05-15 17:11:46 798
原创 Spring解决泛型擦除的思路不错,现在它是我的了。
你好呀,我是浮生。Spring 的事件监听机制,不知道你有没有用过,实际开发过程中用来进行代码解耦简直不要太爽。但是我最近碰到了一个涉及到泛型的场景,常规套路下,在这个场景中使用该机制看起来会很傻,但是最终了解到 Spring 有一个优雅的解决方案,然后去了解了一下,感觉有点意思。和你一起盘一盘。
2024-05-13 15:36:34 821
原创 Spring MVC 和 Spring 总结
2). 由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法。spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。session:在一个HTTP Session中,一个bean定义对应一个实例。
2024-05-13 15:30:55 914
原创 synchronized的锁优化是怎样的?
如果所有人去银行都只取款,或者办理业务的时间都很短的话,那也就可以不需要取号,不需要去单独的休息区,不需要听叫号,也不需要再跑到对应的柜台了。这种互斥锁在互斥同步上对性能的影响很大,Java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统的帮忙,这就要从用户态转换到内核态,因此状态转换需要花费很多的处理器时间。有一种比较好的设计,那就是银行提供自动取款机,当你去银行取款的时候,你不需要取号,不需要去休息区等待叫号,你只需要找到一台取款机,排在其他人后面等待取款就行了。
2024-05-13 15:11:05 760
原创 如何根据配置动态生成Spring的Bean?
在 Spring 应用中,根据运行时的配置(比如数据库配置、配置文件、配置中心等)动态生成 Spring Bean 是一种常见需求,特别是在面对多环境配置或者需要根据不同条件创建不同实例时。my.condition.enabled可以通过配置文件或者配置中心进行配置,然后当my.condition.enabled属性为true时,MyBean才会被创建。@ConfigurationProperties注解可以将配置文件中的属性绑定到Bean的属性上,然后就可以基于他做动态配置了。最近很多同学问我有没有。
2024-05-06 16:04:47 564
原创 ✅Spring的@Autowired能用在Map上吗?
当使用这些集合类型注入时,如果没有找到任何匹配的bean,Spring默认的行为是抛出异常。这意味着如果你有多个bean都是同一接口的实现,Spring会将它们全部收集起来,注入到这个List中。在Spring框架中,@Autowired 注解不仅可以用于单个bean的注入,还可以用于注入复杂的集合类型,如List、Map、Set等。使用Map时,key通常是bean的名称,value是bean的实例。你也可以使用数组类型来注入。这与使用List类似,Spring会注入所有匹配类型的bean到数组中。
2024-05-06 16:01:19 655 1
原创 ✅线程数设定成多少更合适?
在本教程中,您将通过大量示例来学习 Java 8 Stream API。Java 在 Java 8 中提供了一个新的附加包,称为。该包由类、接口和枚举组成,允许对元素进行函数式操作。您可以通过在程序中导入包来使用流。
2024-04-28 16:24:03 1059
原创 ✅什么是CAS?存在什么问题?
部分乐观锁的实现是通过版本号(version)的方式来解决ABA问题,乐观锁每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行+1操作,否则就执行失败。在进行并发修改的时候,会先比较A和V中取出的值是否相等,如果相等,则会把值替换成B,否则就不做任何操作。虽然过程上金额都没问题,都改成功了,但是对于用户余额来说,丢失了两次修改的过程,在修改前用户C欠用户A 50元,但是修改后,用户C不欠钱了,而用户B欠用户A 50元了。而这个过程数据是很重要的。
2024-04-28 16:18:09 1027
原创 Spring解决泛型擦除的思路不错,现在它是我的了。
你好呀,我是浮生。Spring 的事件监听机制,不知道你有没有用过,实际开发过程中用来进行代码解耦简直不要太爽。但是我最近碰到了一个涉及到泛型的场景,常规套路下,在这个场景中使用该机制看起来会很傻,但是最终了解到 Spring 有一个优雅的解决方案,然后去了解了一下,感觉有点意思。和你一起盘一盘。
2024-04-27 16:24:15 1053
原创 高并发扣款,如何保证结果一致性?
在金融系统中,我们会跟钱打交道,而保证在高并发下场景下,对账户余额操作的一致性,是非常重要的,如果代码写的时候没考虑并发一致性,就会导致资损,本人在金融行业干了 8 年多,对这块稍微有点经验,所以这篇聊一下,如何在并发场景下,保证账户余额的一致性。上述场景,线程1在修改数据时,虽然还是a,但已经不是初始条件的a了,中间发生了a变b,b又变a,此 a 非彼 a,但是成功修改了,在有些场景下会有问题,这就是 aba。但是以上场景,对账户扣款不会出现问题,因为余额 1000 就是 1000,是相同的,举个例子,
2024-04-27 15:56:50 689
原创 面试官:一个 SpringBoot 项目能处理多少请求?(小心有坑)
这篇文章是基于“一个 SpringBoot 项目能同时处理多少请求?”这个面试题出发的。但是经过我们前面简单的分析,你也知道,这个问题如果在没有加一些特定的前提条件的情况下,答案是各不一样的。比如我再给你举一个例子,还是我们的 Demo,只是使用一下 @Async 注解,其他什么都不变:再次启动项目,发起访问,日志输出变成了这样:同时能处理的请求,直接从 Tomcat 的默认 200 个变成了 8 个?因为 @Async 注解对应的线程池,默认的核心线程数是 8。之前写过这篇文章。
2024-04-26 10:39:33 1367
原创 【逆袭之路】两年Java面试心路历程:从挫败到Offer的百题精讲
而外包公司的话,可能环境不怎么好,我记得自己当初还是个小白的时候,去了外包,那里的优点就是会有不断的活,新人进去的话收获还是挺多的,但是作为已经有两年经验的我,外包很显然不适合我的后期职业发展。两年java的面试过程中遇到了很多挑战,也遇到了一些不谈技术的公司,从上面的面试题可以看出,目前对于java的要求越来越高,水涨船高,毕竟这个行业的人数越来越多,而保持自己的竞争力的唯一方法就是找对方向,不断学习,注意这里我提到的第一点是方向,然后才是学习。要想进入好的互联网公司,分布式和微服务是很必须的。
2024-04-25 16:08:52 844
原创 Java逆袭:手把手教你破解春招面试难题
这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱。只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了。对于那些正打算找工作JAVA软件开发工作的童鞋们来说,当你看到这份题目的时候,你应该感动很幸运,因为,只要你把题目中的内容都搞懂了,在笔试的时候就可以游刃有余,通过面试只有半步之遥了,笔试只能反映你的JAVA技能。不管你是面试各个级别的JAVA工程师、架构师、还是项目经理,这个系列文章都是你最宝贵的资源,里面包括整个JAVA体系的知识,总会有你需要的
2024-04-25 16:01:08 971
原创 Zuul、Gateway和Nginx有什么区别?
当我们在微服务架构中,选择一个微服务网关的时候,建议优先考虑Spring Cloud Gateway,主要是因为Gateway的推出就是要代替Zuul的,首先Gateway是Spring官方自己出的,而Zuul是Netflix出的,而且Gateway之所以推出,也是因为Zuul的更新和维护并不理想。Nginx能够处理并转发HTTP、HTTPS、SMTP、POP3和IMAP等协议的请求,具有强大的性能和高并发处理能力。相比传统的阻塞模型,非阻塞模型能够更好地利用底层系统资源,提供更好的性能和可伸缩性。
2024-04-23 17:54:02 961 1
原创 一网打尽!2024年Java春招面试题库大全(含答案解析)
的学习,你不但能拿到 Offer、取得更好的工作,还能建立一个完整的 Java 知识体系,让你学到的所有内容都能转化为实际的生产力,帮你在工作中取得不凡的成绩。最后,预祝每一位学习本专栏的朋友,都能找到一份自己理想中的工作。之后我花了大半年的时间,结合自己 4 年多作为面试官的经历,把这些内容整理成文,用大约 15 万字的内容对 Java 的核心知识点和常见的 1000多道面试题,做了详细的介绍,也就是本专栏中你所看到的全部内容,希望对正处于求职面试、跳槽、以及需要提升技术的你带来帮助!
2024-04-23 17:52:33 949
原创 SpringCloud 在Spring6.0后有哪些变化
在本次升级的SpringCloud 2022.0.0中,多个组件也都增加了对AOT和Native的支持,如Spring Cloud Function、Spring Cloud Stream、Spring Cloud OpenFeign、Spring Cloud Commons、Spring Cloud Consul以及Spring Cloud Gateway等。由于Spring现在提供了自己的接口HTTP客户端解决方案,从2022.0.0开始,Spring Cloud OpenFeign将被视为功能完整。
2024-04-23 17:50:44 555 1
原创 抓住春招的尾巴!2024最新Java高频面试题总结(附答案PDF)!
的学习,你不但能拿到 Offer、取得更好的工作,还能建立一个完整的 Java 知识体系,让你学到的所有内容都能转化为实际的生产力,帮你在工作中取得不凡的成绩。这部分包含对面试中必考的集合,除了相关的面试题讲解,更要理清各种集合之间的关系,创建集合之间的联系,这样才能对集合的整体理解做到心中有数。之后我花了大半年的时间,结合自己 4 年多作为面试官的经历,把这些内容整理成文,用大约 15 万字的内容对 Java 的核心知识点和常见的 1000多道面试题,做了详细的介绍,也就是本专栏中你所看到的全部内容,
2024-04-22 11:22:58 756
原创 Redis的持久化机制是怎样的?
在开启混合持久化的情况下,AOF 重写时会把 Redis 的持久化数据,以 RDB 的格式写入到 AOF 文件的开头,之后的数据再以 AOF 的格式化追加的文件的末尾。混合持久化结合了 RDB 和 AOF 持久化的优点,开头为 RDB 的格式,使得 Redis 可以更快的启动,同时结合 AOF 的优点,有减低了大量数据丢失的风险。但是,持久化机制也不是绝对可靠的,归根结底Redis还是个缓存,他并不是完全给你做持久化用的,所以还是要有自己的持久化方式,比如双写到数据库。但是他也比RDB要更加靠谱一些。
2024-04-20 15:55:29 548
原创 什么是序列化与反序列化
在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用该对象。但是,我们创建出来的这些Java对象都是存在于JVM的堆内存中的。只有JVM处于运行状态的时候,这些对象才可能存在。一旦JVM停止运行,这些对象的状态也就随之而丢失了。但是在真实的应用场景中,我们需要将这些对象持久化下来,并且能够在需要的时候把对象重新读取出来。Java的对象序列化可以帮助我们实现该功能。
2024-04-20 15:51:44 1153
原创 什么是分布式系统?和集群的区别?
分布式是针对集中式来说的,先说集中式,集中式系统就是把一整个系统的所有功能,包括数据库等等全部都部署在一起,通过一个整套系统对外提供服务。分布式系统需要各个主机之间通信和协调主要通过网络进行,所以,分布式系统中的计算机在空间上几乎没有任何限制,这些计算机可能被放在不同的机柜上,也可能被部署在不同的机房中,还可能在不同的城市中,对于大型的网站甚至可能分布在不同的国家和地区。分布式系统中的多台计算机之间在空间位置上可以随意分布,系统中的多台计算机之间没有主、从之分,即没有控制整个系统的主机,也没有受控的从机。
2024-04-18 17:40:04 811
原创 ✅限流、降级、熔断有什么区别?
当然,也有在服务端给客户端直接做限流的,一般用于外部服务能力不太行的时候,比如电商网站大促的时候,可能会依赖很多银行的服务,但是银行服务本身可能没那么高的并发, 所以可能在电商网站上自己控制一下QPS,来起到限流的目的,避免下游系统被打挂。举个例子,我提供了一个查询用户信息的服务,给集团内外的很多个调用方使用,但是我为了保证我的可用性,我会对每个调用方做限流,防止某个调用方不守规矩,把我的服务打挂了。通常我们说为了保证系统的可用性,限流、降级、熔断一把梭,但是其实他们是三个不太相同的概念,作用也不太一样。
2024-04-18 17:37:12 903
原创 char和varchar的区别?
如果使用char(100),则插入记录后就分配了100个字符,后续修改不会造成页分裂的问题,而varchar(100)由于没有提前分配存储空间,因为表中数据刚开始插入时,可变长度字段值都是根据实际长度存储下来的,且行与行之间数据也是紧密连续存放在文件地址中的。varchar的优点是变长的字符串类型,兼容性更好;char会在长度不足时,在后面补充空格,所以当我要在一个长度为10的char中,分别存一个"hollis "和"hollis"时,他存储的都是"hollis ",所以会丢失原来存储的空格信息。
2024-04-17 16:33:01 345
原创 Spring在业务中常见的使用方式
订单从确认订单变为支付成功,就要触发物流的发货,财务的记账,edm触达等等。但是,我们在使用事务的时候,一定要注意,不能在事务中处理分布式缓存,RPC等操作,这样做有两个坏处,一个是RPC的RT很长,有可能引起长事务的问题,另一方面是如果事务执行失败进行回滚,RPC操作的调用时无法回滚的。Spring的事务抽象了下游不同DataSource的实现(如,JDBC,Mybatis,Hibernate等),让我们不用再关心下游的事务提供方究竟是谁,直接启动事务即可。我是浮生,一个工作十四年经验的Java程序员!
2024-04-17 16:28:54 649
原创 SpringBoot是如何实现main方法启动Web项目的?
当应用程序启动时,Spring Boot会自动扫描应用程序中所有的Spring组件,并使用默认的配置来启动内嵌的Tomcat服务器。在SpringBoot的启动流程中,会调用SpringApplication.run方法,这个方法会有一个步骤进行上下文刷新(refreshContext),然后这个过程中,会调用一个关键的方法onRefresh。但是,很多人都会忽略一个关键的步骤(网上很多介绍SpringBoot启动流程的都没提到),那就是Web容器的启动,及Tomcat的启动其实也是在这个步骤。
2024-04-16 15:34:07 1098
原创 Spring中用到了哪些设计模式
常见的场景是甲方因为话语权很高,提供了一套交互模型,而所有对接甲方模型的乙方,就需要通过适配器模式来适配甲方的模型和自己已有的系统。对于SpringMVC来说,他会通过一系列的拦截器来处理请求执行前,执行后,以及结束的response,核心的类是handlerExecutionChain,它封装了HandlerAdapter和一系列的过滤器。代理模式和适配器模式的核心区别就在于,适配器模式的目的是为了适配不同的场景,而代理模式的目的则是enhance,即增强被代理的类(如增加日志打印功能等)。
2024-04-16 15:23:00 1063
原创 如何在Spring启动过程中做缓存预热
如果你不想直接监听ApplicationReadyEvent,在SpringBoot中,也可以通过CommandLineRunner 和 ApplicationRunner 来实现这个功能。类似的,我们还可以使用 @PostConstruct 注解标注一个方法,该方法将在 Bean 的构造函数执行完毕后立即被调用。在应用程序启动时,可以通过监听应用启动事件,或者在应用的初始化阶段,将需要缓存的数据加载到缓存中。这个方法的调用我们在Spring的启动流程中也介绍过,不再展开了。这个我们也介绍过,也不展开了。
2024-04-12 17:38:43 723
原创 Spring 中的 Bean 是线程安全的吗?
但是需要注意,Prototype的bean,每次从容器中请求一个 Prototype Bean 时,都会创建一个新的实例。默认情况下,Spring Bean 是单例的,count字段是一个共享变量,那么如果多个线程同时调用 increment 方法,可能导致计数器的值不正确。我们通常把上面这种Bean叫做有状态的Bean,有状态的Bean就是非线程安全的,我们需要自己来考虑他的线程安全性问题。那如果一个Singleton的Bean中是无状态的,即没有成员变量,或者成员变量只读不写,那么他就是个线程安全的。
2024-04-12 17:32:57 1117
原创 什么是观察者模式,有哪些应用?
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式在许多应用场景中都能够发挥作用,特别是在需要处理对象之间的松耦合关系、实时通知和更新的情况下。事件触发时,事件源对象会通知事件处理程序(观察者),以执行相应的操作。8网络通信:在网络应用中,观察者模式可用于实现即时通信系统,其中用户之间的消息传递可以通过观察者模式来实现。7游戏开发:在游戏中,观察者模式可用于处理各种事件,如玩家输入、碰撞检测、角色状态变化等。
2024-04-11 17:51:27 460
原创 设计模式的7大基本原则有哪些?
这要求我们要使用多个小的专门的接口,而不要使用一个大的总接口。里氏替换原则(Liskov Substitution Principle,LSP):任何一个父类出现的地方,都可以用它的子类来替代,而不会导致程序的错误或异常。这个原则鼓励将功能分解为小的、独立的单元,每个单元只负责一件事情。开放封闭原则(Open/Closed Principle,OCP):软件实体(类、模块、函数等)应该对扩展是开放的,而对修改是关闭的。这个原则鼓励将复杂系统分解为许多小的、相对独立的模块,模块之间的交互通过最少的接口进行。
2024-04-11 17:49:08 504
原创 Kafka的架构是怎么样的?
但是,由于重平衡会带来一定的性能开销和不确定性,因此在设计应用时需要考虑到重平衡的影响,并采取一些措施来降低重平衡的频率和影响。Kafka 的重平衡机制是指在消费者组中新增或删除消费者时,Kafka 集群会重新分配主题分区给各个消费者,以保证每个消费者消费的分区数量尽可能均衡。2计算分区分配方案:Kafka 集群会根据当前消费者组的消费者数量和主题分区数量,计算出每个消费者应该分配的分区列表,以实现分区的负载均衡。5恢复消费:最后,Kafka 会恢复所有消费者的拉取操作,允许它们消费分配给自己的分区。
2024-04-09 17:43:14 1139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人