1背景消息队列作为发布订阅模型的消息中间件广泛应用于上下游业务集成场景。在实际业务场景中,同一个主题下的消息往往会被多个不同的下游业务方处理,各下游的处理逻辑不同,只需要关注自身逻辑需要的消息子集。所以在消息中心和消费者之间,需要有一种消息过滤功能,可以帮助消费者更高效地过滤自己需要的消息集合,避免大量无效消息投递给消费者,降低下游系统处理压力。ApacheRocketMQ很好的支持了这一能力,它解决了单个业...
2023-11-16 14:49:28 2282浏览 0点赞 0回复 0收藏
1背景在互联网业务的实际应用场景中,消息的批量处理是非常必要的,因为我们时刻面临着大量数据的并发执行。例如,我们在一个业务交互的时候会有大量的分支行为需要异步去处理,但是这些动作又是在不同的业务粒度上的,所以我们需要多次调用MQ写入消息,可能有多次的连接和消息发送。这个写MySQL数据库是一样的,多次建连和写入,跟一次建连和批量数据库,性能是完全不能比的。所以我们需要有MQ有批量消息的能力来对我们的业务...
2023-11-16 14:49:13 2168浏览 0点赞 0回复 0收藏
1介绍互联网行业内在进行微服务高可用建设的时候,不可避免的要考虑一个事情,如何部署才能提高系统的可用性和稳定性。所以一般情况下,不会只部署一个机房,这样无法完全避免一个机房内网络故障、机房断电,遭受区域网络攻击的风险。所以有了多机房建设的,但是多机房建设同样也有问题,他们无法近距离的部署,如果部署区域太近(如在同一个城市),依然无法避免区域断电、洪灾、水灾、火灾、地震等灾难情况的发生。所以业内的...
2023-11-16 14:48:37 1939浏览 0点赞 0回复 0收藏
1介绍大家都知道,一个主机(或称为节点)可以部署多个Pod,Pod作为Kubernetes中的最小部署单元。是一组一个或多个紧密关联的容器的集合,它们共享相同的网络命名空间和存储卷。一般来说,服务上云之后,我们的服务会配置antiaffinity(反亲和调度),他有哪些利弊权衡呢:affinity可以实现就近部署,增强网络能力实现通信上的就近路由,减少网络的损耗。如同一个BCC聚类多个实例Pod。antiaffinity反亲和性主要是出于高可靠性考...
2023-11-16 14:48:16 1665浏览 0点赞 0回复 0收藏
1Redis操作规范1.1缓存的使用时机判断【建议】系统为单体系统,整体QPS小于200的,不建议草率引入缓存,应该有更多的办法进行效率提升缓存的引入根据系统的业务流量、应用规模而定,对于系统规模小低并发低流量的应用而言,引入缓存并不会带来性能的显著提升,反而会带来应用的复杂度以及较高的运维成本。【建议】响应能力,数据响应的正常容忍度为0.5s,临界容忍度为2s,当我们发现响应时间超建议值,并没有太大优化空间的时候...
2023-11-16 14:47:34 2256浏览 0点赞 0回复 0收藏
1介绍Redis是我们在业务开发中很重要的一个辅助,能够极大提高我们系统的运行效率,为后端的存储服务减少压力,提升用户使用体验。但是作为一个辅助提升速度的组件,如果自己存在请求延迟的情况,那将是一个巨大的灾难,可能引起整条业务链路的雪崩。在我以往的博客里面,也有过相应的案例,比如《架构与思维:一次缓存雪崩的灾难复盘》。但在实际业务场景中,可能有更加复杂的原因导致Redis访问效率变慢,下面我们...
2023-11-16 14:47:13 2199浏览 0点赞 0回复 0收藏
golang的nethttp库是我们平时写代码中,非常常用的标准库。由于go语言拥有goroutine,goroutine的上下文切换成本比普通线程低很多,nethttp库充分利用了这个优势,因此,它的内部实现跟其他语言会有一些区别。其中最大的区别在于,其他语言中,一般是多个网络句柄共用一个或多个线程,以此来减少线程之间的切换成本。而golang则会为每个网络句柄创建两个goroutine,一个用于读数据,一个用于写数据。下图是nethttp源码...
2023-09-21 11:52:36 2186浏览 0点赞 0回复 0收藏
在mysql建表sql里,我们经常会有定义字符串类型的需求。CREATETABLEuser(namevarchar(100)NOTNULLDEFAULT''COMMENT'名字')ENGINEInnoDBDEFAULTCHARSETutf8mb4;比方说user表里的名字,就是个字符串。mysql里有两个类型比较适合这个场景。char和varchar。声明它们都需要在字段边上加个数组,比如char(100)和varchar(100),这个100是指当前字段能放的最大字符数。char和varchar的区别在于,varchar虽然声明了最大能放100个字符,但...
2023-09-21 11:52:03 4566浏览 0点赞 0回复 0收藏
问题发现上次我们说了堆外内存导致的FGC:JVM堆外内存导致的FGC问题排查这次线上环境又在频繁的FGC,问题是在堆内,jvm调优箭在弦上。堆空间分区堆空间分区说明Eden:伊甸园区,新创建对象存储区域SurvivorMemoryspaces(S0,S1):幸存区,发生minorgc时,幸存区的对象全部复制到另一个里面去。Old:老年代,存放经过几次垃圾回收幸存下来生命周期较长的对象。对象在堆中的生命周期新生代对象分配到Eden,当Eden空间被对象...
2023-07-06 11:34:14 3453浏览 0点赞 0回复 0收藏
问题发现服务在线上环境频繁的FullGC。把相关运行时数据区的监控打开,发现堆外内存一直在上升。我使用的版本是java8,jvm厂商是orcalehotspot,垃圾回收器使用的CMS+ParNew。我使用的jvm参数是:Xmx6gXms6gXX:NewRatio1XX:+UseConcMarkSweepGCXX:CMSInitiatingOccupancyFraction75XX:+UseCMSInitiatingOccupancyOnlyXX:MaxTenuringThreshold6XX:+ParallelRefProcEnabledXX:+CMSParallelRemarkEnabledXX:+UseCMSCompactAtFullCo...
2023-07-06 11:33:03 2939浏览 0点赞 0回复 0收藏
哲学罗曼罗兰说过,世界上只有一种英雄主义,那就是看透生活的本质,仍然热爱生活。为啥要异步这篇记录下异步编程的东西。异步编程有点难以理解,这东西感觉不符合常理,因为我们思考都是按照串行的逻辑,事都是一件一件办,步子迈大了,咔,容易扯着蛋。但在异步计算的情况下,充分利用cpu资源,而任务回调往往分散在代码片段中,需要理解其中的意义,可不是一件容易的事。最难搞的就是组合,嵌套。如果再加上递归,派发等...
2023-07-04 12:36:06 2713浏览 0点赞 0回复 0收藏
哲学最近看到了一句话:定乎内外之分辩乎荣辱之境。一个外国作家也说过:我生命里的的最大突破之一,就是我不再为别人的看法而担忧。此后,我真的能自由的去做我认为对自己最好的事,只有在我们不需要外来的赞许时,才变得自由。说的都很好。人就是要突破自己,就像许三多,不要在意别人的看法,做自己认为有意义的事,今天比昨天好,这不就是希望。监控思考完一波哲学,开始搞搞软件上的东西。这篇记录下监控配置相关的知识。...
2023-07-04 12:35:41 4246浏览 0点赞 0回复 0收藏
定义Immutable不可变finaljavafinal关键字关于final关键字有一点思考。就像最近在思考的另一句话:不能听命自己者,必将受制于他人!可变与不可变在final关键字上出现了点理解上的问题,不知道这玩意什么时候用。在翻阅一部分代码的时候,经常发现某几个对象,有几十个上百个属性,每个属性都是一个getset方法。然后这个对象出现在很多上下文中,导致你根本不知道某个属性是哪里设置的。最极端的是一个万能的类,包含了N多个属...
2023-07-04 12:33:23 2251浏览 0点赞 0回复 0收藏
在项目中是否有遇到过这样的需求?你负责的项目需要一个功能,但是这个负责实现这个功能却不是你,很可能是第三方厂商给你的一个服务。那么如何保证插件化呢?有时候我会想spring是怎么做的,spring如何做到适配不同的数据库连接池,不同的缓存组件呢?带着疑问,我翻阅了下Spring的源码,关于缓存抽象这部分。首先我去查看官方文档,SpringBoot只留下了简短的几行话,首先是开启EnableCaching,然后更多文档请移步SpringFramew...
2023-07-04 12:33:00 2084浏览 0点赞 0回复 0收藏
1.前文回顾在之前的几篇内存管理系列文章中,笔者带大家从宏观角度完整地梳理了一遍Linux内存分配的整个链路,本文的主题依然是内存分配,这一次我们会从微观的角度来探秘一下Linux内核中用于零散小内存块分配的内存池——slab分配器。在本小节中,笔者还是按照以往的风格先带大家简单回顾下之前宏观视角下Linux内存分配最为核心的内容,目的是让大家从宏观视角平滑地过度到微观视角,内容上有个衔接,不至于让大家感到突兀。下...
2023-05-24 15:21:50 3182浏览 0点赞 0回复 0收藏
在上篇文章《深入理解Linux物理内存分配全链路实现》中,笔者为大家详细介绍了Linux内存分配在内核中的整个链路实现:但是当内核执行到getpagefromfreelist函数,准备进入伙伴系统执行具体内存分配动作的相关逻辑,笔者考虑到文章篇幅的原因,并没有过多的着墨,算是留下了一个小尾巴。那么本文笔者就为大家完整地介绍一下伙伴系统这部分的内容,我们将基于内核5.4版本的源码来详细的讨论一下伙伴系统在内核中的设计与...
2023-05-24 15:15:09 2790浏览 0点赞 0回复 0收藏
在经过上篇文章《从内核源码看slab内存池的创建初始化流程》的介绍之后,我们最终得到下面这幅slabcache的完整架构图:本文笔者将带大家继续从内核源码的角度继续拆解slabcache的实现细节,接下来笔者会基于上面这幅slabcache完整架构图,详细介绍一下slabcache是如何进行内存分配的。1.slabcache如何分配内存当我们使用fork()系统调用创建进程的时候,内核需要为进程创建taskstruct结构,structtaskstruct是内核中的核...
2023-05-17 17:13:39 3317浏览 0点赞 0回复 0收藏
在上篇文章《细节拉满,80张图带你一步一步推演slab内存池的设计与实现》中,笔者从slabcache的总体架构演进角度以及slabcache的运行原理角度为大家勾勒出了slabcache的总体架构视图,基于这个视图详细阐述了slabcache的内存分配以及释放原理。slabcache机制确实比较复杂,涉及到的场景又很多,大家读到这里,我想肯定会好奇或者怀疑笔者在上篇文章中所论述的那些原理的正确性,毕竟talkischeap,所以为了让大家看着安...
2023-05-17 17:08:44 3582浏览 0点赞 0回复 0收藏
在企业开发中,系统的配置信息往往会分不同的环境,如开发环境、测试环境、生产环境。当我们使用nacos作为配置中心时,一定会遇到的问题就是在应用中配置nacos的serveraddr时测试环境的nacos地址和线上nacos地址如何区分的问题拿开发环境和正式环境来说,比如开发环境的nacos地址是nacos.dev.biggerboy.com:8848而正式环境是nacos.biggerboy.com:8848当在开发环境开发完成准备上线时如何将nacos地址切换为正式环境呢?修改配置...
2023-02-08 14:16:05 4548浏览 0点赞 0回复 0收藏
昨天看到一个MySQL数据库设计原则:强烈建议表的主键使用整型自增主键。为啥呢?要弄明白这个问题首先需要了解MySQL是如何维护数据的,你需要知道以下几点:MySQL的InnoDB存储引擎是在B+树上维护表数据的B+树是一种平衡树在这棵树上,每个节点在计算机中叫做数据页,默认16k树的叶子节点是完整的行数据,非叶子节点是主键叶子节点中的行数据按id从小到大的顺序排列PS:MySQL索引底层数据结构详细分析过程参考这篇深入分析My...
2023-02-08 14:14:41 3584浏览 0点赞 0回复 0收藏