crossoverJie

其他

手把手实现一条延时消息

它会一直从时间轮中取出任务来运行,而运行这些任务的线程便是我们在初始化时传入的线程池;所以所有的延时任务都是由自定义的线程池调度完成的,这样可以避免时间轮的阻塞。
2019年9月27日
其他

如何参与一个顶级开源项目

http://dubbo.apache.org/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html
2019年8月19日
其他

也许是东半球直接底气的分库分表实践了

只是需要在操作数据之前做一次路由判断,当新数据产生的足够多时(我们是两个月时间),几乎所有的操作都是针对于分表,再从库启动数据迁移,数据迁移完毕后将原有的路由判断去掉。
2019年7月25日
其他

What?一个 Dubbo 服务启动要两个小时!

但其实经过我后续排查发现刚开始其实并不是启动不起来,而是启动速度非常缓慢,所以当应用长时间启动后才会对外提供服务。而这个速度慢到居然要花费
2019年7月5日
其他

又一次生产 CPU 高负载排查实践

通过这张图其实很明显可以看出,在内存中存在一个非常大的字符串,而这个字符串正好是被这个定时任务的线程引用着。
2019年6月18日
其他

分表后需要注意的二三事

但在分表之前所有的数据都是从老表中获取的,当时的业务也没有出现问题;现在多的只是查询分表而已,但分表的数据量肯定要比大表小的多,而且有索引,所以这个效率也不会慢多少。
2019年6月13日
其他

线程池没你想的那么简单(续)

后会将线程池的状态置为关闭状态,这时将会停止接收新的任务同时会等待队列中的任务全部执行完毕后才真正关闭线程池。
2019年6月6日
其他

没那么简单的线程池

原以为线程池还挺简单的(平时常用,也分析过原理),这次是想自己动手写一个线程池来更加深入的了解它;但在动手写的过程中落地到细节时发现并没想的那么容易。结合源码对比后确实不得不佩服
2019年5月20日
其他

一次分表踩坑实践的探讨

字段选好,由于我们的业务比较单纯;是一个物联网应用,所有的数据都包含有物联网设备的唯一标识(IMEI),并且这个字段天然的就保持了唯一性;大多数的业务也都是根据这个字段来的,所以它非常适合来做这个
2019年4月16日
其他

『并发包入坑指北』之阻塞队列

因为这个外部接口是支持批量执行的,所以在消费线程取出数据后会在内存中做一个累加,一旦达到阈值或者是累计了一个时间段便将这批累计的数据处理掉。
2019年4月9日
其他

线程池中你不容错过的一些细节

这次呢可能更多是我自己的总结,比如写一篇技术博客时如果大部分人对某一个知识点讨论的比较热烈时,那一定是作者要么讲错了,要么没讲清楚。
2019年3月26日
其他

一个线程罢工的诡异事件

BlockQueue不太一样,不是由开发者自定义一个消费逻辑进行处理的;而是在初始化队列时直接丢一个线程池进去,它会在内部使用这个线程池进行消费,同时回调一个方法,在这个方法里我们写自己的消费逻辑。
2019年3月12日
其他

一致性 Hash 算法的实际应用

routeHandle.routeServer(serverCache.getAll(),String.valueOf(loginReqVO.getUserId()));
2019年3月1日
自由知乎 自由微博
其他

利用策略模式优化过多 if else 代码

所以在之前的枚举中就维护了命令和类类型的关系,只需要知道命令就能知道他的类类型。
2019年1月30日
其他

为自己搭建一个分布式 IM 系统二【从查找算法聊起】

下面则是具体的代码实现,其实算法不像是实现一个业务功能这样好用文字分析;具体还是看源码多调试就明白了。
2019年1月14日
其他

为自己搭建一个分布式 IM(即时通讯) 系统

老读者应该还记得我在去年国庆节前分享过一篇《设计一个百万级的消息推送系统》;虽然我在文中有贴一些伪代码,依然有些朋友希望能直接分享一些可以运行的源码;这么久了是时候把坑填上了。
2019年1月2日
其他

一次生产 CPU 100% 排查优化实践

创建线程池的方式也是核心线程数、最大线程数是一样的,导致一些空闲的线程也得不到回收;这样会有很多无意义的资源消耗。
2018年12月17日
其他

没错,老板让我写个 BUG!

-Dcom.sun.management.jmxremote.authenticate=false
2018年12月12日
其他

如何判断一个元素在亿级数据中是否存在?

而我们是否可以换种思路,因为只是需要判断数据是否存在,也不是需要把数据查询出来,所以完全没有必要将真正的数据存放进去。
2018年11月26日
其他

设计一个可拔插的 IOC 容器

http://127.0.0.1:5688/cicada-example/routeAction/getUser?id=1234&name=zhangsan
2018年11月15日
其他

不改一行代码定位线上性能问题

com.taobao.sketch;org.apache.velocity;com.alibaba;com.taobao.forest.domain.dataobject
2018年11月12日
其他

一次 HashSet 所引起的并发问题

这是因为之前数据量都比较少,即使是并发写入也没有出现并发扩容形成环形链表的情况。这段时间业务量的暴增正好把这个隐藏的雷给揪出来了。所以还是得信墨菲他老人家的话。
2018年11月8日
其他

一份针对于新手的多线程实践--进阶篇

上面提到的这个分配中心其实就是一个常见的定时任务的分布式调度中心,由它来统一发起调度,当然分片只是它其中的一个功能而已(关于调度中心之后有兴趣再细说)。
2018年10月31日
其他

一份针对于新手的多线程实践

线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中。
2018年10月29日
其他

利用责任链模式设计一个拦截器

这样看似没啥问题也能解决需求,但如果我还需要为为内容加上一个统一的标题呢?在现有的方式下就不得不新增处理方法,并且是在这个客户端(
2018年10月22日
其他

分享几个 SpringBoot 实用的小技巧

defaultListableBeanFactory.removeBeanDefinition(OrderServiceClient.class.getCanonicalName());
2018年10月15日
其他

从源码分析如何优雅的使用 Kafka 生产者

valueSerializer.serialize(record.topic(),record.value());
2018年10月11日
其他

设计一个百万级的消息推送系统

权重。可以手动调整各个节点的负载情况,甚至可以做成自动的,基于监控当某些节点负载较高就自动调低权重,负载较低的可以提高权重。
2018年9月25日
其他

【译】如何高效的使用 Git

可能有多个项目都基于同一份代码运行,因此对于每一个项目来说都需要创建一个独立的发布分支。假设现在还有一个项目正在并行运行,那就得为这个项目创建一个单独的发布分支比如
2018年9月7日
其他

「造个轮子」——cicada 源码分析

ClassactionClazz=routeAction(queryStringDecoder,appConfig);
2018年9月5日
其他

「造个轮子」——cicada(轻量级 WEB 框架)

top.crossoverjie.cicada.server.intercept.AbstractCicadaInterceptorAdapter
2018年9月3日
其他

强如 Disruptor 也发生内存溢出?

https://github.com/crossoverJie/JCSprout/tree/master/src/main/java/com/crossoverjie/disruptor
2018年8月29日
其他

分布式(一) 搞定服务注册与发现

https://github.com/crossoverJie/netty-action/tree/master/netty-action-zk
2018年8月27日
其他

什么样的简历不会被丢进回收站

这块我觉得可以适当减少项目具体的业务描述(自然不是不写),因为具体的项目了解一般会在简历评估通过后在面试中详聊。
2018年8月21日
其他

如何成为一位「不那么差」的程序员

https://medium.freecodecamp.org/building-your-personal-brand-as-a-new-web-developer-f6d4150fd217
2018年8月13日
其他

Netty(三) 什么是 TCP 拆、粘包?如何解决?

ProtobufDecoder(BaseResponseProto.ResponseProtocol.getDefaultInstance())).addLast(new
2018年8月6日
其他

如何优雅的使用和理解线程池

谈到线程池就会想到池化技术,其中最核心的思想就是把宝贵的资源放到一个池子中;每次使用都从里面获取,用完之后又放回池子供其他人使用,有点吃大锅饭的意思。
2018年7月30日
其他

HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!

冲突严重时,在桶上形成的链表会变的越来越长,这样在查询时的效率就会越来越低;时间复杂度为
2018年7月23日
其他

Guava 源码分析(Cache 原理【二阶段】)

value={}",notification.getCause(),notification.getKey(),notification.getValue());
2018年7月16日
其他

一次线上问题排查所引发的思考

这类问题并不像一个空指针、数组越界这样明显好查,这时就需要刚才提到的内存模型、对象创建、线程等相关知识结合在一起来排查问题了。
2018年7月9日
其他

Netty(二) 从线程模型的角度看 Netty 为什么是高性能的?

利用率不高,一旦有大量的客户端连接上来性能必然下降,甚至会有大量请求无法响应。最坏的情况是一旦这个线程哪里没有处理好进入了死循环那整个服务都将不可用!
2018年7月4日
其他

一个学渣的阿里之路

部门在做的事情上确实更加有诱惑力,之后我表达了有一个面试正在流程中的顾虑;对方表示可以私下和我快速的进行三面,如果一切没问题再交由我自行选择。至少对双方都是一个双赢嘛。
2018年6月21日
其他

Guava 源码分析(Cache 原理)

内部通过一个队列来维护缓存的顺序,每次访问过的数据移动到队列头部,并且额外开启一个线程来判断数据是否过期,过期就删掉。有点类似于我之前写过的
2018年6月13日
其他

Netty(一) SpringBoot 整合长连接心跳机制

ctx.writeAndFlush(HEART_BEAT).addListener(ChannelFutureListener.CLOSE_ON_FAILURE)
2018年5月28日
其他

秒杀架构实践

https://github.com/crossoverJie/SSM/tree/master/SSM-SECONDS-KILL/SSM-SECONDS-KILL-ORDER-CONSUMER
2018年5月8日
其他

分布式限流

@Pointcut("@annotation(com.crossoverjie.distributed.annotation.CommonLimit)")
2018年4月28日
其他

动手实现一个 LRU cache

时需要删除初始化的头尾结点。这是因为初始化时候生成了两个双向节点,没有数据只是为了形成一个数据结构。当真实数据进来之后需要删除以方便后续的操作(这点可以继续优化)。
2018年4月8日
其他

基于 Redis 的分布式锁

在我们将应用拆分为分布式应用之前的单机系统中,对一些并发场景读取公共资源时如扣库存,卖车票之类的需求可以简单的使用同步或者是加锁就可以实现。
2018年4月2日
其他

深入理解线程通信

开发中不免会遇到需要所有子线程执行完毕通知主线程处理某些逻辑的场景。
2018年3月16日
其他

你应该知道的 volatile 关键字

线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中。
2018年3月9日