架构
文章平均质量分 60
天涯泪小武
开源贡献者,有代码洁癖。京东coder。
展开
-
springboot搭建流式响应服务,SSE服务端实现
譬如用户请求一篇长文,在数据库里有很多个段落,我们也不希望一次性全部查询完毕再返回给客户端(耗时太久),而是希望查一段就返回一段,逐次批量返回给客户端。如以上代码,返回的对象是SseEmitter,每次调用emitter.send()方法,客户端就会收到一条消息,即一次响应,响应结束的标志是调用emitter.complete方法。当服务端每次调用emitter.send方法时,客户端的onEvent就会触发一次,同理,onOpen,onClose,onFailure都对应服务端的对应方法调用。原创 2023-09-04 10:53:39 · 6331 阅读 · 2 评论 -
将json字符串从外层到最内层依次连接,平铺成一个List<String>
这样能得到整个json的所有key,如果需要排重,可以用Set。就是将json平铺的功能,如。原创 2023-03-09 16:09:55 · 955 阅读 · 1 评论 -
java实现简单的字符串解析匹配运算规则引擎
有这样的需求,我有一个map,里面放了一些key-value,自定义了一些规则,如age==24&&name==aom||phone==123456789,希望能有个引擎能判断出这个Map里的值,是否匹配上这个规则,规则里有一些简单的运算,如==、contains等。规则是动态可变的,这样就可以灵活控制命中了规则的数据能进行一些采集。整体比较简单,不支持复杂的(),最好是平铺的一些规则。我做了一个这样简单的工具,目前可以支持。这些常用的一些基本规则。原创 2023-03-07 18:17:47 · 878 阅读 · 0 评论 -
Java中的语法树结构
CaseTree 实现了JCStatement,但接口JCCase是继承了Tree。当为 Object o = int.class.toString();下面来看JCNewClass的语法结构,如下截图。实例类与类声明时的两个值不太一样。语法树截取后图如下所示.转载 2022-09-06 16:42:39 · 1058 阅读 · 0 评论 -
高并发监控[一]:TP90、TP99耗时监控设计与实现
背景性能测试中,我们经常选择TP90、TP95、TP99等指标项作为性能对比的参考水位, 在本文中,我们给出一种计算 TP90、TP95 和 TP99 等水位线的方法,首先我们解释一下TP90、TP95、TP99的含义.TP90: 即 90% 的数据都满足某一条件. TP95: 即 95% 的数据都满足某一条件. TP99: 即 99% 的数据都满足某一条件.我们之所以说其“满足某一条件”,是因为在计算的时候,我们既可以向前计算也可以向后计算,例如:1, 2, 3, …, 98, 99,转载 2022-04-11 19:13:16 · 1145 阅读 · 5 评论 -
关于压缩后字符串写入clickhouse再读取后无法反解压的问题
我们将一个长字符串进行了压缩,采用zstd或者snappy之类的,将字符串压成了byte[],然后将byte[]作为一个属性写入了clickhouse数据库,clickhouse会默认将byte[]转为String进行存储。但是当从数据库读取到该字段,得到一个String类型的值,再用getBytes()方法获取到byte[],再试图用zstd的反解压功能对该byte[]试图还原为压缩前的字符串时,会发现报错,已经无法解压还原了。对应该图的情形,运行会报错那么做了如下修改,设置编码方..原创 2022-03-15 10:28:49 · 1608 阅读 · 0 评论 -
工商银行分布式服务C10K场景的解决方案
Dubbo是一款轻量级的开源Java服务框架,是众多企业在建设分布式服务架构时的首选。中国工商银行自2014年开始探索分布式架构转型工作,基于开源Dubbo自主研发建设了分布式服务平台。Dubbo框架在提供方消费方数量较小的服务规模下,运行稳定、性能良好。随着银行业务线上化、多样化、智能化的需求越来越旺盛,在可预见的未来,会出现一个提供方为数千个、甚至上万个消费方提供服务的场景。在如此高负载量下,若服务端程序设计不够良好,网络服务在处理数以万计的客户端连接时、可能会出现效率低下甚至完全瘫痪的情况,即转载 2022-01-12 16:33:06 · 587 阅读 · 2 评论 -
java在filter中修改一个http请求出入参内容
response保存了请求的返回信息,里面有个outputstream,你要返回给页面的流,都在这个地方保存.之前遇到一个问题,想把outputstream修改一下.因为这是个输出流,想要改这个里面的东西不是这么简单的.sun为我们提供了这么一个工具HttpServletResponseWrapper抽象类,利用这个类的子类把servletresponse包装一下,在过滤器中使用,就可以去除response的文件流,对其作出修改.给出一个实现:import javax.servlet.Ser...原创 2021-08-16 15:41:37 · 1109 阅读 · 0 评论 -
京东app后台多端融合架构代码重构实战
一 简介重构是一个非常常见且古老的课题,涉及重构的文章、书更是不可胜数。但其实做程序做久了就会知道,想把一个复杂的系统做好,尤其是参与人数较多的中大型项目,靠看几本设计模式的书,去试图寻找设计模式的奥秘,其实是不够的。很多时候,看书时觉得很有道理,例子也能理解,但到实际开发时,却无从下手,不知道怎么灵活套用。很多项目,在持续的版本迭代中,还伴随着人员的更替过程,往往为了解决眼前的需求,最常见的就是直接复制类似的逻辑,或者就是在末尾追加逻辑。同时,受限于对老版本的需求理解,很容易出现新需求覆盖老需原创 2021-08-15 10:02:53 · 2875 阅读 · 1 评论 -
java protobuf 服务端接收任意protubuf对象
这个需求还算比较常见的,作为一个统一的服务端项目,有多个其他的服务在往该服务发消息,不同的服务定义的数据对象各不相同,那么如何用一个统一的对象把这些发来的消息都接收下来呢?举例:譬如有10个服务要把自己的出入参发给服务A,服务A用来做出入参日志的记录保存工作,这10个服务都有自己的出入参,对象也各不相同,而且随时有变更的可能。作为服务A肯定是无法把这10个服务的出入参对象都定义出来,然后再做protobuf的解析的。那么就需要一个统一的类对象来接收这么些个不同的对象,本篇就是解决这个问题的。解决方案原创 2021-08-06 17:58:52 · 1383 阅读 · 0 评论 -
京东猎户座发布开源,配置化一键生成cms系统
猎户座核心配置化功能开源啦!在降本提效的大环境下,猎户座系统为了扩展更多应用场景,近期完成了第一阶段的开源工作。此次开源的代码内容涉及两个代码库,内容为CCMS管理系统核心配置化功能以及包含表格列与表单项在内的常用组件。 配置化核心业务逻辑(开源地址) UI实现代码库(开源地址)希望通过开源吸引更多贡献者参与共建,完善对各类表单项、列表项的展示、校验需求的覆盖,促进产品的长期发展。收集Issue以及社区的反馈,不断优化功能的同时全面掌握用户诉求。开源介绍1、简介...原创 2021-04-16 11:39:37 · 1078 阅读 · 0 评论 -
京东热key探测框架本地压测数据记录,单机(8核)QPS约16万/s,可水平扩展
继上一次全链路压测时,热key框架由于Java低版本(1.8.0_131之前的1.8)获取docker内cpu核数有问题,实则获取的是宿主机的核数,造成线程数量过多,压测瞬间cpu达到100%,问题也记录在了另一篇(https://blog.csdn.net/tianyaleixiaowu/article/details/106092060)。后来找到了问题原因,并成功修复了。然后还修改了一些其他的小问题,总体感觉框架比较稳定了。我就自己做了一些性能方面的压测,分别先后使用了4台、8台、16台、32台机器作原创 2020-05-25 11:57:40 · 2970 阅读 · 1 评论 -
京东618大促压测时自研中间件暴露出的问题总结,压测级别数十万/秒
前天618大促演练进行了全链路压测,在此之前刚好我的热key探测框架也已经上线灰度一周了,小范围上线了2500台服务器,每秒大概接收几千个key探测,每天大概2-4亿左右,因为量很小,所以框架表现稳定。借着这次压测,刚好可以检验一下热key框架在大流量时的表现。毕竟作为一个新的中间件,里面很多东西还是第一次用,免不得会出一些问题。压测期,我没有去扩容热key的worker集群,还是平时用的3个16C+1个4C8G的组合,3个16核是是主力,4核的是看上限能到什么样。由于之前那一周的平稳表现,导致我有原创 2020-05-13 14:11:04 · 10484 阅读 · 25 评论 -
开源异步并行框架,完成任意的多线程编排、阻塞、等待、串并行结合、强弱依赖
本文首发于京东零售公众号,https://mp.weixin.qq.com/s/17OAAbCKQND-AjTdf43TGwnetty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型。netty里面充斥了大量的非阻塞回调模式,主要是靠Future/Promise异步模型来实现的。Future是java.util.concurrent.Future...原创 2020-01-14 19:34:56 · 3287 阅读 · 0 评论 -
任意组合、编排的多线程并发框架,支持任意阻塞、等待、串并行组合,回调、超时、默认值等
并发场景可能存在的需求之——任意编排1 多个执行单元的串行请求2 多个执行单元的并行请求3 阻塞等待,串行的后面跟多个并行4 阻塞等待,多个并行的执行完毕后才执行某个5 串并行相互依赖6 复杂场景并发场景可能存在的需求之——每个执行结果的回调传统的Future、CompleteableFuture一定程度上可以完...原创 2019-12-25 16:29:53 · 2583 阅读 · 0 评论 -
使用Retryer优雅地实现对Callable各种各样的重试调用
Runnable和Callable都是多线程编程中常用的接口,通常是通过实现该接口编写业务逻辑后,再由new Thread去发起线程调用。主要区别在于Runnable没有返回值,而Callable有返回值。下面就来看一个重试框架Retryer,针对Callable做的各种重试策略方法。 API 接口调用异常, 网络异常在我们日常开发中经常会遇到,这种情况下我们需要先重试几次调用才能将其标识...转载 2019-11-28 10:24:45 · 1978 阅读 · 0 评论 -
分布式环境下对部分热数据(如redis热key,热请求)进行探测,并对探测结果及时同步到各个client实例的JVM内存的方案简述
可先阅读之前的这篇,有赞的热key探测及缓存方案。常见场景突发性的无法预先感知的热点数据请求,或者有阵发性明显热点数据的。譬如突然大量请求都命中了redis的某个分片,造成该redis卡顿,影响其他请求。热key特性如 goodsId=100,突发1万请求该key。譬如突然大量同一个用户的请求某一个或多个接口,呈现出攻击性访问的。热key特性如userId-99= /cart,/c...原创 2019-11-15 10:06:53 · 1203 阅读 · 1 评论 -
有赞的redis热key探测及缓存到jvm内存框架方案
下面这篇文章来自于有赞的知识共享,总体设计还是不错的,但我对其中的一点比较存疑。就是将计算热点key的工作放在客户端这里。因为一个java实例,可能面临巨多的get请求,譬如请求的key数量较多,那么由客户端来记录这些key,并计算key的热度,是一个比较费力且吃内存的事。即便他限制了最大内存量,那可能会漏掉很多key。还有一种,譬如某个key非常热,但是请求分散到了N个实例里,显得单个实...转载 2019-10-29 10:50:10 · 3106 阅读 · 5 评论 -
使用redis分布式锁高并发下QPS测试,单机一秒下1千个订单
前面一篇讲过并发下单时进行优化的一些策略,后来我写了代码进行了实测。关于redisson做分布式锁的代码在这篇文章。这里我来测试一下分布式锁的性能。简单的controllerpackage com.tianyalei.redislock.controller;import org.springframework.web.bind.annotation.RequestMapping...原创 2019-10-15 19:40:23 · 3743 阅读 · 2 评论 -
关于电商秒杀系统中防超卖、以及高性能下单的处理方案简述
秒杀抢购系统的成功平稳运行,有一些需要注意的知识点。1 高并发,以及刷接口等黑客请求对服务端的负载冲击2 高并发时带来的超卖,即商品数量的控制3 高负载下,下单的速度和成功率的保证4 其他以秒杀单品为例,如抢小米手机。解决方案探讨:第一步 限制前端发来的请求量譬如定在了周二10点开启抢购,那么在之前的一周时间内,都会有预约通知,或者普通的用户浏览。通过预约量、浏览量...原创 2019-10-12 19:42:14 · 7656 阅读 · 0 评论 -
详解Jpa动态复杂条件查询,查询指定字段、并包括sum、count、avg等数学运算,包括groupBy分组
Jpa是我一直推荐在Springboot及微服务项目中使用的数据库框架,并由于官方的并不是十分友好和易用的api,导致很多人使用起来并不方便,下面就来展示一下我对api进行了封装后的代码。大大减轻了使用难度。效果展示首先我们直接来看最终的结果:譬如有个entity叫PtActivity,它有一个Repository。public interface PtActivityRepos...原创 2019-05-31 18:39:50 · 28201 阅读 · 18 评论 -
分布式锁 Java常用技术方案
前言: 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题。所以自己结合实际工作中的一些经验和网上看到的一些资料,做一个讲解和总结。希望这篇文章可以方便自己以后查阅,同时要是能帮助到他人那也是很好的。 ===========================================转载 2017-06-30 16:31:02 · 945 阅读 · 0 评论 -
基于各服务注解方式,在网关zuul中对所有下游服务权限做控制,覆盖到所有接口,权限控制到角色、菜单、按钮、方法
开源地址:https://gitee.com/tianyalei/zuulauth在单体应用架构下,常见的用户-角色-菜单权限控制模式,譬如shiro,就是在每个接口方法上加RequireRole,RequirePermission,当调用到该方法时,可以从配置的数据库、缓存中来进行匹配,通过这种方式来进行的权限控制。而在微服务架构下,我们会使用网关来作为所有服务的入口,由网关来完成鉴权、...原创 2019-08-15 12:29:24 · 5068 阅读 · 0 评论 -
BloomFilter布隆过滤器使用
从上一篇可以得知,BloomFilter的关键在于hash算法的设定和bit数组的大小确定,通过权衡得到一个错误概率可以接受的结果。算法比较复杂,也不是我们研究的范畴,我们直接使用已有的实现。google的guava包中提供了BloomFilter类,我们直接使用它来进行一下简单的测试。新建一个maven工程,引入guava包 com.go原创 2017-07-07 17:49:57 · 21767 阅读 · 8 评论 -
使用redis计数来控制单位时间内对某接口的访问量,防止刷验证码接口之类的
使用自定义注解的方式,在需要被限制访问频率的方法上加注解即可控制。看实现方式,基于springboot,aop,redis。新建Springboot工程,引入redis,aop。创建注解package com.tianyalei.annotation;import org.springframework.core.Ordered;import org.springframew原创 2017-07-06 15:01:09 · 9841 阅读 · 8 评论 -
2 秒杀系统模拟基础实现,使用Redis实现
这一篇,我们来使用redis进行数据存储。新建一个redis的service实现类package com.tianyalei.service;import com.tianyalei.model.GoodInfo;import org.springframework.beans.factory.annotation.Autowired;import org.springframew原创 2017-07-06 11:37:32 · 1939 阅读 · 0 评论 -
1 秒杀系统模拟基础实现,使用DB实现
本文根据动脑学院的一节类似的课程,改编实现。分别使用DB和redis来完成。隔离的解释业务隔离:将秒杀业务独立出来,尽量不与其他业务关联,以减少对其他业务的依赖性。譬如秒杀业务只保留用户id,商品id,数量等重要属性,通过中间件发送给业务系统,完成后续的处理。系统隔离:将秒杀业务单独部署,以减少对其他业务服务器的压力。数据隔离:由于秒杀对DB的压力很大,将DB单独部原创 2017-07-06 11:27:20 · 3022 阅读 · 1 评论 -
贫血,充血模型的解释以及一些经验
关于在项目中的分层问题争论已久,过大的domain object或者过大的Service都存在较大的不可避免的问题,尤其是Service层在协调多个不同的domain object的持久化时代码更是丑陋,那么引入怎样的模式来改善现状?网上找到了这篇还是不错的。转载自:http://kb.cnblogs.com/page/520743/为了补大家的遗憾,在此总结下ROBBIN的领域模型的一些观点和大转载 2017-07-19 16:51:57 · 2351 阅读 · 1 评论 -
关于处理某一个事件需要关联多个事件或表的情况下,一些思考
这个场景是非常常见,毕竟纯粹的单表的CRUD比较少,大部分时候都是操作了某个表、某个业务,然后需要多个表进行更改。譬如社交信息流类的,我发了一篇帖子,首先UserPost表需要添加一条数据,然后可能需要给关注我的人的信息流里也插一条数据,再做一些推送类的事件等等可能要很多步骤。像电商类的下单之类的操作关联的表就更多了。这里必然会涉及的问题就是业务代码耦合,总不能我添加了一篇帖子,然后就在帖子保存之...原创 2017-09-06 12:42:50 · 1295 阅读 · 0 评论 -
JVM GC调优一则--增大Eden Space提高性能
转载自:http://blog.csdn.net/hengyunabc/article/details/24924843缘起线上有Tomcat升级到7.0.52版,然后有应用的JVM FullGC变频繁,在高峰期socket连接数,Cpu使用率都暴增。思路思路是Tomcat本身的代码应该是没有问题的,有问题的可能是应用代码升级,或者环境改变了,总之Tomcat的优先级排在最后。先把应用的heap转载 2017-12-21 15:55:36 · 1807 阅读 · 1 评论 -
解决retrofit OKhttp创建大量对外连接时内存溢出
这个问题是这样发生的,我的表中有一批数据,量级较大,数百万个,它们有个地址Address字段,标明了地理位置。我需要对这一批数据根据地址去百度或者高德地图去查询经纬度,并且保存下来。 原本是直接分页读取该表,每次读取几百条,然后一条一条去获取经纬度并且保存。后来发现实在太慢,一秒也就能处理个三五条。所以开启了多线程,大约30个线程,每个线程处理不同id范围的数据。 此时问题出现了,每个线程中都有原创 2017-12-15 13:44:08 · 20642 阅读 · 15 评论 -
同一套代码部署多个实例来并行完成某项任务,且避免重复执行
我经常会碰到一些耗时较长的任务,譬如更新5千万条表数据中的某个字段,代码中可以通过分页依次读取db,然后更新即可。但是耗时极长,那么能否通过将代码部署多个实例,譬如启动多个docker来并行执行任务,横向扩展,这样就能大幅减少耗时。但是问题在于代码是相同的,假如采用的是分页读取,依次更新,那么不管启动多少个实例,执行的都是重复任务,达不到并行的目的。那么怎么完成动态扩展后,就能分担任务,而不是执行原创 2018-01-05 15:20:45 · 4373 阅读 · 0 评论 -
1 监听mysql表内容变化,mysql开启binlog
binlog 就是binary log,二进制日志文件,这个文件记录了mysql所有的增、删、改语句。通过binlog日志我们可以做数据恢复,做主从复制等等。可以看到,只要有了这个binlog,我们就拥有了mysql的完整备份了。我们时常会碰到这样的需求,就是要监听某个表的变化,然后来做一些操作。如果该表数据只增加、不删除修改的话,要监听比较简单,可以定时去查询最新的id即可。但要有删除、修改操作...原创 2018-03-22 14:33:52 · 10567 阅读 · 0 评论 -
2 监听mysql表内容变化,使用canal
mysql本身是支持主从的(master slave),原理就是master产生的binlog日志记录了所有的增删改语句,将binlog发送到slave节点进行执行即可完成数据的同步。canal是阿里开源的一个中间件,它就是通过解析binlog来完成数据变更的监听的。https://github.com/alibaba/canal可以看到,canal是这样工作的:canal有一个server工程,...原创 2018-03-22 20:19:07 · 18698 阅读 · 5 评论 -
10G mysql binlog重放并传输到另一台服务器执行,阿里中间件大赛
转载自:https://tianchi.aliyun.com/forum/new_articleDetail.html?spm=5176.11165310.0.0.90a57f61Sy5xTQ&raceId=231600&postsId=2035这个冠军的方案确实赞,10G的mysql binlog重放并传输只用了2秒!总决赛冠军队伍 作死小分队 比赛攻略决赛答...转载 2019-11-26 17:02:13 · 2473 阅读 · 0 评论 -
如何做到“恰好一次”地传递数十亿条消息,结合kafka和rocksDB
引用原文:Delivering Billions of Messages Exactly Once作者:Amir Abu Shareb翻译:雁惊寒译者注:在分布式领域中存在着三种类型的消息投递语义,分别是:最多一次(at-most-once)、至少一次(at-least-once)和恰好一次(exactly-once)。本文作者介绍了一个利用Kafka和RocksDB来构建的“恰好...转载 2019-06-20 09:57:50 · 1575 阅读 · 0 评论 -
redisson分布式锁源码和原理浅析
之前写过一篇使用redisson完成简单的分布式锁的文章,https://blog.csdn.net/tianyaleixiaowu/article/details/90036180在redisson之前,很多人可能已经自己实现过基于redis的分布式锁,本身原理也比较简单,redis自身就是一个单线程处理器,具备互斥的特性,通过setNx,exist等命令就可以完成简单的分布式锁,处理好超时...原创 2019-07-16 16:07:07 · 17267 阅读 · 3 评论 -
2分钟快速发布自己的项目供别人在pom里依赖
大家经常会在maven、gradle里依赖别人的项目或模块。大家知道,别人的项目都是发布在maven中央仓库的,要经历一系列的步骤方能上传成功,才能供别人依赖。这里要说一种简单方式,2分钟就让你的项目可以供大家使用。就是这个网站:https://jitpack.io你用GitHub或者gitee登录它,授权后,你的GitHub里的所有项目,就可以供别人依赖了。譬如我有一个项目叫zu...原创 2019-08-14 17:41:31 · 952 阅读 · 1 评论 -
使用BloomFilter布隆过滤器解决缓存击穿、垃圾邮件识别、集合判重
Bloom Filter是一个占用空间很小、效率很高的随机数据结构,它由一个bit数组和一组Hash算法构成。可用于判断一个元素是否在一个集合中,查询效率很高(1-N,最优能逼近于1)。在很多场景下,我们都需要一个能迅速判断一个元素是否在一个集合中。譬如:网页爬虫对URL的去重,避免爬取相同的URL地址;反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱(同理,垃圾短信);原创 2017-07-07 16:23:03 · 24002 阅读 · 8 评论