代码review
亚马逊代码review
美客多review
本文档使用 MrDoc 发布
-
+
首页
亚马逊代码review
# 代码 review 记录 > review 参与人:马超、马锋军、范松杰、陈俊安、刘尚、杨磊、方罗、张庆 > review 工程:mdc-meta-amazon、mps-product-amazon > review 业务:基础信息、刊登商品 > review 范围:代码设计、代码规范。 # 代码设计 ### 1 责任链的上下文 > 问题描述:责任链很多节点的中间态数据都保存在上下文对象中,数据量会不会太大,内存释放是否存在问题? > 问题代码: ```java @Data @Builder public class ProcessContext { /** * 站点 */ private String site; /** * 模板类别 */ private String category; /** * Excel工作薄 解析Excel专属参数 */ private XSSFWorkbook workbook; /** * 模板信息 解析Excel专属参数 */ private TemplateInfo templateInfo; /** * 类目信息 */ private CategoryInfo categoryInfo; /** * 执行节点 */ private List<IProcessNode> processNodeList; /** * 数据定义列表 解析Excel专属参数 */ private List<AmazonDataDefinitionsDto> amazonDataDefinitionsDtoList; /** * 数据定义列表 解析Excel专属参数 */ private List<AmazonValidFieldDto> amazonValidFieldDtos; /** * 数据定义列表 类目 Item_type */ private List<AmazonCategoryItemType> amazonCategoryItemTypes; /** * 店铺信息 */ private ShopTokenInfo shopTokenInfo; /** * 获取Redis翻译key * * @return Redis翻译key */ public String getRedisTranslateKey() { return RedisKeyEnum.REDIS_TRANSLATE.getType() + this.site + CommonConstants.COLON + this.category + CommonConstants.COLON; } } ``` > 优化方案:经过测试亚马逊基础信息上传 EXCEL 接口访问频率不高(2-3月一次),每次请求进来创建新的上下文,上下人不会复用,用完 JVM 会回收。 ### 2 责任链模式的复杂性 > 问题描述:责任链顺序问题如何控制?新人如何快速学习流程? > 优化方案:mdc_pltform_meta_base 库下 amazon_process_node_info 表里面配置每个责任链功能的节点顺序,程序通过该配置控制流程顺序执行。后期会补齐使用文档和代码注释,方便新人熟悉。 ### 3 POI 问题 > 问题描述:程序使用 POI 解析 EXCEL,会有最大行数限制(65535),数据量太大时可能会造成 OOM,如何避免? > 优化方案:根据实际测试情况看,目前业务使用到的 EXCEL 数据量不会未达到该限制,最多不超过 1w 行,且不会造成 OOM 。 ### 4 事务范围 > 问题描述:事务范围是否过大,数据校验方法可能会时间太长(因为涉及 Feign 调用)。 > 问题代码: ```java @Transactional @Override public PublishSubmitVo addProduct(AmazonCreateProductQuery amazonCreateProductQuery) { ... // 字段规则校验刊登 该方法内部涉及 Feign 调用及数据校验环节 checkField(amazonCreateProductQuery, shopTokenInfo); // 保存刊登数据 只有该处涉及数据操作 AmazonTask amazonTask = saveTask(amazonCreateProductQuery); ... } ``` > 优化方案:Feign 接口内部做了优化(使用 CompletableFuture ),并发查询数据,且该处需要保证整体方法的事务(业务层面)。 > 优化代码: ```java public ProductTypeAttributeSchema getProductTypeAttributeSchema(AttributeSchemaVo attributeSchemaVo) { // 返回结果父对象init ProductTypeAttributeSchema schema = new ProductTypeAttributeSchema().setVariationAttributeSchema(new ProductTypeAttributeSchema()); // 初始化类型(如果没有传就代表该站点所有类型都适配, 赋值all) attributeSchemaVo.initCategory(); // 查询额外必填约束规则 CompletableFuture<Void> extraFuture = getExtraFuture(attributeSchemaVo, schema); // 查询公共模板字段 CompletableFuture<Void> templatePublicFieldsFuture = getTemplatePublicFieldsFuture(attributeSchemaVo, schema); // 查询关联属性 CompletableFuture<Void> relationFuture = getRelationShipFuture(attributeSchemaVo, schema); // 根据categoryId查询itemType CompletableFuture<Void> itemFuture = getItemTypeFuture(attributeSchemaVo, schema); // join CompletableFuture.allOf(extraFuture, templatePublicFieldsFuture, relationFuture, itemFuture).join(); return schema; } ``` ### 5 业务临时文件存放 > 问题描述:业务内部使用到的临时文件,如果需要永久保存应保存在 /data/logs 下(该目录已挂载宿主机),如果为临时文件应放在 /tmp 下,Pod 销毁时会清除该处数据(会有丢失风险),不建议自定义存放路径。 > 优化方案:程序业务产生的文件会上传腾讯云 COS 保存,数据库记录文件链接,程序内部会尽量使用字节数据或者流走业务流程,减少文件写到磁盘的情况。 ### 6 循环操作数据库问题 > 问题描述:在 for 循环中操作数据库,建议改成批量操作,减少数据库网络的 IO 次数,提高操作速度。 > 问题代码: ```java private void updateTaskOnlineResultStatus(List<AmazonProductFollowTask> amazonProductFollowTasks) { amazonProductFollowTasks.stream().forEach(amazonProductFollowTask -> { ... amazonProductFollowTask.updateById(); }); } ``` > 优化方案: ```java updateTaskOnlineResultStatus(List<AmazonProductFollowTask> amazonProductFollowTasks) { amazonProductFollowTasks.stream().forEach(amazonProductFollowTask -> { ... }); this.updateBatchById(amazonProductFollowTasks); } ```
chenjunan
2022年8月16日 19:26
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码