羊羽'Blog

一头扎进代码的汪洋大海...

JVM STW 和 Dubbo 线程池耗尽的相关性

本文转载自笔者发表于【得物技术】微信公众号的同名文章(这里) 1. 背景 在日常的技术支持过程中,经常会遇到如下玄学问题的咨询: 从监控上看,进程资源占用正常。 从监控上看,服务流量平稳,没有流量突增。 从监控上看,线程池状态正常,没有瓶颈。 但是,在上述条件下,上游调用方还是时不时反馈偶现 Thread pool is EXHAUSTED! 接下来笔者来把这...

HTTP请求偶现ConnectionClosedException

现象 基于HTTP协议进行C/S通讯的业务上线后,偶现如下异常,频率大概在两三天一两次: org.apache.http.ConnectionClosedException: Connection is closed 异常提示http请求时,复用的底层tcp连接已经被断开。 排查 要解释这个现象、修复这个问题,需要对齐的上下文很长,笔者尽力一点一点的梳理清楚。 网络通讯技术选型 ...

高效切换JDK版本的技巧和原理

背景 Java语言平台的演进一贯十分重视兼容性,这点从Java泛型特性的实现就可见一斑:为了保证陈年老代码也可以运行在支持泛型的JVM平台上,权衡、取舍过后,泛型的设计者们最终选择在编译期来实现类型泛化能力,虽然说这种实现在某些场景下的理解成本、使用成本很高,但是在jdk1.1环境写的业务代码在jdk1.7环境上啥也不改就可以正常跑,你就说兼容性好不好吧? 但是在云原生思想大行其道的今...

展开讲讲之数字和数字编解码

概述 如果我们要实现一个编解码库,或者通俗的说叫序列化库,用来将内存上的原始数据(对象、结构体等数据实体)编码为便于存储、传输的二进制,首先我们需要分析常见的编程数据实体的构成。 省去具体分析,我们可以知道,编程时的所有数据实体抽象来看,其实都是由如下几种原子类型来编排、组合形成的。 数字类型:分为整数、小数 字符串类型:顾名思义 布尔类型:没有物理上的值,只需要逻辑...

展开讲讲之Unicode字符集和UTF编码

Unicode 为实现跨平台信息交换、展示设计的统一编码,目的是为世界上所有的字符分配一个唯一的数字编号。 编号有个别名叫【码点】,也就是说码点就是一个数字。 编号的空间或者说容量有17*65536(111.4万),可以容纳一百万个字符。 整个空间按种类、使用频率分为17组,每组2^16个字符(65536) 常用的、稳定的字符都放在了0号平面(BMP),编码为0-65535(两...

分布式任务调度核心原理

有一天,老板找到小明说:“公司都没有一个趁手的分布式任务调度系统,准备自研一个。组织经过慎重考察,决定把这个艰巨但光荣的任务交给你。你抓紧调研下,出个技术方案,尽快落地。要快~” 小明很懵,大大的眼睛盯着老板说:“我就是个curd boy,没做过,我不会呀” 老板说:“我会吗?美国佬会,苏联老大哥也会,可是他们不会白白的送给你!” 于是小明开始吭哧吭哧卷起来了。。。 ...

如何高效编排Dubbo异步请求

概述 在复杂的业务场景下,在处理一个请求时,可能会衍生出大量的向下游的请求。 如上图,处理一个上游请求时,会向下游发散请求10次,将10个下游接口返回的数据进行处理、归并后,完成自身业务逻辑处理并返回上游。 如果是串行的向下游发起10个请求,那整个请求处理的耗时将起码是10个下游响应RT之和,这样整个请求处理的性能会很差,无法满足C端链路上的SLA。 为此,开发同学一般会通过异步、并...

Mac开发提效之巧用make命令

概述 日常开发、测试工作中,大家一定会各个场景遇到一些流程繁琐但固定的动作,比如jar包发布、依赖检查等。 如果大家熟悉一门用起来糙快猛的脚本语言,那上述的很多流程其实都可以用命令脚本固定下来,比如shell、python等。 MacBook给了大家一个*unix开发环境,预装了简单易用、兼容性强的shell脚本引擎。 所以一般情况下都可以使用shell语句解决,大家比较常见的使用方式是写过...

浅析转义字符

TL;DR 转义字符不是天然存在的,它的实现需要各个应用程序自行实现字符串转义解释器来进行解释、替换。 概述 转义字符(Escape Character)是指在ASCII码和Unicode等字符集中的无法被键盘录入的字符、被当作特殊用途而需要转换回它原来的意义的字符。而转义字符的转义是指字符已经被转换了意义。 一直到前段时间我都认为转义字符是公共的、统一的、规范的约定,然而当我深入的...

Java正则表达式要点和案例

概述 正则表达式是文本处理的一大利器。在文本的校验、查找、替换三个场景下有巨大的代码提效效果,本文主要介绍JDK中java.util.regex包提供的对正则表达式的支持。 java.util.regex有三个核心类: Pattern类:Pattern是一个正则表达式的编译表示。 Pattern类是一个比较重的类,它的初始化伴随着正则解析。它是线程安全的,使用过程中注意单例、重用...