WhatAKitty Daily

A Programmer's Daily Record

一致性hash应用于分布式数据处理

WhatAKitty  

背景

最近一个任务是做一个爬虫,而在这个框架构建过程中需要做到平滑水平扩展;因此,对于采集器而言,直接替换旧数据即可;而对于分析器而言,总不能重复解析相同数据,这会造成严重的性能浪费,特别是在此过程中需要使用OCR来分析图片。所以,想到将一致性hash算法应用到分布式数据处理中。

阅读全文 »

finally-return在JVM级别的解释

WhatAKitty  

背景

刚看了极客时间关于JVM异常的相关信息,然后在评论里看到这么一条:

如果finally有return语句,catch内throw的异常会被忽略,这个从jvm层面怎么解释呢?
2018-09-02
 作者回复
catch里抛的异常会被finally捕获了,再执行完finally代码后重新抛出该异常。由于finally代码块有个return语句,在重新抛出前就返回了。

你可以利用这篇文章的知识,就着javap的输出,分析一下具体的程序路径

所以就着JVM字节码具体分析了一下两种程序路径:

  • catch内抛出异常, finally内存在return
  • catch内抛出异常, finally内不存在return
阅读全文 »

Spring @Bean解析分析过程

WhatAKitty  

前提

  • Spring 5
  • 基于Java Configuration配置,而非XML配置
  • 非Web环境

@Bean的处理

与AOP构造器的创建过程类似(具体的可以查看这篇文章:多个AspectJ对同一个对象操作产生的实际效果以及顺序情况),@Bean的处理也是在ConfigurationClassParser类的doProcessConfigurationClass方法内做的处理:

1
2
3
4
5
// Process individual @Bean methods
Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);
for (MethodMetadata methodMetadata : beanMethods) {
configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));
}

之后在ConfigurationClassPostProcessor类的processConfigBeanDefinitions方法内解析:

1
2
3
4
5
6
7
// Read the model and create bean definitions based on its content
if (this.reader == null) {
this.reader = new ConfigurationClassBeanDefinitionReader(
registry, this.sourceExtractor, this.resourceLoader, this.environment,
this.importBeanNameGenerator, parser.getImportRegistry());
}
this.reader.loadBeanDefinitions(configClasses);

阅读全文 »

多个AspectJ对同一个对象操作产生的实际效果以及顺序情况

WhatAKitty  

前提

  • Spring 5
  • 基于Java Configuration配置,而非XML配置
  • 对于AspectJ的分析,不对Spring本身的Advisor做分析

概要

如果需要了解多个AscpectJ对同一个对象操作产生的实际效果以及作用顺序,则需要首先了解AOP对象的构建过程,以及如何织入,还有就是织入过程中的顺序逻辑的了解。

所以,这篇文章主要内容如下:

阅读全文 »

一起写个Cache架构【零】——分析与计划

WhatAKitty  

背景

在构建OTA平台系统的时候,经常需要判断一些数据是否存在,并且取得旧数据相关的一些值。本来是使用了Guava Cache了已经,不过考虑到刚好想要提升下自己的水平,单单使用别人的缓存工具还不如自己直接手动撸一个,这才有了这个项目。至于缓存的名字,笔者想想还是以后再说吧,名字啥的其实也不太重要~

阅读全文 »