Blog
Blog copied to clipboard
My Blog
## 进入分屏 ``` ➜ ~ tmux ``` ## 上下分屏 ctrl + b 再按shift + " ## 左右分屏 ctrl + b 再按shift + % ## 切换屏幕 ctrl + b 再按o ##...
一个服务内部依赖外部服务的时候一定要提供注入点(构造器或者setter方法),这样可以方便用例中进行mock 每个接口各种场景都要测试到位,至少本系统内部逻辑是符合预期的 TDD,提测之前要有测试用例,因为事后补的话会发现有些接口设计不合理,或者缺少一些注入点。
过去好几天了,但是觉得还是有必要分享下这个傻逼的错误。 # 时间 五一之后的第一天。 # 经过 系统遗留的一个后门接口威力无比,可以执行任何sql,包括删除所有记录,更新所有记录。 有一天,我掉进了这个坑,一切发生的毫无征兆,意识到的那一刻头脑一片空白。 为了头方便省事,为了修复一个问题,想直接走后门修改掉,so easy。  复制-粘贴-执行,操作行云流水,不假思索。然后点击相关页面,一片空白,才意识到刚才执行的sql超出了预期,紧接着是用户的反馈。。。。OMG 傻逼!执行了一个没有加where条件的update语句。。。 第一反应,联系DBA,看能不能全表恢复,才知道数据恢复并没有想象中的那么快速,这种方式恢复可能需要XXX天!! 幸运的是,这张DB表对应的有离线表,才迅速通过其他方式把数据恢复了,业务不可用时间1-2小时。 # 总结 吃一堑长一智,我觉得在这个过程中暴露了很多的问题。 - 使用后门,而且还没有找人review,意识就有问题 - 生产变更不走标准流程,找死 - 执行sql,至少先在测试环境跑一下吧,直接干到线上了,咋想的?
# 读后感 John Carmack这个知名程序员开始阅读并参与OpenBSD代码,通过邮件列表可以看到本次应该是增加注释和改善可读性。 我最开始知道约翰·卡马克是因为2015年阅读的《Doom启示录》一书,两个约翰对技术的着迷让人激动不已。 开源的贡献并不一定是要引入什么复杂的功能或者解决了很大的问题,哪怕是写文档,完善注释都是有价值的。  # 原文 https://news.ycombinator.com/item?id=23224584 点击“阅读原文”,可以找到引用的原文。
难度系数:☆☆☆ 如果应用由单体架构演变成了微服务架构,都会涉及到分布式事务的问题。 1. 2PC 两阶段提交 引入了事务管理器来管理多个参与者的事务生命周期: 优点: - 能保证事务的原子性 - 读写隔离 - 同步调用 缺点: - 比较重,依赖事务管理器 - 可能会出现死锁 2. 最终一致性和事务补偿 基于事件驱动的方式,每个服务基于事件/消息更新本地的数据/状态,然后发布新的事件。 优点: - 解耦 - 每个服务关注自身的事务原子性 - 异步调用,支持高可扩展 缺点: -...
https://web.archive.org/web/20200115102741/http://kcall.co.uk/ssd/index.html
有一个这样的场景,项目中有一个module专门处理同一类事情,比如调用外部的RPC、DB操作等,这个module里面的类命名都遵守统一的规范,比如xxx*或者*xxx。我们需要在每次RPC前后打印出RPC的耗时以及输入和外部返回的结果,如果在每个类里面都做这个事情显得特别冗余,都知道可以使用AOP,那么针对这种情况,哪种方式更好了, BeanNameAutoProxyCreator,之前没有使用过,所以这里做个梳理。 ## 使用方式 针对这种bean name符合一定特征的bean做拦截的话,就是需要配置特定的BeanNameAutoProxyCreator bean,指定bean name的模式和拦截器的名称。 ```xml *RPC fooLogInterceptor ``` 拦截器的实现: ```java public class FooLogInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { Method method...
最近在使用`Arrays.asList`时又犯了一个低级的错误导致了运行时异常,所以有必要把这个点好好理解下。从踩过的2个坑开始分析。  ## 踩过的2个坑 ### `Arrays.asList`列表转数组问题 详细可以看[这篇文章](https://mp.weixin.qq.com/s/WcyuR_aqCT7FyiZLsWivPw),toArray 方法返回的依然是 Object[],但是与 java.util.ArrayList 不同的是这里底层存储是泛型类型的数组 privatefinalE[]a,所以保留了实际的类型。 ### `Arrays.asList`列表不能新增元素 `Arrays.asList`构造的是一个固定大小的列表,底层存储是泛型数组,不能新增元素,原因在后面源码分析部分会看到。 ## `Arrays.asList`列表源码分析 `Arrays.asList`返回的是一个`Arrays`的内部类`ArrayList`,很小巧。  其实这个内部类和`java.util.ArrayList`的外貌(类层次图)是一样的,只是实现不同而已。  接下来我们分析内部类`ArrayList`源码。 ```java private static class ArrayList extends AbstractList implements...
control + J javadoc预览
## 前言 最近在项目中遇到了一个问题:当[条件A]很大的时候数据查询特别慢,A>1000的时候就需要3秒左右,这是不能忍受的。经过排查发现代码中有一个根据A串行查询redis的操作,如下: ```java if (CollectionUtils.isNotEmpty(list)) { for (String key : list) { data = redisService.getDataToday(key) } } ``` 对这种情况的测试效果: ``` A 时间 100 249.78ms 500 1.17s 1000 2.4s ```...