ARTS的初衷
Algorithm: 主要是为了编程训练和学习。
Review:主要是为了学习英文
Tip:主要是为了总结和归纳在日常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。
Share:主要是为了建立影响力,能够输出价值观。分享一篇有观点和思考的技术文章
https://www.zhihu.com/question/301150832
一、Algorithm
Longest Well-Performing Interval
We are given hours, a list of the number of hours worked per day for a given employee.
A day is considered to be a tiring day if and only if the number of hours worked is (strictly) greater than 8.
A well-performing interval is an interval of days for which the number of tiring days is strictly larger than the number of non-tiring days.
Return the length of the longest well-performing interval.
Example 1:
Input: hours = [9,9,6,0,6,6,9] Output: 3 Explanation: The longest well-performing interval is [9,9,6].
Constraints:
1 <= hours.length <= 10000 0 <= hours[i] <= 16
代码语言:javascript复制public class Solution {
public int longestWPI(int[] hours) {
//转换为,if sum(hours[0:n])>0 return n
Map<Integer,Integer> idx = new HashMap<>();
int ans = 0;
int s = 0;
for(int i=0;i<hours.length;i ) {
s =hours[i]>8?1:-1;
if(s>0) {
ans = i 1;
} else {
if(!idx.containsKey(s)) {
idx.put(s,i);
}
if(idx.containsKey(s-1)) {
ans = Math.max(ans,i-idx.get(s-1));
}
}
}
return ans;
}
}
二、Review
三、Tip
如何快速上手交接过来的遗留代码
代码语言:javascript复制
面对遗留代码,无非要搞清楚三个问题,我在哪?我来自哪里?我要到哪去?搞清楚数据流向很重要,可以跟着需求慢步走,有准备地参加新需求评审会,切记要清楚修改代码可能产生的蝴蝶效应,不要急着重新设计甚至重构,因为你无法控制风险和保证你的代码不是烂代码
四、Share
1、 前中台定义
1.1、 前台
对用户的请求访问进行转发,对各类参数的基本验证,对不复用逻辑进行处理
1.2、 中台
可复用逻辑的实现层,具备可配置能力;对外输出完成某通用功能的组件服务或完成单一不可再次拆解业务的原子服务
2、 拆分规则
2.1、 前台拆分
2.1.1、 直接对接用户
直接对接用户的系统,比如客户前端、运营后台、商家后台均划归前台,这类系统通过调用中台服务并结合自身对不可复用逻辑的实现完成功能的开发,负责前台客户请求的转发,并对入参合法性进行验证;开放服务适配层则作为业务适配层放至前台
2.1.2、个性化临时性
个性化定制类功能,例如某个页面的楼层配置、这种业务渠道不同、配置差异很大,不具有中台通用性,诸如此类个性化很强的模块划规至前台。临时类业务,使用期限只有一段时间、后续会废弃的逻辑保留在前台,使其能灵活添加以及丢弃
2.1.3、 数据存储
前台可有自己的数据存储、用于存储一些个性化、定制化较强的数据。前台数据存储范围为——页面的配置数据、网站前端页面的灾备数据、为实现某一不具有复用性功能的数据存储
2.1.4、 开发边界
前台包含所有的页面、JS、controller层的数据封装、数据验证;前台通过调用中台的通用服务或原子服务加上本身的功能逻辑完成某个功能的开发
2.2、 中台拆分准则
2.2.1、 原子类服务
中台对外提供原子类服务,这类服务完成了某个不可再次拆解的功能、只提供原子能力。诸如促销查询、商详查询、订单详情查询、订单列表查询、用户基本信息查询均为原子类服务
2.2.2、 通用组件化服务
中台对外提供通用组件服务,完成某一通用功能,例如下单接口、各条业务线均有自己的下单流程、业务通用性高,但是下单流程中各条业务线又有差异点,差异点可通过组件配置化进行区别。现有的通用服务,如下单服务、商品发布服务、促销发布服务等均划归中台。通用组件可通过对中台原子服务的组合调用实现,也可通过引入业务身份、按业务身份对功能逻辑进行配置编排实现
2.2.3、 中台mq
中台内部用于数据同步的mq,比如用于将数据从数据库同步至redis和es的mq;中台内部业务流转mq,例如下单后订单流转状态的通知使用的mq、以及接受外部订单业务状态变化的mq,以上这类用于中台内部的逻辑处理、前台对其逻辑不可见的mq划归至中台;用于日志采集的mq插件、mq日志搜集,因其日志采集的复用性统一划归中台
2.2.4、 中台worker
中台数据同步类worker、支撑业务状态流转的worker、且为前台不可见逻辑,这类worker划归至中台;worker的实现建议统一接入任务引擎
2.2.5、 数据存储
用户数据(企业相关、账号相关、用户权益),商品数据(商品各类属性、商品关系数据),促销数据(促销规则),价格数据,交易数据(订单、快照),各业务领域的流水日志,支撑系统所有数据在中台存储
2.2.6、 开发边界
中台数据的原子操作接口,完成通用功能的组件开发,实现具有复用性的不可拆解原子服务,可配置可编排能力
3、 拆分执行规则
3.1、 前台工程目录
说明:在拆分规则中说到前台可以存储自己的差异化数据,因此需要有dao模块操作数据库;domain主要定义持久层对象po,用于与数据库层表对象保持一致;rpc用于调用外部接口、包括中台接口以及外部接口、前台内部接口;service层用于实现主要业务逻辑,以及数据组合;web层为视图层、用于页面数据的注入、前端交互数据的封装
3.2、 前台工程模块调用关系
说明:dao层直接交互数据库,用于数据库的增删改查;rpc调用中台服务,这里需要实现rpc层的监控;service层通过调用dao层以及rpc层的接口实现数据获取与封装,主要业务逻辑也放至该层实现;web层只调用service层提供的接口,这里页面需要添加响应监控以及入参日志打印
3.3、日志规范
接口调用端:rpc层调用中台服务需要添加接口的入参日志、出参日志;日志添加方式可以通过拦截器或通过filter实现,接口日志打印需要添加日志ID,日志ID采用本地线程隔离 页面请求入参:页面请求需打印出请求url,请求参数,同时日志中增加日志ID便于做上下游排查;实现方式可以通过拦截器实现 异常日志:对于异常日志的打印、需打印出异常所在方法传入的参数、这样可以通过定位入参回溯问题场景 服务端:需打印请求入参,响应出参,并发量大的服务可动态切换日志级别或关闭日志打印 Mq日志:处理异常的日志需打印出消息体。消息量大的mq可动态切换日志级别或关闭日志打印
3.4、 监控规范
接口监控:对consumer和provider进行监控,调用次数监控、性能监控,监控key需包含类名、方法名,同一个方法不同渠道使用监控key中最好包含渠道;核心接口需要在jsf中配置流量监控,方便排查流量来源 页面请求监控:监控controller层方法,前端页面可监控页面刷新 核心方法监控:影响该工程的核心流程的代码块、方法需要添加监控 监控key分级:监控key重要度分别为p0、p1、p2,在监控key中需体现监控级别
3.5、 实体对象规范
BO(Business Object)业务对象:封装对象、复杂对象、里面可包含多个类,用于表示一个业务对象;BO对象的包路径可存放在service层的bo目录下,也可存放在domain模块的bo目录 VO(Value Object)表现对象:前端界面展示对象,用于页面数据的展示,与前端进行交互的对象;VO对象可存放于domain模块的vo目录,也可存放于service层的vo目录 DTO(Data Transfer Object)数据传输对象:接口对象,用于接口之间的交互,所有的接口出入参对象均用DTO对象;DTO对象定义在sdk包中 DAO(Dao access Object)数据访问对象:与数据库结构对应,一个DAO对象对应数据库的一张表;主要用在数据库访问中,存放于domain模块 对象转换方法:DAO、VO、BO之间的转换可以在各自模块中定义Mapper、Builder工具类实现,这样对象变更后只需改动对应Mapper或Builder类即可、实现代码逻辑与数据封装的隔离以及最小限度降低数据结构改变带来的代码逻辑改动风险
3.6、 中台读写服务分离
读写服务按接口分开,便于对写服务进行权限控制。写服务需增加token或者网关调用权限控制,调用方需配置token或通过申请审批后才能调用。中台对外核心服务均需采用该方式
4、 注意事项
4.1、 接口读写分离
便于做写接口权限控制,在压力达到一定量后可以借此实现读写应用分离
4.2、 需求前中台分解
需求评审需要前中台拆解委员会参加,对于前中台归属不明确的需求由拆解委员会评审决定,拆解委员会由业务支撑组成员加leader和负责po组成
4.3、 公共中间价
在开发过程中尽量使用公司统一的中间件避免独立开发,这样可以便于中间件的维护,减少不必要的成本以及风险
4.4、 中台稳定性
中台服务具有稳定性,不应因某一特定业务逻辑的变化而进行针对性开发,应避免高频变动带来的开发成本以及系统风险
作者BLOG:www.liangsonghua.me
作者介绍:京东资深工程师-梁松华,在稳定性保障、敏捷开发、JAVA高级、微服务架构方面有深入的理解