ARTS - Week 4
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相关的类,做的事情都是一摸一样:
在调用前将入参的具体内容打印到日志
调用RPC接口,得到一个通用的Response对象
判断Response是否成功,如果不成功返回空对象,例如size为0的ArrayList
如果成功则提取具体的Response内容,并打印日志
catch住PRC调用的异常,打印error日志
记录并向监控系统发送具体的调用时间
第一时间看到这种代码想到的是利用代理模式来解决,落地的解决方法无非就是AOP或者自己写一个代理模式,使用AOP的话有一小问题就是要改变被代理方法的返回类型,涉及到一次强转,不太优雅,所以自己利用Java8的Function特性,实现了一个工具类,代理所有的RPC调用,实现上述所有的功能,同时只要写一个类在项目中即可。具体代码如下:
Share
如何确保消息不会丢失? 来自极客时间课程《消息队列高手课》
如何检测消息不丢失,producer发送消息时带一个全局自增的id,只要consumer测的id不是递增的,就说明消息有丢失。
消息丢失的三个场景
Producer端,同步发送时未处理发送异常,异步发送未在回调方法中检查发送结果。
Broker端,没有保证收到消息时写到磁盘再返回ack给Producer
Consumer端,没有执行完逻辑就回复ack给broker
只要保证上面的三种情况不发生,就能保证消息不会丢失。
版权声明: 本文为 InfoQ 作者【Khirye】的原创文章。
原文链接:【http://xie.infoq.cn/article/302baf7ca53d8ff172579b8b3】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论