文档章节

记最近的坑

 锦语冰
发布于 2017/01/13 23:24
字数 1476
阅读 16
收藏 1

    来tn后,一直在写业务代码,感觉不会遇到难点。然而最近的需求虽然仍是业务,但坑颇多,记下。

    背景:CEO&董事长想在首页产品列表看到精华点评,好久之前就和产品说过。产品一直没有提上日程,老总心血来潮,让上这个功能。产品终于放在了心上,提了一个需求——苦了研发(me)

    讲一下最初的情况:点评系统支持查询金华点评,但不支持批量(根据产品ID)查(因为以前点评都是在详情页,用户需要先点进产品详情页,再点击点评,才会看到点评,并发量不是很大,没有批量的必要)。然而,首页的产品列表是用户一打开app就会直接加载的,而且是产品列表,不是单个产品。另外,点评系统不稳定,性能不好,对方说,瓶颈在DB,不在IO,对方还说,只要老板加机器,就没有瓶颈。。。

    然后我只能在for循环里一次调用点评系统。

    研发经理知道这个需求很坑,但是是老大的需求,创造条件也得上!让我异步的调用后台,并在用户请求第一页的时候,异步调用下一页的点评。这里,会用到缓存(redis)。说道缓存,让人又爱又恨——它即提高了服务端响应速度(不用每次都查库||调接口),又增加了逻辑、程序复杂度(后面再讲)

    首先讲经理的思路:

    方案一:服务端每页十条数据,并发调用点评接口

    方案二:客户端异步调用点评信息,但是app拒绝(很有道理,如果app自己调用,那还要我们干什么?另外,那一天老总明白过来,不想要点评了,已经发出去的app是收不回来的,服务端则可以自由的上功能、下功能)

    最终选择了方案一,并决定v906才开始支持点评,v905及之前不用支持(坑1)。指定城市支持点评,其余不支持(坑2)

    缓存方案:1 以十条产品为一个单位,存储下他们的所有点评

                     2 这十条产品分别存入缓存(因为1种的不同单位可能含有相同产品)

                     3 请求第一页时,异步请求下一页(该页放入缓存,该页每条产品也放入缓存) 

    我的解决方式:先从缓存里取1单位,如果有,皆大欢喜。如果没有,依次从缓存里取,并把缓存未命中的存到list里,最后异步从后台获取,并按缓存方案1,2设置缓存。

    缓存是redis,异步方案采用spring rest + http client + hystrix(熔断、并发、降级)

    异步下一页的方案是,构造一个事件,扔到阻塞队列里,开一个线程池,从队列里消费事件。消费的逻辑:判断缓存key是否存在,存在什么都不做,不存在,按“我的解决方式”来。

 

    其实,还是有更好的方案的,点评后台提了两个:

    1 他们把精华点评塞入redis,每天更新。缺点是万一缓存地址变了,我们这边除了该配置,重启,没有别的方法更改缓存地址(其实,可以使用jmx)

    2 他们把点评塞入mq,及时性高。

    但最终,点评后台还是选择了在规定时间内,提供批量查询的接口给我

 

    关于点评,有关联线路点评这一说法,详情页都会取关联点评(即,点评不一定是该产品的点评。。。)。关联线路点评的productId与产品本身的productId不一样(坑3)

 

    先说坑3:刚开始不支持批量时,我会从后台获取产品的第一条精华点评(该产品、关联线路,都会取),由于可能会是关联线路的,由于productId不一样,会让程序(其实是程序员-我)以为该产品没取到点评。在经理的提醒下,我手动把关联线路点评的productId设为该产品的productId。

                    后台提供批量查询接口的时候,也犯了这个错,他门也手动改了id(我这边就不改了)

  坑2:由于预订城市是我这边可以得到的,但是是在  fun1(request)  函数里得到的,而我在fun2里做点评,调用fun1时,它并没有把cityCode返回,所以我把cityCode放入request中。由于先读缓存,缓存里有,就不会调用fun1,从而request.cityCode==0,即该城市不支持点评。最后,我把cityCode也存入了缓存(这个坑的缘由的发现也是经理,我发现了现象,但是本地写死了是1602(南京),所以本地始终没问题。)

    坑3:版本控制。在预发布测时,由于是906(还未推向市场)的包,没有问题。但是到了线上,大量版本<906的请求过来,导致缓存里全是没有点评的产品信息,从而906版本读缓存时,没有点评!最后,按照是否需要点评分别缓存(这个坑的缘由的发现是我师傅达先生,写代码的我2个钟头没想到,他3分钟内想到了,姜还是老的辣)

 

    由于今天是周五,想上线只能等到下周一,或者紧急上线。app今天封包,下周1,2,3回归,周3下班发包。想紧急上线,同事建议拖到周一晚上上线,因为紧急上线是记名的(你懂得)。但睡完午觉后,同事又提醒,下周一是会员日(每月16号), 不准上线,所以只能紧急。

 

 

 

 

 

 

 

© 著作权归作者所有

上一篇: 索引小试
下一篇: getting start
粉丝 2
博文 42
码字总数 37034
作品 0
南京
程序员
私信 提问
centos 7( linux )下搭建elasticsearch踩坑记

目录 概述 环境准备 elasticsearch配置 启动踩坑记 彩蛋 概述 公司最近在做全文检索的项目,发现elasticsearch踩了不少坑,百度点进去又是坑,在此记录一下自己的踩坑历程。 本文旨在单机版的e...

java_龙
2018/10/17
529
4
android自定义编解码器记录

最近折腾了一下软编码器,网上的资料好少,踩的坑记一下 从frameworks/media/libstagefright/codecs下面找一个enc的代码看看 无非是从SimpleSoftOMXComponent继承,然后实现onfill什么的,自...

pcgg5244
2017/05/04
0
0
【2016-03-30】Hive数据类型

最近在Hive数据类型的使用上遇到个坑,记一笔~ 我们的Hive网页版在建表的时候默认字段类型是TINYINT,用户数据是数字的时候一般不会去改成INT类型。 之后会把数据LOAD到表里,结果select * ...

rathan0
2016/03/30
14
0
《币圈笔记》第278期:天道循环

19年02月26日,记资本的规律。 最近利好不断,虚拟币行情却没有太大涨幅,说明币圈热情被前两天那波跌幅消磨了大半。 与之相反的是,股市最近行情很不错,很多人都嚷嚷着牛市要来了。回顾之前...

币圈天行
02/26
0
0
老铁,一起来开Party(一) —— 声网Agora SDK集成

叔想做个直播demo很久了,最近终于得空,做了一个视频群聊Demo,以飨观众。 直播云有很多大厂在做,经老铁介绍,Agora不错,遂入坑。Agora提供多种模式,一个频道可以设置一种模式, 切换方便...

沉默的范大叔
2017/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

调用约定

对于常见的指令集,在指令层面没有所谓的“函数”概念,只有“子程序”概念。子程序是存储在“主程序”之外的一段指令。子程序通过call指令调用,通过ret指令返回。子程序可以使用内存、堆栈...

tommwq
45分钟前
3
0
设计类题目

1. 订单 和 退货单之间有什么关系? 答:退货单是 用 用户提交退货 和 订单生成的 或者 订单和退货单都是一张单子,用一个状态标识 2. 在这种由源头单生成的流程中,第二张单子是怎样生成的?...

杨凯123
今天
5
0
读写锁分离

java.util.concurrent.locks包定义了两个锁类, 我们已经讨论的ReentrantLock类和 ReentrantReadWriteLock 类。 如果很多线程从一个数据结构读取数据而很少线程修改其中数 据的话, 后者是十...

ytuan996
今天
6
0
金钱焦虑症测试 -- 人人都有吧?

你经常觉得钱不够花,被金钱困扰着吗?试试这个焦虑量表测试,测试一下你的金钱焦虑指数吧。请选择选一个最适合自己态度的答案。买买买的欲望高吗?又是一个节日,有打折活动;又被种草一个化...

蛤蟆丸子
今天
4
0
JAVA-LOCK之底层实现原理(源码分析)

首先和Synchronized(可以参考) 的不同之处,Lock完全用Java写成,在java这个层面是无关JVM实现的。其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类,简称AQS。 简单说来,...

小海bug
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部