- 博客(36)
- 收藏
- 关注
原创 让程序员最爽的ThreadLocal使用姿势
一、常见场景1、ThreadLocal作为线程上下文副本,那么一种最常见的使用方式就是用来方法隐式传参,通过提供的set()和get()两个public方法来实现在不同的方法中的参数传递。对于编程规范来说,方法定义的时候是对参数个数是有限制的,甚至在一些大厂,对方法参数个数是有明确规定的。2、线程安全,每个线程维持自己的变量,以免紊乱,像常用的数据库的连接池的线程安全实现就使用了ThreadLocal。二、进阶使用 以参数传递为例子,如何更好地使...
2022-01-16 17:36:54
6351
8
原创 一场事故告诉你zookeeper和nacos谁更适合做注册中心
前言在分布式系统中,注册中心充当着重要角色,是服务发现、客户端负载均衡中不可缺少的一员。注册中心除了能够实现基本的功能外,他的稳定性、可用性和健壮性对整个分布式系统的流畅运行影响重大。dubbo作为国内一款主流的分布式系统,支持的注册中心有zookeeper、nacos和redis等第三方中间件,同时也支持Simple和Multicast的方式。zk和nacos可能是最常使用的方式,到底谁更胜一筹呢?以下的事故现场便有答案。在分布式系统中,服务往往由提供方来定义,并给出服务定义的sd...
2022-01-03 14:08:42
11560
4
原创 kafka与rabbitmq简单对比
1、语言 Kafka:采用目前比较主流的Java语言开发,运行依赖于JDK,比较适合Java开发者做源码深入或者加入其开源社区成为一个committee。 Rabbitmq:采用erlang语言开发,一种广泛应用在电信通信行业的语言。2、通信协议Kafka:自己基于TCP实现的专有协议,Kafka的专有通信协议不包含Schema,内容简短,同时多条消息压缩的batch处理方式,减少了网络和CPU处理的压力,也是kafka吞吐量大的原因之一。...
2021-09-03 23:28:34
161786
1
原创 解读springMVC启动以及请求处理过程
giegie我们一起学习啊,天呐,giegie跟我一起学习,你女朋友知道了,不会生气吧,你女朋友好可怕,不像我,我只想跟giegie学习。
2021-06-02 19:17:12
6627
6
原创 畅游Spring启动过程的奇妙世界
Spring’s flexible and comprehensive set of extensions and third-party libraries let developers build almost any application imaginable. At its core, Spring Framework’sInversion of Control (IoC)andDependency Injection (DI)features provide the foundation...
2021-05-05 16:32:20
149381
10
原创 通过JDK源码来学习观察者模式
观察者模式:在该模式中,主要对象有观察者和被观察者,当被观察者发生改变的时候,观察者能够得到更新通知。功能上听起来有些像发布订阅模式,但是与发布订阅模式有很大的差异。发布者与订阅者之间是有一个server的,之间的消息会通过server进行通信,就像kafka、Redis之类的一样;而在观察者模式中,被观察者会维护着一个列表,该列表保存着观察者,当变化时,就直接对观察者进行更新通知,所以更像是一种拥有并直接通知的关系。在Java中,早在JDK1.0的版本就自带了观察者模式,提供了一个观察者的接.
2021-04-01 00:29:23
150129
1
原创 应用层面上数据库连接池的一些优化措施
CURD一时爽,故障来了火葬场。作为一个软件开发者,除了要能够应对业务功能需求之外,掌握一些优化方法和应用场景是一道必经的成长之路。如今职业教育培训行业里流水式打造出来的coder,加上每年211/985高校毕业出来不少IT行业的佼佼者,行业内卷化越来越严重,不去提高自己,只会慢慢变得毫无竞争力。局限于CURD,当应用上线出现异常,不会排除,给不出解决方案,一次次表现机会拱手让人,升职加薪与自己毫无关系。本文一起来讨论一些数据库连接池上的一些优化措施,让应用跑得流畅,让自己解放。数据库连接池提升了编
2021-02-03 00:10:55
16217
原创 爬了深圳3W+二手房我发现了这些秘密
最近上海楼市已疯,传闻二手房源近乎无库存,价格飙升之后政府出台夫妻离婚三年内持房数按照离婚前计算的对应政策。刚需带上来金融属性,让人为之折腰,在疯狂的楼市下,来看看深圳的市场行情。
2021-01-26 00:34:56
17122
2
原创 通过Python matplotlib画图发现了MacBook pro苹果系统MacOS的bug
现象描述在做数据分析的过程中,用matplotlib做数据可视化,无意间发现了一个有趣的现象,用一个程序打开了两个figure窗口,窗口打开后,注意该程序运行后的进程并没有结束,接着把其中一个窗口全屏展示,然后就发生了在两个界面来回切换,如下视频显示。MacOS的版本号:10.15.5 (19F101)。 bug复现演示视频原因猜测两个figure窗口同属于一个进程,把其中一...
2021-01-19 17:38:07
636
1
原创 爬虫:一种打破3000套限制爬取所有链家二手房源的方法
本人在爬取二手房的时候,发现链家网站的每个链接最多只能有100页,每页30套房源,那么就是3000套。很多网友也遇到了类似的情况,经过对页面的探索,这里提出一种爬取所有房源的方法。
2021-01-14 19:08:05
22944
7
原创 千万级实时并发计算设计
本文简单介绍一个系统监控告警AI异常检测实时计算的架构数据归一化由于数据采集工具多样性,自然导致数据格式的多样性,所以需要对数据格式进行统一。比如对数据库层面的监控、对应用层面的监控,主机的监控,网络的监控,每种监控采用的方式不一样,工具不一样,采集出来的数据格式也会不一样,作为告警引擎中心,需要对监控采集值的格式进行转换,统一格式。当采集端把数据传输过来的时候,先通过一个数据转换的应用(代理)把数据处理成统一的格式。又由于网络环境的不一,同时加上安全要求,还需要对不同的环境提供不同的接收方式,一种
2021-01-10 15:23:30
498
1
原创 commons-lang2.6在高并发下使用ExceptionUtils.getFullStackTrace()获取异常详情导致的性能下降
某天,在不知情的情况下,实施私自接入了某其他平台数据,由于数据不规范,导致生产出现阶段性大面积异常报错,有大量线程阻塞,处于BLOCKED状态,应用性能下降一倍。通过线程堆栈日志定位到:阻塞线程都阻塞在org.apache.commons.lang.exception.ExceptionUtils.getCause()处,并且在等待的是一个对象锁,查看源码(commons-lang的2.6版本)发现getCause中会先获取锁,然后通过反射的方式获取异常的详情,反射存在性能问题,在高并发下,导致大量线程阻塞
2021-01-06 21:22:58
171334
1
原创 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户使用起来就需要在不同产品工具间来回切换操作,为了提高用户友好性,同时重要的是能够方便的往外推广,这时候就需要打造一个集各个产品的平台,或者说简单点就是弄个统一入口,这个平台提炼了其他各个产品的优点进行整合。新平台说白了只是一个壳子,很多核心功能的实现是在其他各个产品达成的,有现成的接口,新平台的大部分研发工作是对现有的接口进行整合。很多功能的实现只需要调用第三方接口即可,这时候就可以使
2020-12-23 21:22:16
170664
1
原创 MAC crontab定时任务不执行shell
很多文章都有说到这个问题,原因有这么几个:1、cron进程是否启动ps -ef|grep cron2、cron配置是否正确书写这个一般没有问题,看看苹果开发社区3、shell执行的环境是否设置一般需要要shell脚本前面加上如下两行#!/bin/bashsource /etc/profile4、shell脚本是否有问题这个把脚本在终端手动执行一遍,看一下能否到达效果5、目录权限问题这个问题也是一直困扰我好久的问题,以上四点都没有问题的情况的下,建议尝试一下换个目录,我把shell
2020-12-20 00:26:10
3232
3
原创 RestTemplate超时配置引发的宕机事故让经理念叨了一年
想必很多数据中台,会集成很多系统的数据然后进行统一的规划处理,一些业务场景实现中必然少不了对第三方系统的依赖。在一个业务场景中,当用户在线的时候,就需要实时地去请求第三方接口获取相关信息,这是一个对实时性要求比较高的场景。用RestTemplate去请求第三方接口的时候,用了默认配置,没有设置超时时间,也就没有降级处理机制。某一天,第三方服务出现了故障,导致我们请求一直没有得到返回,然后请求线程一直在等待,一个用户每一分钟一个这样的请求,数量慢慢上来,最终不一会就耗尽了机器线程数,应用宕机。通过下面的例
2020-12-17 17:44:15
173298
1
原创 SpringBoot定时调度Scheduled默认配置(单线程)导致的业务延迟
项目后台组件运用了Schedule每分钟启动一个job把数据发送到kafka(生产者),通过kafka的负载均衡分发到消费者中。在某个夜黑风高的夜晚,运维GG通过监控发现kafka写入出现每分钟不连续的现象,在没有数据写入的时段,消费线程一直处于等待状态。由于除了生产者任务job之外,还在存在其他定时job,随着业务的发展,其他job的数据量上升之后,加上Schedule调度使用了默认的配置,在一个分钟内处理不完所有的定时job,导致下一分钟的job任务得到不到执行,从而导致了业务延迟。通过下面的例子来
2020-12-15 01:05:01
173504
1
原创 论细节的重要性——一个括号让生产日志狂打不停
究竟是什么让生产日志分分钟就刷满一个文件,让运维大跌眼镜,让开发绞尽脑汁。一次版本上线了几个定时任务,然后奇怪的事情就发生了,当去查看日志文件的时候,内容全是一行相同的内容,100M的日志文件,一分钟就可以刷满一个。根据日志文件内容定位到日志打印代码处,然后review上下文代码,发现运算的时候一个少写了括号让结果直接变大了100W倍。有一个时间段的数据需要处理,如果开始时间startTime到结束时间endTime的时长大于 length * 1000L的话,需要进行分片处理,避免时长过大,数
2020-12-10 22:04:49
1091
原创 Java代码重置kafka0.10.1.0版本的偏移量offset
如果使用的自动提交偏移量的模式,偏移量会给到kafka或者zk进行管理,其中kafka的偏移量重置给了重新消费kafka内未过期的数据提供了机会,当消费者出错,比如消费了数据,但是中途处理失败,导致数据丢失,这时候重置偏移量就是一剂后悔药,让消费者能够重新来过,当然后悔药也是有保质期的,还得取决于数据的保留策略。这里讨论一下kafka_2.11.0.10.1.0版本重置偏移量的方案该版本kafka不像其他版本一样,通过执行一句方便的命令就可以重置到指定的偏移量,本文给出了一种通过Java代码来重置偏
2020-12-09 22:59:33
154162
原创 记一次生产大对象导致的OOM让架构师连夜排查解决
为何半夜告警电话狂打不停,为何上线用户投诉不断,是道德的沦丧还是人性的扭曲,NO,是代码的缺陷。Java8的JVM内存管理中,大对象生成直接放入老年代的,当老年代空间不足,就会进行FullGC,频繁的生成大对象,会进行频繁的FullGC,甚至直接OOM导致应用宕机。有时候一段平平无奇的代码,看似温柔,实则暗藏着巨大隐患,这时候算法显得格外的重要,这也是为什么算法是一些大厂招人必备考核项目的原因之一。如何去用最短的时间,最少的空间去使整个产品更加健壮流畅。在某个场景中需要计算出时长,已知开始时间,
2020-12-06 15:17:51
170736
原创 剪绳子后面的数学原理
先来看一个一般性问题:周长一定为n,这时候长length与宽width在什么情况下,达到面积s最大s = length * width设length = x则:width = n/2 - x所以 s = x * (n/2 - x)= -x^2 + n*x/2求导s' = -2x + n/2s' = 0 --> 得 x = n/4(0,n/4)区间,s'>0,S单调递增(n/4, n)区间,s'<0,S单调递减n/4为极大值点所以在长度x=n/4的时候,S的面
2020-12-02 17:16:25
446
原创 记一次生产MongoDB聚合游标遍历计数导致CPU过高及解决方案
在项目前期,为了赶业务需求进度,保证系统先上线,赢取用户,提前占领市场份额,开发的代码往往比较粗糙,考虑的问题不够全面。当用户慢慢变多,数据量上来之后,很多问题就会慢慢暴露出来。这些问题无论是在编码细节上、整体架构设计上以及技术选型上都会存在或多或少的问题。来看一下MongoDB游标遍历导致的应用主机CPU使用率高问题,数据存放在MongoDB数据库中,该表数据量有100W左右。在本次业务场景中,给用户展示的数据需要进行对聚合查询,由于数据量大,还需要分页,需要分页的话,每次聚合查询都需要进行总
2020-12-02 12:38:28
171238
3
原创 通过企业服务治理中心调用第三方接口差点造成http请求走私攻击
http和tcp的关系1、由七层网络模型来看,tcp位于传输层,而http位于应用层。2、http是建立在TCP连接上的,在老版本的http中,一次http请求就会建立一次TCP连接,http请求完成之后会断开tcp连接,也被称为短连接,但是随着互联网的发展,短连接请求的方式开销大,效率不高,所以在新版本的http中会复用一个tcp连接,减少了频繁的TCP连接打开和关闭带来的消耗。http报文格式1、起始行起到对报文进行描述的作用,位于报文的第一行,请求报文和响应报文的起始行格式有所不同
2020-11-30 21:45:58
169429
原创 从初级开发给大龄架构师review代码来看慢慢人生路
本人就职于世界前30强旗下科技公司,初级小开发一枚,组内现在仅存一位年龄40+的架(zhen)构(shui)师(a)一次版本需求,我们的架构师写了一个消费者-生产者的代码,快要到发版了都无法正常实现业务功能,这时候私下找我一起看一下代码,如下问题:在生产者这边给一个对象的属性进行赋值A,这消费者那边取不到A,因为把对象属性拿出来赋值的时候进行了类型强转,所以新开辟了内存空间,不再指向对象原来的地址,这时候需要进行set回去一个对象中有一个Map属性,但是没有指定Map的键值对的数据类型(实际业务
2020-11-25 23:18:36
23118
1
原创 first Django 笔记
安装Django1、pip install django使用import django导入Django模块打印版本号没有报错 说明成功2、建立项目到自己系统的某个目录中(自己想放哪里就放哪里)建立Django项目我自己是在F:\Python_Data analysis\python_work\下建立的使用语句django-admin startproject 项目(站点)名称(自己想叫啥叫啥) ...
2018-07-12 12:45:47
445
原创 Python使用pip安装出现SyntaxError: invalid syntax
在Python命令行里安装pandas模块,出现如下错误>>> pip install pandas File "<stdin>", line 1 pip install pandas ^SyntaxError: invalid syntax解决方法:退出Python命令行,然后进行安装...
2018-07-08 15:17:46
113702
27
原创 template/simple/select.ftl出错
Error on line 69, column 13 in template/simple/select.ftlstack.findValue('top') is undefined.It cannot be assigned to itemKeyThe problematic instruction:----------==> assignment: itemKey=stack.fi
2017-12-21 10:17:50
981
原创 are both configured to produce the output file
在网上找了半天都没有具体的方法,就自己尝试解决,最后成功解决了问题,希望对大家有用,不喜勿喷。VC6.0中,写了两个.c文件,一个为C_DATA_property.c,另一个为Static.c,在两个程序都没有语法和逻辑错误的情况下,编译运行的时候出现了are bothare both configured to produce the output file 的提示错误,如下图
2016-10-14 20:09:08
2168
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人