0%

AOP(Aspect Orient Programming),一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。静态代理是编译期实现,动态代理是运行期实现,可想而知前者拥有更好的性能。本文主要介绍Spring AOP的两种代理实现机制,JDK动态代理和CGLIB动态代理。

Read more »

年前意外的经历了一次阿里的电话面试,话说还没想换工作,但这位业余HR(应该是技术负责人)都没介绍工作岗位和要求,直接就约定某晚的电面时间,抱着好奇的态度被“虐”了一把。

总体感觉这位面试官问的问题非常深,基本都是系统或者原理级别的。不知道是不是代表了阿里面试的基本思路。

Read more »

今天是2016年的倒数第二天,仿佛踮起脚就能够到17年。16年对于我来说是不平凡的一年,即使在暮年回首想必也会历历在目。

Read more »

目前我们处理消息的同步,一般是落地到DB后,再同过异步的方式做数据的聚合和处理。至于DB的操作为了简单直接用了Hibernate提供的一套JPA接口,(老实说真的是不喜欢JPA,一是sql log不好分析无法优化,二是必须非常了解JPA的所有关键字含义,不然就要出问题,所以我一直喜欢用mybatis这种更轻量的甚至spring-jdbc)。

那么使用JPA的过程就遇到了一些问题,见招拆招一件一件来。

Read more »

问题

这一周在Jenkins上跑npm install经常会出现build fail,查了日志就是下面输出的样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
npm ERR! node v4.4.7
npm ERR! npm v2.15.8
npm ERR! path ../gulp/bin/gulp.js
npm ERR! code EEXIST
npm ERR! errno -17
npm ERR! syscall symlink

npm ERR! EEXIST: file already exists, symlink '../gulp/bin/gulp.js' -> '/.jenkins/workspace/eshop/build/node_modules/.bin/gulp'
File exists: ../gulp/bin/gulp.js
Move it away, and try again.

npm ERR! Please include the following file with any support request:
npm ERR! /.jenkins/workspace/eshop/build/npm-debug.log
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.399 s
[INFO] Finished at: 2016-12-15T06:06:26+00:00
[INFO] Final Memory: 8M/63M
[INFO] -----------------------------------------------------------------------

一开始以为是建symlink的问题,考虑了可能权限或者symlink已存在的情况。但是用全新的一个虚机去跑npm install还是失败,错误有原因也是一样。本着死马当活马医的思路,加了一个-–no-bin-link参数,问题奇迹的解决了。查看官网的一段解释The --no-bin-links argument will prevent npm from creating symlinks for any binaries the package might contain.貌似也是在虚机才会出现这种情况。

之后又咨询了我们做构建的同事,他们建议把nodejs升级到6,同样也解决了问题。

总结

看来root cause是查不到了,只能给两个建议

  1. -–no-bin-link参数
  2. 升级Jenkins机器上的nodejs版本到6

在项目中踏完一系列坑后总结出来,消息的处理有两个要务:

  1. 消费一定要快,我们喜欢供小于求的市场。生产者生产的消息要满足不了消费者才行。
  2. 任何消息都不能丢,因为这都是数据啊,即使处理不了也得找地方存着。最好每次的消息都存着,之后就变成了event sourcing(另一个大坑)。
Read more »

这是最近看到的一个算法题,第一眼看过去连题目都看不懂啊囧。非计算机本科生表示对算法十分无力。第一直觉肯定是把ASCII的字符都换成int,然后题目就可以变成How to count the number of set bits in integer. google一下还真有[答案](How to count the number of set bits in ASCII string).第一个高分回答表示各种位操作都看不懂。传说中的Hamming_weight算法。真是给跪了。

突然想到Java的Integer类本来就有个toBinaryString方法,再加上最近正好研究UUID生成,觉得用现成的方法实现一下。

Read more »

最近一个使用Spring的项目中需要进行性能调优。方式基本上是编写新的代码实现原来一样的业务逻辑,只是实现方式有一些调整,例如增加cache,优化算法等等。

一开始大家希望直接在原有代码基础上修改,但是这样一来,就要跟上每周一次的发布节奏,一周搞定难度太大。于是决定拷贝出的package来重构。在没启用之前这个package下都是dead code。这样做的好处有几点:

  • 在调优后的code启用前,业务至少不会受影响。
  • 利用docker的特性,可以实现灰度发布,比如启动两个docker,一个是老的code,一个启用新的code,利用nginx实现分流。
  • 灰度发布后发现有紧急bug,只需要devOps修改一点配置,重启docker可以再切回老的code。
Read more »

近一个月拿Vue.JS做一个小项目练手。项目本身的API是现成的,而且都是json格式,所以前端选型自然会选择MV*M的框架。由于做了一段时间的angularJS,感觉对于这个工期很短的项目angular显得有些庞大了。所以尝试了一下Vue.JS。

Read more »