ARTS - Week 4

发布于: 17 小时前

Algorithm

LeetCode 226 Invert Binary Tree

HomeBrew 作者Max Howell面试Google时被刷的题。。。这道题真的很简单,讲道理写不出来是有点过分。。

解法: 直接递归,从根节点开始交换左右子树,再一路递归交换节点的左右子树即可。

Review

Guide To CompletableFuture 来自Baeldung的入门教程系列

Baeldung是一个有很多Java相关知识的入门教程网站,这个网站上的一些入门的tutorial非常的nice,不像国内的一些教程,都写的比较随意,个人观点,不喜勿喷~

最近工作接手的一个项目用了很多的异步手段,大多都是为了并发执行网络调用,降低自身服务接口相应时间,代码中涉及到了非常多的Future对象,导致代码的可扩展性非常的不好。所以最近我一直在找一些跟优雅的方式来做这个事情,就来了解一下CompletableFuture这个东西。

CompletableFuture主要做一件事,就是所谓的异步编排。比如说你有两个异步任务,你希望先异步调用A方法,再A方法调用结束之后再异步调用B方法,其实你用最简单的Future也可以做到,但是代码就没有CompleableFuture来的优雅。

Tips

利用Java8的Function特性,实现优雅的RPC调用逻辑。

目前在公司的代码中,有大量的RPC相关的类,做的事情都是一摸一样:

  1. 在调用前将入参的具体内容打印到日志

  2. 调用RPC接口,得到一个通用的Response对象

  3. 判断Response是否成功,如果不成功返回空对象,例如size为0的ArrayList

  4. 如果成功则提取具体的Response内容,并打印日志

  5. catch住PRC调用的异常,打印error日志

  6. 记录并向监控系统发送具体的调用时间

第一时间看到这种代码想到的是利用代理模式来解决,落地的解决方法无非就是AOP或者自己写一个代理模式,使用AOP的话有一小问题就是要改变被代理方法的返回类型,涉及到一次强转,不太优雅,所以自己利用Java8的Function特性,实现了一个工具类,代理所有的RPC调用,实现上述所有的功能,同时只要写一个类在项目中即可。具体代码如下:

@Slf4j
public class BaseRpc {
public static <T, R> T invoke(Function<R, ServiceResponse<T>> function, String logPrefix, R r) {
Long startTime = System.currentTimeMillis();
// 1. 打印入参
log.info("{} is starting RPC, the request is {}", logPrefix, r);
ServiceResponse<T> response = null;
try {
// 2. 执行RPC
response = function.apply(r);
} catch (Exception e) {
// 3. 打印error日志
log.error("{} throws an Exception", logPrefix, e);
return null;
} finally {
// 4. 给监控上传调用时间
LogUtil.recordTime(logPrefix, startTime);
}
// 5. 打印response为空时的日志
if (Objects.isNull(response) || !response.isSuccess() || Objects.isNull(response.getResult())) {
log.info("{} has NULL result", logPrefix);
return null;
}
// 6. 打印结果
log.info("{} the result is {}", logPrefix, response.getResult());
return response.getResult();
}
}
// 调用方
BatchMemberConfigReq request = buildMembershipStoreRequest(indexRequest, storeBaseInfoList);
List<MemberConfigDTO> responseList = BaseRpc
.invoke(r -> memberService.batchQueryMembershipAndConfig(r),
"memberService.batchQueryMembershipAndConfig", request);

Share

如何确保消息不会丢失? 来自极客时间课程《消息队列高手课》

  • 如何检测消息不丢失,producer发送消息时带一个全局自增的id,只要consumer测的id不是递增的,就说明消息有丢失。

  • 消息丢失的三个场景

  1. Producer端,同步发送时未处理发送异常,异步发送未在回调方法中检查发送结果。

  2. Broker端,没有保证收到消息时写到磁盘再返回ack给Producer

  3. Consumer端,没有执行完逻辑就回复ack给broker

  • 只要保证上面的三种情况不发生,就能保证消息不会丢失。

发布于: 17 小时前 阅读数: 18
用户头像

Khirye

关注

还未添加个人签名 2018.03.31 加入

还未添加个人简介

评论

发布
暂无评论
ARTS - Week 4