京东到家库存系统架构设计

目前,京东到家库存系统经历两年多的线上考验与技术迭代,现服务着万级商家十万级店铺的规模,需求的变更与技术演进,我们是如何做到系统的稳定性与高可用呢,下图会给你揭晓答案(通过强大的基础服务平台让应用、JVM、Docker、物理机所有健康指标一目了然,7*24小时智能监控告警让开发无须一直盯着监控,另外数据与业务相辅相成,用数据验证业务需求,迭代业务需求,让业务需求都尽可能的收益最大化,库存系统的开发同学只需要关注业务需求,大版本上线前相应的测试同学会跟进帮你压测,防止上线后潜在的性能瓶颈)。

阅读全文 »

持续集成实践

持续集成概念

持续集成是一种软件开发实践,即团队成员经常集成自己的工作。通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编辑、发布、自动化测试)来验证,从而尽快地发现集成错误。许多团队通过实践发现这个过程可以大大减少集成时的问题,让团队能够更快的开发内聚的软件。

持续集成的价值

1、 减少风险:

越早发现的错误,修正的费用越低。及时检查软件的健康状况,减少发布时的风险。

2、 减少重复性的工作:

通过持续集成可以将编译、部署、测试等动作都变成自动化的,无需太多人工干预。

3、 任何时间、任何地点都可以部署软件

利用持续集成,可以经常对源代码进行一些小改动,并将这些改动和其他的代码进行集成。如果出现问题,项目成员马上就会被通知去修复。

阅读全文 »

背景

Redis作为一款性能优异的内存数据库,在互联网公司有着多种应用场景,下面介绍下Redis在京东到家的订单列表中的使用场景。主要从以下几个方面来介绍:

  1. 订单列表在Redis中的存储结构
  2. Redis和DB数据一致性保证
  3. Redis中的分布式锁
  4. 缓存防穿透和雪崩
    阅读全文 »

背景

用户:货都到了,购物车里怎么还有刚买的东西,what?
产品:有用户反映,提单完成了,怎么没清购物车,研发赶紧看看是不是有bug啊?
研发:恩,我看看,!@#¥%……&*()一顿狂查,搜嘎,当时在上线,重启应用,异步任务丢了……
产品:能不能行,上线你就丢任务,丢不丢人啊!
研发:…………

上线!重启!你还在为丢失任务而烦恼么?看这里看这里,从此不再丢任务,JVM可以安全退出的

阅读全文 »

围棋因其巨大的计算复杂度一度被认为是极难被人工智能攻克的一个领域,AlphaGo在围棋项目上击败李世乭之后,新兴的人工智能技术又引起了广泛的关注,人工智能在经历数次低估之后,似乎又有了新的曙光,而本系列要讲述的正是AlphaGo成功的关键算法 - 深度增强学习(Deep Reinforcement Learning)

什么是增强学习(Reinforcement Learning)

imgage

在人工智能领域,通常定义一个学习到某些知识并具有了决策能力的个体为Agent,Agent会从环境(Environment)获取一些观察(Observation),从而执行某种动作(Action),最后这个动作会获的某种奖励(Reward)。强化学习就是一类可以训练Agent做出正确决策的机器学习算法。这里以训练一个Agent学习打乒乓球为例,乒乓球从Agent左前方30度位置飞来(观察),Agent做出了决策向左移动15cm挥拍(动作),结果正确击中了乒乓球(奖励),如果经历过N次这个过程,增强学习就会根据每种情形下的动作获取的奖励来进行训练,让Agent学习到如何做出正确的挥拍动作,提高成功率。

让机器学会打乒乓球的一个实例,感兴趣的朋友可以看下:http://karpathy.github.io/2016/05/31/rl/

阅读全文 »

背景

海子在《面朝大海,春暖花开》中写到:“从明天起,做一个幸福的人”,Babel在介绍自己时说到:“从今天起,做一个幸福的人,使用下一代JavaScript”。

JavaScript学名叫ECMAScript,主要版本有2000年发布的ES3,2010年发布的ES5,以及2015年发布的ES2015。其中,ES2015相对于ES5简直是翻天覆地的变化,大量新特性极好的解决了开发人员面临的问题。然而市场份额占比极高的Internet Explorer 9发布于2011年,对ECMAScript的支持只到第5版。难道为了兼容低版本浏览器用户而就此放弃?不!在新达达,我们拥抱社区,跟随潮流,始终走在技术前沿。Babel作为一个广泛使用的转码器,可以将ES2015代码转译成ES5代码,从而在现有环境中执行。有了它,使用下一代JavaScript成为可能。

如今,从手机应用到桌面网站,再到后端服务,Babel的身影无处不在。但通往幸福的路上,我们遇到不少困难。随着项目复杂度增加,文件打包体积变大,程序运行性能变差。

阅读全文 »

背景

交易系统可能不是技术难度最深的,但是业务复杂度最高的,一个订单从提交到最后真正生产成功要经历几十个系统,涉及的接口交互,MQ等可能达上百个。任何一个环节出问题都会导致这一单的异常,而且交易不像单纯的资讯门户可以靠静态化或者缓存抗住大并发,交易系统里面涉及到大量的资源(库存,优惠券,优惠码等)消费,订单生成等需要写入持久化的操作不是单纯的异步或者缓存化可以解决的,而且对库存等敏感信息不能出现并发扣减等。

细节的设计非常多,下面挑出比较典型的一些方面,给大家介绍下京东到家交易系统的架构设计和关键问题的处理方案。

阅读全文 »

写在前面

之前在新达达财务账户系统演变一文里跟大家分享了新达达的财务账户系统的前世今生以及不断往前演变的几个阶段,那段时光很值得留念,现在时间又过去了四个月,这次跟大家分享的是新达达财务账户系统是如何从繁杂的业务中抽离出来,不断内聚,最终向平台化发展。

什么是平台化?

平台化是我们的目标,那什么是平台化?
举个跟我们很近的例子,在达达公司还未成立之前,外卖商户如果中午需要配送,只能自己招几个配送员,需要计算自己配送员的工资,怕他们偷懒,要管理他们的绩效……,结果达达公司出现了,通过平台化的方案,帮助商户寻找可以完成该订单的配送员,促使双方达成交易。这个平台只要商户在app上下单,就可以得到优质的服务 。
总结下来,平台化本质上是将零散的需求抽象化成一个提供标准输入(eg. 下单),得到标准输出(eg. 配送服务)的聚合服务。

阅读全文 »

CMS即为内容管理系统,管理京东到家APP和H5的页面的各个资源位(图片),点击图片后的跳转页面的展示。

本文主要从技术角度来介绍系统的演变。

背景

传统CMS系统配置即所见,后台配置了资源,前端就一定展示,用户在任何地方看到的都一样。

京东到家CMS最大的特色是跟地理位置有关系,简单说就是:用户在不同地点看到的只是最近相关的资源。京东到家是以门店为维度来控制资源的展示与否:一个资源A关联多个门店,每个门店有一定的覆盖范围(可以是圆形也可以是多边形覆盖),用户所在的位置有被资源A关联的门店覆盖到,那么资源A被用户看见。如下:用户被2个门店覆盖,如果资源A有关联这两个门店的任何一个,那么用户将看到资源A。

image

阅读全文 »

最近在TesterHome上看到有人关于测试如何保证项目发布质量的提问,同时新达达北京研发团队最近也有一些关于后端代码上线后质量不可控的小烦恼,于是将我加入达达后对上线流程的优化做了以下总结,供大家参考。

上线流程演进

第一阶段 - 上线流程从无到有

作为达达研发团队的首位测试工程师,在我加入之前研发团队规模比较小(大概4个后端工程师和2个Android工程师)。当时后端代码上线的流程比较简单,从开发工程师Coding到代码最终上线一共会经过3个环境:

  1. 工程师本地开发环境
  2. DEV测试环境
  3. 生产环境

开发工程师完成代码开发,在DEV测试环境自测后会把代码Push到对应仓库的Master分支上,等晚上9点上线。

阅读全文 »