精华内容
下载资源
问答
  • 先进先出的概念从字面意思理解,先进先出,指的就是同一个代码的货物“先进入仓库的,就要先出库”。为什么会有这个原则呢?这就涉及到仓储管理中的另外一个概念了——失效期。这个失效期,我们也称之为保质期,也...
    6b233c46405f45eacaadd902f840860e.gif3ad5c0240c1f7455267aead56be365dd.png108683f4c2e091cedd165720983217a0.png

    导读:库中有一个原则叫做“先进先出”,是不是就是先收进仓库的货物,就要先发出去。可不可以理解为,仓库就是按照收货日期来管理的,跟生产日期又有什么关系呢?

    c30d75517fedfaad0f65a1527c05febc.png先进先出的概念从字面意思理解,先进先出,指的就是同一个代码的货物“先进入仓库的,就要先出库”。为什么会有这个原则呢? 这就涉及到仓储管理中的另外一个概念了——失效期。这个失效期,我们也称之为保质期,也就是产品从生产出来到过期是有一段时间的,比如,洗发水的保质期为36个月,一瓶酱油的保质期为18个月。 仓库管理中,同一个代码的产品,会陆续有新的生产日期的进入仓库,那么,为了防止产品在仓库内存放变质,在发货时,就会设定优先去发那些早入库的商品。 先进先出的本质

    先进先出的概念,其实最早是开始于生产工厂的仓库,那个时候,通常产品的代码不多,每个仓库只接收当地工厂下线的产品,所以,我们按照“先进先出”的原则发货没毛病。

    不过,随着甲方生产品类的逐渐增多,以及销售范围的扩大,有的客户业务范围扩大至全国。在全国建设了生产不同的产品的工厂,为了节省物流费用,原有的只是服务于生产下线产品的仓库,功能开始变得更强大,转变成了区域分销中心(DC)。

    每个区域分销中心仓库,开始全品类布局。不只是存储当地工厂下线的产品,也会接受从全国其他工厂以及其他仓库的到货。这个时候,就会发现,从其他仓库调拨过来的货物,虽然是后进入的仓库,但是有可能生产日期却早于现有库存中的部分产品(如果大家不理解,可以在留言区交流)。

    这个时候,如果仍然从字面的理解,按照“先进先出”来发货,显然就失去了意义。所以,在现代化的仓库管理中,“先进先出”的本质其实是“先失效先放行”,也就是说,我们不是按照入库的时间来判断,而是基于产品的失效期来判断。

    先进先出的操作流程仓库运营成本:系统操作界面的转换、库存盘点操作、货架利用率及拣货路径。 发货速度:拣货方式、拣货库位指引、拣货路径优化。 人员管理:操作人员培训、操作方式转换的学习成本。 上述三者的相互关系和影响的阐述: 如果库存精细度要求是唯一码管理,需要精准的拣货指引,完成订单准确率要求100%,那就需要最精细的库位设置和唯一码级别的出库校验,由此一般会降低货架利用率和延长的出库时间。 如果多SKU同库位,拣货库位指引的精确度会降低,由此一般会增加拣货时间等等。因此在确定货品管理精细度时应该针对业务实际情况全面考虑和设计。 库存货品管理精细度的编码方式和数据结构  对于产品的基本属性,由SKU承载,在产品中心维护。对于产品变量属性的信息由采购中心提供(到期日期,厂商批次号,入库批次)。库位编码是在库房范围内指定的位置信息(类似街道名称和门牌号码),便于指引找到所需货品。 WMS系统中,对SKU管理是不需要变量属性的信息,库存货品编码可以直接采用SKU码。SKU管理的先进先出的实现是由库房的库位操作管理实现的。RECOMMEND发现更多2f6c1d32e31ac781ed995c8f1a3545aa.gif

    战略升级,优品推出“企业会员”服务平台,实现包材直采!

    RECOMMEND优品链企业2f6c1d32e31ac781ed995c8f1a3545aa.gif塑胶容器&配套类宇恒塑业   鸿昇包装   塑鼎包装纳美容器   美妆优品   鸿鑫实业凯沛包装   富全塑业   铨业包装薇诺包装   峰云泵业   禾加塑业澳盈包装   伍粤包装   隆妆塑业亚圣塑胶   环洲科技玻璃容器类 鸿业玻璃     华祺玻璃     新晶玻璃彩妆&化妆工具类Q牌粉扑     万晖实业     丹鸿塑业聖美精密    协和包装    匠鑫包装雨菲粉扑    秀尔塑胶印刷&辅助包材类顺成实业    飞翔印刷    粤彩包装 博思特包装(会员排名不分先后,正在招商中)f3e01b68e6712b813227a60e9abfca22.png14507c5c230cccde23c25b02c4ad2733.pngd1889a08a1d65a6750c9d434eafb706f.gif本文内容来源于公众号:智慧工厂仅供优品会员参考,如有侵权,请联系我们删除如需转载,请注明源出处f4035ea0b218be6ec2a6f1b192bdf92b.png88391db388a79e6872c697885b6a77b3.pngd3b6e63894426ceae88bd6b071a6e608.png14507c5c230cccde23c25b02c4ad2733.png了解更多,请登陆优品包材系统化妆品行业包材采购与供应链服务平台WWW.YOOPAC.COM
    展开全文
  • 对于一个当前产品需求频繁迭代更换的年代,应用中的某个模块被下线、服务根据使用量扩缩容、数据库扩充合并的操作肯定是必不可少,而最近由于对一些服务资源使用的不合理,也对这些资源进行了下线、缩容、合并等...

    前言

            对于一个当前产品需求频繁迭代更换的年代,应用中的某个模块被下线、服务根据使用量扩缩容、数据库扩充合并的操作肯定是必不可少,而最近由于对一些服务资源使用的不合理,也对这些资源进行了下线、缩容、合并等操作。正所谓由奢入俭难,下线服务、数据库合并都是非常危险的操作,并不是直接操作kill进程、释放数据库那么简单,需要注意的地方很多,因此总结一下。

    服务下线

            如果被下线服务前提是流量少,则需要做相关的数据统计,统计后与相应产品伙伴确认,

    • 需要在网关层面统计服务器accesslog是否达到产品、运营同事规定的下线标准;
    • 从数据库中统计相应使用UV数量。

    服务下线前依赖资源统计

    • 确认部署的各个环境服务器是否有共用情况,比如一个实例上部署多个服务,如果有则下线时无需处理该实例,通过linux进程名筛选及暴露端口;
    • 同样确认该服务使用的中间件:数据库实例中有无其他库(或通过连接情况判断)、Mq的Topic、Redis实例的链接情况等;
    • 还需要查看是否有被其他服务依赖的接口。

    相关数据的备份

    • 资源统计后,需要对所有数据进行备份,数据库中全量数据备份保存;
    • Git仓库代码记录;
    • 配置文件内容记录;
    • 如果有必要还需要对整个服务的生命周期进行记录,需求文档、技术文档等;
    • 该服务如果有单独域名,也需要记录各个环境下不同域名,需要最后释放。

    服务下线前的信息同步

    • 被下线的服务影响到客户端版本、服务器之间依赖等,需要与产品、运营、测试、技术支持的伙伴同步相应消息。

    数据库合并

    mysql数据库合并迁移

            除了服务器的缩容与下线,也会有数据库实例的合并,数据迁移的话使用阿里云比较成熟dts同步工具,将数据从一个实例导入另外一个实例。

    • 迁移时会增加数据库的iops,同步迁移时选在业务低峰期。
    • 迁移后需要服务端发版改变对应数据库配置链接,需要更多的注意是否有多台机器、不同环境同时连接目标实例,特别需要注意数据同步的问题。如下图所示:我们的灰度(内测)环境与生产链接同一个数据库,如果线上发版时不能保证读写数据来源的一致性,就会导致这段时间数据的不一致性。如下图所示,如两台ecs服务器在发版中连接不同的数据库实例,而其中源实例A使用dts同步向目标实例B写入数据时,如果出现双写(两台ecs服务同时写入数据)便会导致数据的不一致性。
      在这里插入图片描述
      方案:生产发版时 kill掉内测服务,在生产发版结束后再重启内测服务,并且在生产发版时采用摘机方式发版。

    redis合并与迁移

            对于redis我们大多用来当做缓存,有少量的未持久化的业务数据也使用redis实现,如使用zset来计算学生排名。我们也是使用云上工具dts进行迁移,迁移时需要注意以下问题:

    • 相同key数据需要确实是否可以覆盖或者跳过;
    • 相同key,相同的业务数据value,但是对应value的序列化方式不一致,需要重点考虑,如下图所示,相同的value及相同的业务数据value,在不同的服务中对value取值和赋值时采用的序列化方式不一致,会导致其他服务的数据异常问题;如下图,serviceA和serviceB在进行redis合并后,有相同的key,且key序列化方式一样,value序列化方式不一样便会导致其中一个服务在取值时出现异常。
      在这里插入图片描述
      方案:尽量避免在复用redis时,key冲突,即使k-v相同也要对序列化方式进行确认。

    服务缩容

            服务缩容主要是对应服务器缩容下线,则需要进行摘机进行。

            对于服务下线,要像每次上线一样谨慎再三,因为涉及到的依赖服务、中间件、待释放的实例,都随时可能影响到其他在线上正在稳定运行的服务。

    结语

            以上所做的全部服务下线操作基本都是为了确保下线时不影响到其他服务,以及使整个下线过程是可逆的,即使在下线后再要求上线也能在较短的时间内完成服务再次完整上线,以防止出现的更多风险。

    展开全文
  • 系统下线工作总结

    千次阅读 2013-06-23 17:33:44
    前两个月,我负责了公司老系统:ERP(第三代营运支撑系统)的下线工作,从4月份到6-1。这段时间对这项工作的有很多的感触,现在比较闲了,我就对这项工作做一些总结,也给有类似情况的各位同仁提供一些参考。  ...

           前两个月,我负责了公司老系统:ERP(第三代营运支撑系统)的下线工作,从4月份到6-1。这段时间对这项工作的有很多的感触,现在比较闲了,我就对这项工作做一些总结,也给有类似情况的各位同仁提供一些参考。

           首先,我先来讲下背景:公司为了将来的发展及上市需要,重金打造公司第四代营运支撑系统。这个系统从立项到最终上线,经历了2年时间。2013-06-01新一代的营运支撑系统即将要上线,很多其他的周边系统要配合进行改造,把原来对接到ERP的接口改为对接到新一代的系统(下面简称A),这包括ERP在内,总共周边系统加起来有16个,上线工程异常庞大,对公司影响巨大。  鉴于此背景,A与ERP的割接方案采取“一刀切”的方式进行(具体原因不讲),A对ERP提出了以下要求:1、由于A要进行数据迁移的需要,通过分析梳理,需要ERP进行相应的功能改造,来满足A系统数据模型的需要;2、6-1 10:00 ERP当中除了指定的一些功能之外,全部切换为只读状态,不允许对其进行增、删、改。

           接下来,针对这样的需求及背景,IT专门成立了“周边系统配合A割接上线项目组”,ERP包括其中。而由于我一直以来就是做ERP维护的,所以有幸被领导指定为“ERP配合A割接上线负责人”,而ERP这条产品线(需求、开发、测试、应用、DBA)的资源我都可以随意调动。

               再接下来,我针对A对ERP的要求,及现阶段的工作情况,做了以下分析:其实在成立项目组之前我不是作为ERP配合A的负责人,是另外一个人(接下来简称B)。等到项目组成立时,我伸手去接这个事情,B也没有做一些具体的工作,只会崔A那边的人员,而且不是B本人去崔,是通过另外一个人(简称C),而C由于本身工作也比较多,所以只是一段时间崔下,没有具体跟进。所以等我去接手时,B也没有做什么交接,也没有跟我说什么其他的,其实跟没做一样。

             针对这样的现状,我梳理了下工作的方向及思路:

    1、明确用户需求,走需求流程,后有变动,走需求变更流程;

    2、对A提出的两个需求,我和ERP另外一位开发负责人(简称D)共同简单讨论了一些方案;

    3、针对方案中的一些未使用过的技术进行技术预研;

    4、根据技术预研的结果,编写ERP下线方案PPT,并进行评审与相关问题决策;

    5、走系统变更流程,明确开发、测试时间;

    6、6-1 配合A进行部署;

    7、部署校验及相应的值班计划。

     

    “明确用户需求”这点,由于A针对ERP要放开的功能目前未确定,但是又不给出一个确定版的时间,我找A那边的负责人明确给出一个具体的时间,并把这个事情邮件发送给相关领导知晓,后来这件事情就按时给解决了。

    “需求解决方案”这点,我找了ERP这条产品线中的D讨论了初步的方案,然后再跟应用及DBA进行相应的讨论。最后得出的解决方案是:ERP只读查询,除一些例外功能,解决方案是:Oracle权限控制实现。

     

    “技术预研”这点,根据我们最终采用的解决方案,Oracle权限控制实现。有两种不同的手段,第一种是表空间权限控制(即新建一个表空间,把可以进行写操作的表移动到新建表空间中,其他表空间只读);第二种是用户权限控制,即新建一个用户,分配给这个用户可以进行写操作的表权限。这两种方案无论哪一种,都需要把有写操作权限的表找出来,而要找这些表就得从可以进行写操作的功能里面找。经过开发的力量,最终查找出来这些表的清单,及这些表所对应的功能。经过对这些表的分析,发现有几张表不仅数据量大(上亿级)而且对业务有重要影响。如果采用表空间的方式,则移动这些表会造成索引失效,影响业务,而且这个移动不是说几分钟能够移动完毕的,而需要几个小时。所以最后没有采用这种方案。

     

    “编写方案PPT”这点,采用的方案,各参会领导及架构师都是认同的,但大家争论的焦点是,方案实施后的测试范围。通过从DB中查找信息发现,现在的ERP系统中有1700多个菜单,可想而知,对1700多个菜单进行测试的工作量是多么的大,而且可能大部分的工作都是白费的。针对这个问题,第一次会议没有达成一致意见,我总结了第一次会议的情况,在第二次会议时给出了4种解决方案,并最终大家投票通过。结论是:例外功能都要测试+重点的查询功能。

     

    “走系统变更流程”这点,起初不是走的这个流程。总的来说,公司的流程有点复杂,质量部对一些新制定的流程没有把控好,流程发布后问题非常的多,而且存在的争议较多。这个过程经历过流程没走对的情况,与B争吵过,并最终把B说服走”系统变更流程“。之后开发开始开发脚本并在开发环境测试,确定转测试时间,测试准备测试环境并测试。在这过程中也遇到一些问题,我负责跟踪解决,比如开发测试沟通机制,这确定了之后提高了问题解决时效。

     

    “周边系统影响分析”这点,这点做了很长时间,跨越了几个阶段。这点我主要是从DB当中的用户所对应的应用,及这些应用中所提供服务的调用系统。召开会议一一确认影响及ERP这边的解决方案,最终成功消除了影响分析不到位的问题。这项目工作分析的最深层次出发点是,哪些操作会修改ERP的数据,所以除了上面说的周边系统影响,还有一个工作流的影响:我们公司有一种“数据变更工作流”,用来处理因系统问题或其他业务考虑不全情况下的数据更新措施,既然ERP只读,那么针对“ERP”的数据变更工作流,就在提前结束,为此我联合服务部向一线发布公告,在5-31  20:00之前起草完要处理的ERP数据变更工作流,开发员加班审批。

     

    “6-1 部署上线”这点,这点前面的工作做得很好,包括配合A的模拟割接,但是在这点有一点没有考虑到问题在当时发生了。我们采用的解决方案是:新建一个用户,使其对所有表都有查询权限,但是只对某些表有写操作权限。这种方案的话,就涉及到对应用修改数据库配置文件。而ERP应用采用集群,有20个节点,其中4个节点是在一台刚换两个月的服务器上。而负责替换工作的应用组负责人,之前对ERP应用并不熟练,只部署过两次。我也考虑到如果所有节点没有覆盖全的情况,但是没有考虑到另一个问题:LINUX系统不同,相应的shell脚本会有所不同,这点没考虑到,而生产上确实就是这样的情况。由于这个问题,操作人员之前提前写好的shell脚本对两台机器不适用,就包括新换不久的机器。在正式操作的时候,只能临时想命令了。而操作人员把新换的一台服务器给遗忘了。这种情况在部署后的校验方面非常难校验出来。这个情况最终导致有一些数据进入到ERP系统,后面通过ERP与A的相关人员协商,把这些数据手工给处理掉了。

     

    “部署后校验及值班计划”这点,主要是测试人员验证,提前准备好验证用例,对功能进行校验,最终由于F5随机分配,刚好测试人员都没有分配到有问题的机子上,导致从部署操作完成之后,到一线反馈问题已经过去40分钟,所以说这种很不容易测试。如果没有这个问题,ERP下线计划及最终取得的结果应该来说是完美的,但是即使出现了这个问题,最终的结果应该来说还是很成功的。ERP下线后没有接到除此问题之外的问题。

     

           最后,我总结了下,我对shell还不熟悉,一个是由于公司原因,分工很细,另外一个是自己还学得不够深入。我想,这总的ERP下线的工作思路及当中相关技术问题的解决与处理方案是适用于一些公司的实际情况的。从这个工作,也加强了我对整体把控能力的锻炼, 我在这项工作中收获很多,希望与各位一起学习。

     

    展开全文
  • 公司技服反馈,公司产品在某处使用过程中发生查询结果错的问题,可能涉及到保密问题,所以说的比较笼统,原文如下: 写了一过程,声明了一带参数的游标,限定了查询结果,可是运行发现这个游标查询的是一...

    记一次多次智商下线导致的奇耻大辱

    出来混,智商是关键,智商下线总会把一件简单的事情复杂化,导致花费更多的时间却做不好事情。最近刚好遇到这样的一次经历,记录下来,用来提醒自己。

    第一次问题反馈

    公司技服反馈,公司产品在某处使用过程中发生查询结果错的问题,可能涉及到保密问题,所以说的比较笼统,原文如下:

    写了一过程,声明了一带参数的游标,限定了查询结果,可是运行发现这个游标查询的是一个全集。

    第一次智商下线

    简单的分析了一下反馈内容,脑海中简单回忆了一下,没有关于带参游标的概念,然后去查阅了一下公司产品的帮助文档,也没有发现关于带参游标的概念,于是想当然的认为对方的意思表达的有问题,可能是想说存储过程带参数,然后游标里面用到了这个参数作为限定条件,但是执行之后发现限定条件没起作用,导致结果多了。
    没有用例,于是打算自己编写用例复现问题,然后分析原因。
    用例如下:

    create table test(col int);
    insert into test values(1);
    insert into test values(2);
    insert into test values(3);
    
    create or replace procedure sel(con in int) as
    declare
        cursor csr for select * from test where con = col;//查询表test的col列与过程sel的参数con一致的结果
        ret sel % rowtype;
    begin
        open csr;
        fetch csr into ret;
        while csr % found loop
            dbms_output.put_line(ret.col);
            fetch csr into ret;
        end loop;
        close csr;
    end;
    
    select * from test; //预期结果3条1 2 3
    
    exec sel(1); //预期结果只有一条 1
    
    exec sel(2); //预期结果只有一条 2
    
    exec sel(3); //预期结果只有一条 3

    简单执行后,发现结果符合预期,所以算是复现失败,于是找到技服,进一步了解。

    第二次智商下线

    简单问过技服之后,技服说有过电话沟通,那边说是字符串类型。于是,第二次智商下线,简单的修改用例,改成如下用例:

    create table test(col varchar(10));
    insert into test values('1');
    insert into test values('2');
    insert into test values('3');
    
    create or replace procedure sel(con in varchar(10)) as
    declare
        cursor csr for select * from test where con = col;//查询表test的col列与过程sel的参数con一致的结果
        ret sel % rowtype;
    begin
        open csr;
        fetch csr into ret;
        while csr % found loop
            dbms_output.put_line(ret.col);
            fetch csr into ret;
        end loop;
        close csr;
    end;
    
    select * from test; //预期结果3条'1' '2' '3'
    
    exec sel(1); //预期结果只有一条 '1'
    
    exec sel(2); //预期结果只有一条 '2'
    
    exec sel(3); //预期结果只有一条 '3'

    用例执行,显然,结果依然符合预期,复现再次失败,仔细反思流程,终于觉得是不是忽略了用户所说的带参游标的问题,于是终于想起了度娘。百度发现带参游标是真实存在的,于是找到了一个简单的用例试验。
    用例如下:

    create or replace procedure a
    as
      cursor b(c_id int) is select * from d where id=c_id;
      begin
        open b(111);
      end;

    在自己那里试验了一下之后,发现语法总是通不过,于是再次想当然的认为用户所说的带参游标公司产品确实不支持,所以按照用户的说法第二套复现应该能够成功,但是仍然失败,怀疑是公司产品的一些周边产品的问题。想请技服再次与用户沟通,进一步的确定问题所在。

    第三次智商下线

    与技服沟通过程中,技服是个负责任的人,于是说,确定不支持带参游标么?于是百度了一下,把上面的用例执行在自己本地安装的公司产品上试验了一下,发现能够通过。好吧,这时才发现虽然公司帮助文档中没有提供说明,但确确实实支持带参游标这个功能,而我本地语法通不过是因为使用的是产品的某个分支版本,该版本不支持。
    于是借用技服的机器构造用例:

    create table test(col varchar(10));
    insert into test values('1');
    insert into test values('2');
    insert into test values('3');
    
    create or replace procedure sel(con in varchar(10)) as
    declare
        csr(csr_con varchar(10)) cursor is select * from test where csr_con = col;//查询表test的col列与游标csr的参数csr_con一致的结果,csr_con的值由con提供
        ret sel % rowtype;
    begin
        open csr(con);
        fetch csr into ret;
        while csr % found loop
            dbms_output.put_line(ret.col);
            fetch csr into ret;
        end loop;
        close csr;
    end;
    
    exec sel('1'); //预期一条结果 '1'
    exec sel('2'); //预期一条结果 '2'
    exec sel('3'); //预期一条结果 '3'

    执行之后,发现结果依然符合预期,说明复现依然失败,感觉凭目前的条件无法判断问题所在,于是请技服与用户再次沟通。

    第二次问题反馈

    依然是由于保密,因此这次沟通只得到了两张照片和一段话,由于没有找到合适图床,这里图片不贴出来。图片的内容中主要是过程的名和参数,以及游标的全部定义。

    这个T_CLASSID = ‘AA’根据这三个参数进行查询的T_PNAME等参数结果并不相符,这个T_PNAME反查回去的classid不是AA。

    第四次智商下线

    由于用例和数据依然不完整,但有了大概的轮廓,因此依据这些进行了复现用例的书写:

    create table rt_ttapall(rsltype varchar(10), snum number, pname varchar(10), palia varchar(10), 
        missid number, objid number, classid varchar(10),
        subsys number);
    
    insert into rt_tta_pall values('KA0', 0, 'KeyNo0', 'GNCC当',
        11, 1, 'AA',
        10);
    insert into rt_tta_pall values('KA0', 0, 'KeyNo0', 'GNCC当',
        11, 1, 'AA',
        10);
    insert into rt_tta_pall values('KA0', 0, 'KeyNo0', 'GNCC当',
        12, 1, 'AA',
        10);
    insert into rt_tta_pall values('KA0', 0, 'KeyNo0', 'GNCC当',
        11, 2, 'AA',
        10);
    insert into rt_tta_pall values('KA0', 0, 'KeyNo0', 'GNCC当',
        11, 1, 'BB',
        10);
    
    create or replace procedure pro_in_telpara(t_telmissid in numeric(10, 0), t_telobjid in numeric(10, 0), t_classid in varchar(10)) as
    declare
        t_rslttype varchar(10);
        t_snum number;
        t_pname varchar(10);
        t_palia varchar(10);
    
        cursor cur_telpara(missno number, objno number, classid varchar(10)) is
            select rsltype, snum, pname, palia
            from rt_ttapall
            where MISSID = missno and CLASSID = classid and OBJID = objno
            order by subsys, snum;
    begin
        open cur_telpara(t_telmissid, t_telobjid, t_classid);
        fetch cur_telpara into t_rslttype, t_snum, t_pname, t_palia;
    
        while cur_telpara % found loop //输出所有符合条件的结果
            dbms_output.put_line(t_rslttype + ' ' + t_snum + ' ' + t_pname + ' ' + t_palia);
            fetch cur_telpara into t_rslttype, t_snum, t_pname, t_palia;
        end loop;
        dbms_output.put_line(cur_telpara % rowcount); //输出结果个数 
        close cur_telpara;
    end;
    
    --执行过程
    exec pro_in_telpara(11, 1, 'AA');
    
    --直接查询
    select rsltype, snum, pname, palia
    from rt_ttapall
    where MISSID = 11 and OBJID = 1 and CLASSID = 'AA' 
    order by subsys, snum;

    如上的用例,执行后期望两边执行结果一致,均为两条结果,即按照 11 1 ‘AA’三个条件筛选后的两条数据,但执行后发现select语句直接执行的结果正确,但存储过程执行后的结果确实多了一条,看起来非常像’AA’条件过滤失效或者条件丢失。于是再次想当然的认为成功复现了用户说明的问题而且想当然的认为上面的两个用例的结果应该一致,通知技服给用户反馈,说已经成功复现,确实是我们这边的问题,马上着手修改。

    第五次智商下线

    问题成功复现,于是开始着手修改,首先分析是游标处理过程中将’AA’条件丢失,于是想要确认最终的执行计划上是否有该条件。但发现过程执行时后台不会输出对应的执行计划,没办法,想到先查看select的查询计划,期望游标方式也会生成对应的计划,看计划的差异。
    select的计划很简单,这边执行的过程中是将三个值当作Const直接下放到底层的scan key,按照三个条件确定该算子的返回数据条数,然后上层sort算子执行order by过程。代码调试过程中,发现也确实是这样,三个条件均为Expr表达式,然后昨天是Var,右边是Const,认证了刚才的推想,那么也就是说,返回结果数是有scan key决定的,只要检查游标方式生成的scan key的条件哪里出了问题就可以了,在生成scan key的位置打了断点,进行调试。
    调试的过程中,发现游标方式也会生成同样的scan key,但是上面的条件却不一致,11和1的条件与select的计划类似,一边是Var,另一边是Param。但是刚好’AA’条件不一致,是一个NullTest,也就是说只判断是否为空。于是再次想当然的认为之前的设想得到了验证,确实是计划生成过程中将’AA’条件丢失,而变成了NullTest,于是一步步倒推,希望找到问题发生的位置。
    1 计划的生成位置,已经是NullTest了。
    2 Query生成的为知,Expr已经变成空。
    3 …
    正在继续调试,以为马上就要找到问题原因的时候,技服接到用户电话,说在他执行的用例中把游标的参数改成classno,问题就没有了,没有了,没有了。
    松了一口气的同时,却觉得怎么可能!改个名问题就解决了,和名字有什么关系!
    于是回到刚才的用例,分析了一下游标部分,发现按照用户的操作之后,where条件MISSID = missno and CLASSID = classid and OBJID = objno会变成MISSID = missno and CLASSID = classno and OBJID = objno,区别只是classid变成classno,执行了一下,发现结果确实正确了。
    那么,问题到底在哪呢?难道执行结果还和字段名有关?不可能,那还怎么用!
    仔细分析一下,才回想起来我们的产品并不区分大小写,也就是说,MISSID = missno and CLASSID = classid and OBJID = objno实际上是MISSID = MISSNO AND CLASSID = CLASSID AND OBJID = OBJNO,中间的条件左右两边是一样的!那么是不是因为这个,导致条件变成了表中的字段CLASSID = 表中的字段CLASSID,横真,相当于没有条件。。。
    于是果断将游标参数objno也改成了objid,发现该条件也会不起作用,而若游标参数与表中字段不一致时,执行结果均正确,好吧,问题确实是这个。
    也就是说,这么漫长的用例复现和调试都是在做无用功,无用功,无用功!

    总结

    1. 在无法获得具体用例时,自己书写用例或者复现的过程中,务必保证你的环境与用户的一致,或者差异绝对不会影响复现!避免多走弯路。
    2. 尽量与提出问题的人多做沟通,如果实在沟通不方便的话,那么一切以问题提出人的说法为标准。当然,问题提出者也有可能出错,除了客观实际的错误外,一切相信提出者的描述可以让你尽可能的理解别人的意思,而不会曲解别人的意思,导致走弯路。
    3. 在得到用户的用例时,一定要仔细分析用例想要的结果,并结合自己公司的产品确定用例是否会得到想要的结果。

    后记

    文中说明的问题为工作中遇到的某次问题的实际记录,这里记录下来是为了总结原因,给自己一个警钟。

    展开全文
  • 最近松松编辑杰哥了解到,继百度口碑低调关停之后,百度商家口碑也要下线了,官方宣布2021年4月2日将全面停服下线,看来又一百度系产品要黄了! 根据杰哥了解,百度商家口碑上线2014年,是百度搜索针对一些...
  • 2019-07-26小程序官方公告 微信卡券“网页链接跳转”能力即将下线通知 各位开发者: 为了确保微信生态良性发展,微信卡券将于2019年8月13日下线网页链接跳转能力。下线后,卡券创建流程中,“自定义入口”...
  • 目前,TechWeb在丁香诊所平台及丁香园网站上均已搜索不到该1980元的矫形鞋垫,疑似已经下线产品。 资料显示,丁香园创建于2000年7月,2018年4月丁香园完成D轮超1亿美元融资,融资完成后,丁香园估值达到10亿美元。...
  • 汽车生产线下线检测仪(EOL)的功能和概述。  不知道是中国汽车整车企业的落后,造成了汽车配套厂家产品及技术的落后;还是相反,由于汽车配套厂家的技术及产品落后,造成了中国整车企业的落后。就像先有蛋,还是先...
  • 产品经理到底是什么,究竟要做什么事 苏杰老师给出了新的答案 如果你有过: 迷茫—— 没有想法 无助—— 想法难以落地 瓶颈—— 缺乏创造力 就来看看这本苏杰老师新著《人人都是产品经理(创新版):低成本的...
  • 最近,扎比进入 PP 助手网站时看到了这样一则重要公告,大概意思是在 2020年2月28日正式下架 iOS 产品,包括 PP 助手 iOS 版和 PP 助手 PC 版。如图:PP 助手已经陪伴我们很长一段时光了,还记得公众号建立之初,...
  • 点击蓝字前端真好玩关注,回复“1”加入前端进阶群与大家一起成长摸鱼摸地好好的,突然产品说要上来找我一下。这时候就别浪费摸鱼的时间啦,因为产品来给你找事啦。产品指着这个需求说,这个是业内...
  • 在计算机的研究之中,其实对于超级计算机来说,我国可以说是属于比较领先的地位,但是对于一些用户所使用的小型计算机来说,一直是我国的“短板”,我相信不少人都用的什么苹果电脑,惠普电脑等等。而根据电脑报发布...
  • 什么是微服务

    2019-08-26 19:04:00
    顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释(2 pizza 团队最早是亚马逊 CEO Bezos提出来的,意思是说单个服务的设计,所有...
  • 互联网产品灰度发布

    万次阅读 2016-05-30 14:37:39
    互联网产品灰度发布   关于2016年5月15日,DevOps成都站|架构与运维峰会活动总结 1. 前言 2 2. 灰度发布定义 5 3. 灰度发布作用 5 4. 灰度发布步骤 5 5. 灰度发布测试方法 6 6. 灰度发布引擎 6 7. 灰度...
  • 人人都是产品经理02-08章摘要

    千次阅读 2020-06-07 22:18:58
    成长:规划与迭代8.1好产品步步为营8.2规划:只看最长和最短8.2.3提升规划能力的实践8.3迭代:再理解敏捷8.4天下武功唯快不破8.4.2 烧钱是为了抢时间8.4.3省时间的低成本验证8.5与用户一起成长 8.1好产品步步为营 ...
  • 微服务是什么

    2019-06-01 15:08:00
    在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释(2 pizza 团队最早...
  • 修订时,文字把我带入当年的时境心境,深深感叹,才4年多,时代感就如此之强,Google Reader、开心网、刚刚流行的新浪微博、以及自己曾经为之付出、但已下线产品……所以,部分内容还是会有一些时代背景,我也在...
  • 第05章 转化:需求分析与Y模型5.1从问题到解决方案Y模型的基本概念实战中如何深入浅出 5.1从问题到解决方案 ...而新手产品经理常犯的错误,就是过于重视方法,或过于忽视问题。 问题中心是“手里拿着钉子
  • 所以,对于我们来说,必须找到背后不变的应对之策,不管哪个阶段,都是要先明确,我们现在要主打哪种类型的市场与用户,他们的特点是怎么样的,然后再决定应该做什么产品、用什么功能来满足相应的需求。 空间之大:...
  • 产品管理工作的文档管理

    千次阅读 2011-11-04 16:52:11
    产品管理工作的文档管理   我这个人什么都好,就是有时候说话太随便,有时候是不得已,例如昨天为了应付没完成工作的情况,楞又扯出一套管理文档的说辞,结果是说者无意,听者有心,结果怎么样,自己被套进去了吧...
  • 如何解决新产品开发中的技术导向与需求导向之矛盾 ... 市场人员认为,消费者需求是硬道理,他们需要什么,我们就得做什么;技术人员也不服气,新产品开发是我们技术人员的事情,必须考虑现有技术条件。
  • 产品小白自从接触产品以来已经看过好几本产品书,俞军大神的产品方法论,苏杰的人人都是产品经理等等,也浏览过很多产品相关的文档。输入其实挺多的,但是感觉看了很多,能留在脑海里的真的少之又少,必须得输出一些...
  • SDN介绍(什么是SDN)

    万次阅读 多人点赞 2019-07-12 14:11:48
    SDN介绍一. 什么是SDN?二.SDN解决什么问题?三.传统网络概念和结构体系传统网络数据控制与转发:传统网络架构:四.SDN概述SDN(Software Defined Netrork)软件定义网络。SDN的分类五.SDN网络架构SDN网络体系...
  • 用户流量包括多种因素,其中基本用户数(每天使用产品的用户数),用户停留(使用)时间,用户留存率,已经流量的健康度等,都是非常重要的因素,决定了产品会继续往前推进蒸蒸日上,还是会被关闭下线,从此销声匿迹...
  • 微服务1.1 基本概念1.1.1 什么是微服务?微服务架构是SOA思想某一种具体实现。是一种将单应用程序作为一套小型服务开发的方法,每种应用程序都在其自己的进程中运行,并采用轻量级的通讯机制(TCP)进行通信。这些服务...
  • 比如程序员问科比:你为什么这么成功?科比说,你知道洛杉矶凌晨四点是什么样子吗?知道,一般那个时候我还在写代码,怎么了?比如格子衫,双肩夸,一年四季的牛仔裤……不过,这些都是表面现象,程序员消费起来有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,851
精华内容 1,140
关键字:

下线产品是什么意思