11 IT徐胖子

尚未进行身份认证

我要认证

微信公众号「JAVA前线」

等级
TA的排名 2k+

为什么阿里不允许用Executors创建线程池

欢迎关注公众号【JAVA前线】查看精彩文章1 文章概述《阿里巴巴JAVA开发手册》有这样一条强制规定:线程池不允许使用Executors去创建,而应该通过ThreadPoolExecutor方式,这样处理方式更加明确线程池运行规则,规避资源耗尽风险。本文我们从资源和排查问题两个角度进行分析,同时参考DUBBO线程池声明方式创建一个符合规范的线程池。2 资源角度《阿里巴巴JAVA开发手册》从资源角度对这个问题进行了分析FixedThreadPool SingleThreadPool允许请求.

2020-09-19 12:16:23

三体、孙子兵法和技术系统高可用性

1 非线性我们先来介绍一个概念:非线性。这个概念在我们的生活中无处不在。你要赶早上8点钟的火车,如果6:30出发可以在7:00到达车站,于是你得到一个结论:只要30分钟就可以到达车站。你早上想睡晚一点预计7:10出发,想着7:40可以到达车站。但是最可能的结果是你将错过这趟火车。因为遇上早高峰,堵车导致你至少需要花费1个小时才能到达车站。一个小雪球的重量是100克,打雪仗时你被砸中100次,这对你不会造成任何影响。但是如果你被10公斤的雪球砸中1次,这可能会对你造成严重的伤害。这就是非线性。

2020-09-19 11:56:02

程序员如何思考复杂问题

欢迎关注公众号【JAVA前线】查看精彩文章1 方法论很重要在日常工作中,大家肯定处理过一些棘手的问题。在面临这些复杂的问题时,尤其当问题又很紧急时,有人完全没有头绪,不知道从哪里下手,而有人思路清晰,分析问题有条有理,行动步骤清晰明确。为什么会产生这样的差距?我认为思路清晰的人掌握了一套方法论,这种方法论可以套用在很多场景,让他们在遇到问题时不慌不忙,最终找到问题的答案。程序员在工作中就需要面对很多复杂问题。比如当系统出现问题时,由于系统的复杂性,很难一眼看出问题所在,那么更需要学会解决问题的方.

2020-09-19 11:50:11

面试官问一个数据表字段怎么表示多种业务含义?我愣了五分钟

欢迎关注公众号【JAVA前线】查看精彩文章1 需求背景在系统中用户一共有三种角色:普通用户,管理员,超级管理员,现在需要设计一张用户角色表记录这类信息。我们不难设计出如下方案:idnamesuperadminnormal101用户一100102用户二010103用户三001104用户四111我们使用1表示是,0表示否,那么观察上表不难得出,用户一有用超级管理员角色,用户二具有管理员角色,用户三具有普通用户角色,用户四.

2020-09-18 20:16:23

JAVA8核心语法梳理(1)Lambda表达式、函数式接口、方法引用

1 文章概述JAVA13已经面世一段时间了,但是追根溯源一些新特性例如Lambda表达式、函数式接口、StreamAPI首次还在是出现在JAVA8。这些新特性有些开发者使用并不习惯,尤其链式编程感觉没有代码断句,可读性不强。但是JAVA8之所以逐渐流行确实是因为确实有许多优点:代码优雅易于并行StreamAPIOptional减少空指针现在项目代码中越来越多出现JAVA8语法,为了读懂代码也需要我们熟悉JAVA8语法,本文介绍JAVA8如下重要特性,streamAPI我们下一篇文章再详细介绍

2020-09-18 19:52:26

复杂是技术系统根本属性:为什么代码会变得难以维护

欢迎关注公众号【IT徐胖子】获取更多互联网和技术干货,感谢各位支持1 遗留代码程序员应该都有这样的经历,当接手一份遗留代码时会为此感到苦恼。不仅代码复杂和嵌套结构令人迷惑,而且没有文档和架构图更让人无从维护。当代码维护性几乎为零时,能采用的技术方案只有重构,说白了就是重写。这种情况到底是必然发生,还是仅仅是因为代码不规范导致的?我们先不着急给出答案,这里为大家介绍一本书:《为什么需要生物学思维》,作者是阿贝斯曼。本文谈谈我对这本书的理解,希望可以回答刚才提出的问题。2 复杂系统形成..

2020-07-28 12:21:26

「DUBBO系列」线程池打满源码分析

1 文章概述DUBBO线程池打满是一个严重问题,本文通过一个实例分析如何排查这个问题,首先我们用代码重现这个异常。1.1 生产者配置<beans> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <dubbo:protocol name="dubbo" port="8888" /> <dubbo:service interface="com.itxpz.dubbo.demo....

2020-06-17 19:13:04

「DUBBO系列」线程池策略源码分析

1 文章概述本系列文章已经分析了DUBBO线程模型实现原理,本文简单进行回顾。我们知道DUBBO提供五种线程模型all所有消息都派发到业务线程池,包括请求,响应,连接事件,断开事件,心跳direct所有消息都不派发到业务线程池,全部在IO线程直接执行message只有请求响应消息派发到业务线程池,其它连接断开事件,心跳等消息直接在IO线程执行execution只有请求消息派发到业务线程池,响应和其它连接断开事件,心跳等消息直接在IO线程执行connection在IO线程上

2020-06-07 21:56:31

「DUBBO系列」并发控制源码分析

1 文章概述生产者和消费者提供了并发控制配置,通过并发控制配置项可以实现限流功能,从而有效进行系统保护。本文我们介绍生产者和消费者并发控制怎样配置并且在源码层面分析并发控制实现原理。2 生产者2.1 配置方式HelloService服务每个方法在每个生产节点执行并发数不超过100<beans> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <dubbo:protocol nam.

2020-06-07 21:44:09

「DUBBO系列」责任链模式源码分析

1 文章概述责任链模式将请求发送和接收解耦,让多个接收对象都有机会处理这个请求。这些接收对象串成一条链路并沿着这条链路传递这个请求,直到链路上某个接收对象能够处理它。本文我们介绍责任链模式两种应用场景和四种代码实现方式,最后介绍了DUBBO如何应用责任链构建过滤器链路。2 应用场景2.1 命中立即中断我们实现一个关键词过滤功能。系统设置三个关键词过滤器,输入内容命中任何一个过滤器规则就返回校验不通过,链路立即中断无需继续进行。(1) 实现方式一public interface.

2020-06-07 21:33:57

Redis缓存失效策略思考

1 删除过期数据我们在设置Redis元素时可以指定超时时间,那么Redis如何删除这些超时元素?Redis采用了两种策略:定期删除和惰性删除。1.1 定期删除Redis每隔一段时间就检查哪些KEY已经过期,如果过期就删除。但是我们来设想一个问题:如果Redis存储KEY非常多,仅仅超时检查这项工作就会非常耗费资源并严重影响服务能力。为了解决这个问题Redis并不是检查全量KEY而只是检查部分,同时引入了惰性删除策略。1.2 惰性删除假设当KEY1已经过期,但是由于没有被检查到而未被删除。

2020-06-07 21:20:28

为什么阿里不建议在返回对象中使用枚举

1 文章概述在阿里巴巴开发手册中有这样一条强制规定值得大家关注:【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的POJO对象。我们在日常开发中服务生产者会提供二方包给消费者引用,在返回对象中属性不能包含枚举类型,这是一个强制要求。我们通过一个实例分析:为什么阿里巴巴开发手册中会有这样一条强制要求。2 生产者实例服务生产者提供1.0版本二方包public class StudentDTO implements Seriali.

2020-06-07 21:03:18

先写数据库还是先写缓存

关于维护一份数据是先写数据库,还是先写缓存的问题,很多朋友发表了自己的看法,本文来谈谈我的看法。我的结论非常清晰明确:先写数据库再写缓存。核心思想是数据库和缓存之间追求最终一致性,不追求强一致性。(1) 在缓存作为提升系统性能手段的背景下,不需要保证数据库和缓存的强一致性。如果非要保证二者的强一致性,会增大系统的复杂度,完全没有必要(2) 如果更新数据库成功,再更新缓存。此时存在两种情况:更新...

2020-02-05 08:49:23

Spring中利用配置文件和@value注入属性值

1 简单属性值注入package com.xy.test1;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;@Service // 需要被注入属性值的类需要被Spring管理public class PropertiesSer

2017-02-12 11:11:03

Java自定义线程池和线程总数控制

1 概述池化是常见的思想,线程池是非常典型的池化的实现,《Java并发编程实战》也大篇幅去讲解了Java中的线程池。本文实现一个简单的线程池。2 核心类【1】接口定义public interface IThreadPool<Job extends Runnable> { /** * 关闭线程池 */ public void shutAlldown()...

2017-02-04 10:33:31

Spring中BeanPostProcessors【2】优雅实现业务分离

1 概述BeanPostProcessors可以在spring IoC容器初始化受管Bean前、属性设置后对该Bean先做一些预处理,或者在容器销毁受管Bean之前自己释放资源。《Spring中BeanPostProcessors【1】简单预处理》一文有实例说明。本文介绍一个具体案例,优雅实现业务分离。2 基础类设想一个系统中分很多模块,对于模块又有不同的操作命令,对于不同模块的不同命令场景...

2017-01-24 10:02:00

Spring中BeanPostProcessors【1】简单预处理

1 概述有时我们希望在Spring IoC容器初始化受管Bean前、属性设置后对该Bean先做一些预处理,或者在容器销毁受管Bean之前自己释放资源。Spring IoC为我们提供了多种方法来实现受管Bean的预处理和后处理。Spring中定义了BeanPostProcessors接口:package org.springframework.beans.factory.config;im

2017-01-13 09:04:55

TCP三次握手和backlog参数

1 三次握手TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。为什么非要三次握手呢?谢希仁的《计算机网络》中这样说:为了防止已失效的连接请求报文段突然又传送到了服务端因而产生错误

2017-01-07 07:16:53

RTT(往返时间)和RPC

RTT(Round-Trip Time)往返时间在计算机网络中它是一个重要的性能指标。表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认,不包含数据传输时间)总共经历的时间。RTT由三个部分决定:链路的传播时间、末端系统的处理时间、路由器的缓存中的排队和处理时间。其中前两个部分的值作为一个TCP连接相对固定,路由器的缓存中的排队和处理时间会随着整个网

2017-01-03 09:57:32

操作系统-线程

1 背景自从20世纪60年代提出进程这个概念以来,在操作系统中一直都是以进程为运行的基本单位。直到20世纪80年代中期,人们才又提出了更小的能独立运行的基本单位线程。为什么要引入线程这个概念呢?主要是因为在实际的应用中,人们需要提出一种新的实体,这个实体必须满足两个特性:1 各个实体之间可以并发执行。2 实体之间可以共享相同的地址空间。就像在同一个进程内部的各个函数,共享该

2017-01-01 11:48:17

查看更多

CSDN身份
  • 博客专家
勋章 我的勋章
  • 签到达人
    签到达人
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。