精华内容
下载资源
问答
  • Google支付 PHP端验证订单号的有效性

    千次阅读 2016-03-08 16:55:22
    3.订单验证 // 1.获取access_token $url = "https://accounts.google.com/o/oauth2/token" ; $data_tmp = array ( 'grant_type' => 'refresh_token' , 'refresh_token' => '上面获取到的refresh_...

    1.创建API应用
    APIs Console https://code.google.com/apis/console
    需要用谷歌开发者账号登陆,该账号要和发布谷歌应用申请谷歌应用的那个账号相同,才能把这个创建的project和游戏应用绑定上(绑定需要手动操作)
    绑定项目
    https://play.google.com/apps/publish/
    Settings–> API access—> LINKED PROJECT 和 OAUTH CLIENTS
    client_id 就是在这里创建出来的。
    另外,你要在googleplay console—> 对应应用的project下—> APIs & auth—-> APIs ,把GooglePlay Android Developer API设置为ON。
    如果是你是个人应用开发者的话,可以直接配置,否则一定要账户管理员给你个人gmail账号设置个权限,也就是只有帐户所有者才能配置API权限,请联系相应的帐户所有者更新API设置

    这里写图片描述

    2.获得refresh_token
    2.1访问下面的地址
    https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=…&client_id=.
    redirect_uri是上面步骤一中你填写的uri
    client_id 是创建成功后,谷歌给你的
    2.2完操作后,浏览器会自动跳转到你填写的uri页面,并跟上一个code,类似于这样的(4/eWdxD7b-YSQ5CNNb-c2iI83KQx19.wp6198ti5Zc7dJ3UXOl0T3aRLxQmbwI)
    3.3获得refresh_token

    //获取refresh_token  
    $url = "https://accounts.google.com/o/oauth2/token";
    $data = array(
        'grant_type'=>'authorization_code',
        'code'=>'4/eWdxD7b-YSQ5CNNb-c2iI83KQx19.wp6198ti5Zc7dJ3UXOl0T3aRLxQmbwI',
        'client_id'=>'',
        'client_secret'=>'',
        'redirect_uri'=>'http://www.tapenjoy.com/',
        );
     $contents = $this->curl($url,$data);
     echo $contents;

    如果成功,会获得类似于这样的返回
    {
    “access_token” : “ya29.ZStBkRnGyZ2mUYOLgls7QVBxOg82XhBCFo8UIT5gM”,
    “token_type” : “Bearer”,
    “expires_in” : 3600,
    “refresh_token” : “1/zaaHNytlC3SEBX7F2cfrHcqJEa3KoAHYeXES6nmho”
    }
    refresh_token后面不会出现,要保存好,要通过这个,获取access_token

    //curl方法
    private function curl($url,$data=null,$method = null){
        $ch=curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if ($method == 'post') {
            curl_setopt($ch, CURLOPT_POST,1);
        }
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch,CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);//使用了SOCKS5代理
        curl_setopt($ch,CURLOPT_PROXY,'192.168.100.2');//代理服务器
        curl_setopt($ch,CURLOPT_PROXYPORT,'1080');//代理端口
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不验证证书 https访问的时候
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //不验证证书 https访问的时候
        if($data){
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//传递参数
        }
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    } 

    3.订单验证

    // 1.获取access_token
        $url = "https://accounts.google.com/o/oauth2/token";
        $data_tmp = array(
            'grant_type'=>'refresh_token',
            'refresh_token'=>'上面获取到的refresh_token',
            'client_id'=>'',
            'client_secret'=>'',
            );
        $contents = $this->curl($url,$data_tmp,'post');
        $contents = json_decode($contents,true);
        $access_token = $contents['access_token'];
    // 2.通过获得access_token 就可以请求谷歌的 API接口,获得订单状态
        $url = "https://www.googleapis.com/androidpublisher/v2/applications/{$packageName}/purchases/products/{$productId}/tokens/{$purchaseToken}?access_token={$access_token}";
        $contents = $this->curl($url);
        $contents = json_decode($contents,true);
        if($contents['consumptionState'] == 0 && $contents['purchaseState'] == 0){
            //验证成功 没有消耗 购买成功
            //处理游戏逻辑
        }

    参考文档
    https://developers.google.com/android-publisher/authorization#generating_a_refresh_token
    https://developers.google.com/android-publisher/api-ref/purchases/products/get
    http://blog.csdn.net/lemonzone2010/article/details/44983659
    http://blog.csdn.net/w13770269691/article/details/46428281
    http://blog.csdn.net/hjun01/article/details/42032841

    展开全文
  • 有效下单策略可规避市价订单风险

    千次阅读 2007-08-16 15:49:00
    有效下单策略可规避市价订单风险上海证券交易所推出市价订单委托方式已满一周年,市价订单丰富了市场交易手段,提高了市场效率。近日,上证所创新实验室最新报告《市价订单的交易风险与下单策略研究》研究发现,约70...

    有效下单策略可规避市价订单风险

    上海证券交易所推出市价订单委托方式已满一周年,市价订单丰富了市场交易手段,提高了市场效率。近日,上证所创新实验室最新报告《市价订单的交易风险与下单策略研究》研究发现,约70%的市价订单能够在一档成交,约18%的市价订单在第二档成交。但各档位价格差距在极端情况下可能很大,为控制这种风险,投资者应根据市场情况,下达规模相对较小的市价订单。报告同时建议将成交五档改为成交若干个最小报价单位来避免这种风险。
        市价订单提高成交效率
       长期以来,我国证券市场的订单(委托)类型一直限于限价订单。随着市场规模的扩大、交易品种的增多以及投资者数量的剧增,限价订单的不足逐步显现。统计显示,在连续竞价阶段,限价订单撤单比例平均达23.64%,在行情波动较大时,撤单比例则高达40%至50%。由此,2006年8月7日,上证所对有涨跌幅限制的证券在连续竞价阶段增加了两种市价订单方式:最优五档即时成交剩余撤销申报和最优五档即时成交剩余转限价申报。
       报告指出,市价订单的推出产生了积极的市场效果。首先,市价订单极大地提高了订单的成交效率。由于即时行情的传输和订单的传送都存在一定的时滞,而市价订单是以订单进入到交易系统时刻的行情进行即时成交的,可以提高订单的成交效率。2006年限价订单及市价订单成交情况统计显示,平均市价委托订单的即时成交股数占委托股数的比重在98%以上,而同期的限价订单即时成交指标值仅为30%。
       其次,市价订单满足了投资者,特别是个人投资者多样化的交易需求和手段。沪市市价委托订单主要用于A股交易,占比超过86%,几乎所有市价委托订单均为个人投资者所运用,占比超过99%。
        2.28事件显露市价订单风险
       自市价订单推出以后,个别投资者利用市价订单交易规则,借机挂出大量超低价格的买单,等待时机与市价卖出订单成交,企图获取暴利。报告据此指出,市价订单并不是没有风险的,由于订单簿各档位价格差距在极端情况下可能很大,此时,市价订单可能存在较大的交易风险。
       今年2月28日,一投资者A以1厘钱的价格买到收盘价近0.7元的权证82.03万份,使对手方遭受了重大损失,这一事件充分说明市价订单可能存在较大的风险。无论从成交量还是从成交额来看,即时成交的市价订单中约有70%在第一档成交,近90%的即时成交市价订单在第一档和第二档成交,在第五档成交的市价订单比重约2%。由于即时成交的市价订单没有在第一档全部成交,所以会增加订单的成交成本。2007年一季度统计数据显示,尽管五档保护价格与第一档的差距平均不大,但个别值则差距很大,如权证市价订单五档成交与第一档的差距最大达0.848元,股票市价订单成交与第一档的差距最大达4.98元。
       报告建议,通过把成交五档改为成交若干个最小报价单位,则可以避免这种风险,如可考虑股票市价订单改为成交5个或10个最小报价单位后转限价或撤销,对权证改为成交10个或20个最小报价单位后转限价或撤销。
        规模较小的市价订单更安全
       该报告通过分析市价订单的潜在成交风险,指出投资者应根据市场情况,制定相对有效、风险较小的下单策略,下达规模相对较小的市价订单。
       研究发现,对上证50成分股而言,以下单时的成交价或第一档价格计算,下达金额在90万元以下的市价订单风险将较小,对流动性比较好的股票可以下达250万元以下的市价订单;对上证180成分股,下达金额在60万元以下的市价订单风险将较小,对流动性比较好的股票可以下达100万元以下的市价订单;对其他A股,下达金额在40万元以下的市价订单风险将较小;对B股,下达金额在2万美元以下的市价订单风险将较小;对权证,下达金额在40万元以下的市价订单风险将较小。(证券时报)
    展开全文
  • SAP中服务性订单的替代解决方案

    千次阅读 2017-08-14 09:05:29
    但是这个服务性订单配置和操作工作量比较大。在实际项目中,真正利用这个功能来操作服务项目的案例并不多。在这里,笔者要给各位介绍的是一个替代方案。  一、业务介绍。  现在某个客户有

    在SAP系统中有标准的服务性订单,可以详细的规划每个阶段的付款情况。如以SAP项目为例,可以分为需求调研、流程优化等几个阶段。每个阶段开始后都要付阶段性的款。通过SAP标准的服务性订单可以实现付款的跟踪。但是这个服务性订单配置和操作工作量比较大。在实际项目中,真正利用这个功能来操作服务性项目的案例并不多。在这里,笔者要给各位介绍的是一个替代方案。

      一、业务介绍。

      现在某个客户有这么一个需求。他们要求了一家咨询机构对企业的流程进行优化。这项工作大致可以分为需求调研、流程重组、业务培训、项目上线等四个阶段。这项业务总的金额为100万,其中合同签订后付30万、流程重组确认后付30万、业务培训后付20万、项目上线后付10万、上线三个月后付10万。

      一开始笔者建议客户通过“服务性订单”来实现这个业务。不过客户反应说没有必要控制的这么严格。他们要求只需要控制总的费用即可。即花在这个项目上的总的金额不超过100万。了解用户的需求后,笔者最后建议用户通过框架性订单来实现这个需求。

      二、采购订单管理。

      在SAP系统的标准功能中,有一个采购订单类型叫做“框架型订单”,其是消耗性采购的一个衍生。不过这个功能一直被顾问或者用户所忽视。不过笔者在实际项目中,一般都会推荐用户采用这个功能。因为通过这个功能,可以在一定程度上实现费用预算的功能。而不用去启动SAP的费用预算流程或者服务性订单。

      这主要跟国内客户的现状有关。国内企业的预算管理或者服务性供应商那个管理的现状,往往是只管粗,不管细。简单的说,就是只管最终的结果,对于中间过程控制的比较少。如果要用SAP的标准管理流程来管理这些业务,可能会适得其反。在这种情况下,采用框架采购订单来管理,相对来说可能更加合适。对于框架采购订单,主要要关注如下几个参数。

      1、 有效期。

      服务性项目一般都要有个有效期。如在一年内完成这个项目,总共金额是多少。如果是超期的话,则付款就会有问题。为此在采购订单上,需要输入一个有效期。在事务中需要注意的是,这个有效期往往不是项目结束的日期,而是最后一笔付款的日期。这中间会有一个类似质保期的时间段在里面。

      2、 没有物料编码。

      对于类似的服务,或者费用预算,往往没有物料编码。为此其从本质上来讲,是为某个成本中心采购。所以其走的是消耗性采购流程。在采购订单的科目分配类别中就要选择为成本中心采购。同时,又需要限制其总金额,就需要在账户分配中选择B限制这个参数。这两个参数结合起来,就表示为某个成本中心总共花费不超过多少的金额。

      3、 期望值和限制值。

      最后在采购订单上要维护一个金额。在标准功能中,框架型订单可以维护两个金额,分别是期望值和限制值。往往是期望值大于等于限制值。这两个金额有不同的作用。期望值一般是用来做审批用。其主要包含总的项目费用和可能会意外支付的费用,如项目做的好的话给项目实施方的奖励。而限制值就是实实在在需要支付的费用。在做采购订单的审批策略时,需要以期望值作为对象。

      三、采购收货管理。

      在标准功能中,框架性采购订单是不用收货的。在后台配置中,根据项目类别和账户类别对收货功能是禁用的。不过在实际项目中,可能需要对这个进行适当的调整。如以这个咨询项目为例,需要对项目的各个阶段进行验收。只有验收完毕后,才可以进行付款申请环节(发票验证流程)。

      为了实现这个控制目的,就需要调整后台配置,启用框架性订单的收货功能。一般建议是复制相关参数,重新配置一个功能出来,而不建议对标准参数进行调整。启用收货功能后,每个项目环节完毕需要验收时,就在系统中做一个虚拟收货的动作。由于是费用性采购,为此收货后并不会形成库存,而是直接消耗到成本中心。这里需要注意的是,项目环节的验收工作需要在体外做,系统内只是记录验收成功这样一个记录。简单的说,就是用户凭验收合格的单据在系统里做一个收货的动作。如果验收不合格,就不做收货单据。如此的话,系统就不能够走后续的流程。

      这里另外要强调一点。在框架性采购订单中,其默认的采购数量是1。为此在收货时,要根据付款的百分比,来输入收货的数量。简单的说,就是将采购数量当作是100%。然后根据各个阶段付款的百分比,来输入收货的数量。

      当然,如果要启用框架性订单的收货功能,会涉及到后台配置或者简单的增强。在通过框架性订单来实现服务性采购或者费用预算的管理,这是一个非标准的功能。不过比起启用整个费用预算模块或者服务性订单来说,这点工作量并不是很大。

      四、发票验证管理。

      发票验证需要分两种情况,即需要区分是否收货。如果收货的话,则发票的金额会根据收货带过来。而不收货的话,其金额不会自动带出。笔者这里以标准功能为例,说明一下框架性订单的发票验证过程。

      根据普通的消耗型采购不一样,如果没有收货,框架性采购订单在发票验证时是带不出金额的。普通的消耗型采购订单,如果没有收货,会带出采购订单的数量和金额。这个区别,在业务推进过程中,要跟用户重点强调一下。

      在发票验证时,用户需要根据实际发票的金额或者管理层同意支付的金额为准,通过“科目分配”功能来输入金额。这里还有一个好处,就是可以更改成本中心。如果项目一开始不能够确认成本中心,直接记录的是公司的成本中心。后来确定需要对成本中心进行细分,就可以在这里更改。不过大部分情况下,不会对成本中心进行调整。

      五、框架性订单的缺陷。

      利用框架性订单来实现项目或者费用预算控制,其优势是非常明显的。其管理灵活、而且工作量明显降低很多。但是其缺陷也是显而易见的。即这个费用控制是粗放的。简单的说,其没有细化到项目或者费用的每个阶段,而是做一个整体的预算管理。

      在实际项目中,是否要启用这个功能,主要还是看企业对预算管理的要求。如果只是一些粗放型的管理,即只是对结果的记录和控制,则使用框架性采购订单完全可以满足要求。如果要实现更加细致的管理(要中间各个环节的控制),就需要考虑启用服务性采购订单或者费用预算来实现。当然,要启用这些功能,用户需要花费更多的时间和精力。毕竟天下没有白吃的午餐。

    展开全文
  • 美团外卖订单系统演进

    万次阅读 2016-12-07 14:03:17
    美团外卖从2013年9月成交第一单以来,已走过了三个年头。期间,业务飞速发展,美团外卖由日均几单发展为日均500万单(9月11日...随着订单量的增长、业务复杂度的提升,外卖订单系统也在不断演变进化,从早期一个订单

    文章来源:http://geek.csdn.net/news/detail/101994

    美团外卖从2013年9月成交第一单以来,已走过了三个年头。期间,业务飞速发展,美团外卖由日均几单发展为日均500万单(9月11日已突破600万)的大型O2O互联网外卖服务平台。平台支持的品类也由最初外卖单品拓展为全品类。

    随着订单量的增长、业务复杂度的提升,外卖订单系统也在不断演变进化,从早期一个订单业务模块到现在分布式可扩展的高性能、高可用、高稳定订单系统。整个发展过程中,订单系统经历了几个明显的阶段,下面本篇文章将为大家介绍一下订单系统的演进过程,重点关注各阶段的业务特征、挑战及应对之道。

    为方便大家更好地了解整个演进过程,我们首先看一下外卖业务。

    外卖订单业务

    外卖订单业务是一个需要即时送的业务,对实时性要求很高。从用户订餐到最终送达用户,一般在1小时内。如果最终送达用户时间变长,会带来槽糕的用户体验。在1小时内,订单会快速经过多个阶段,直到最终送达用户。各个阶段需要紧密配合,确保订单顺利完成。

    下图是一个用户视角的订单流程图:

    图片描述

    从普通用户的角度来看,一个外卖订单从下单后,会经历支付、商家接单、配送、用户收货、售后及订单完成多个阶段。以技术的视角来分解的话,每个阶段依赖于多个子服务来共同完成,比如下单会依赖于购物车、订单预览、确认订单服务,这些子服务又会依赖于底层基础系统来完成其功能。

    外卖业务另一个重要特征是一天内订单量会规律变化,订单会集中在中午、晚上两个“饭点”附近,而其它时间的订单量较少。这样,饭点附近系统压力会相对较大。

    下图是一天内的外卖订单量分布图:

    图片描述

    总结而言,外卖业务具有如下特征:

    • 流程较长且实时性要求高;
    • 订单量高且集中。

    下面将按时间脉络为大家讲解订单系统经历的各个阶段、各阶段业务特征、挑战以及应对之道。

    订单系统雏型

    外卖业务发展早期,第一目标是要能够快速验证业务的可行性。技术上,我们需要保证架构足够灵活、快速迭代从而满足业务快速试错的需求。

    在这个阶段,我们将订单相关功能组织成模块,与其它模块(门店模块等)一起形成公用jar包,然后各个系统通过引入jar包来使用订单功能。

    早期系统的整体架构图如下所示:

    图片描述

    早期,外卖整体架构简单、灵活,公共业务逻辑通过jar包实现后集成到各端应用,应用开发部署相对简单。比较适合业务早期逻辑简单、业务量较小、需要快速迭代的情况。但是,随着业务逻辑的复杂、业务量的增长,单应用架构的弊端逐步暴露出来。系统复杂后,大家共用一个大项目进行开发部署,协调的成本变高;业务之间相互影响的问题也逐渐增多。

    早期业务处于不断试错、快速变化、快速迭代阶段,通过上述架构,我们能紧跟业务,快速满足业务需求。随着业务的发展以及业务的逐步成熟,我们对系统进行逐步升级,从而更好地支持业务。

    独立的订单系统

    2014年4月,外卖订单量达到了10万单/日,而且订单量还在持续增长。这时候,业务大框架基本成型,业务在大框架基础上快速迭代。大家共用一个大项目进行开发部署,相互影响,协调成本变高;多个业务部署于同一VM,相互影响的情况也在增多。

    为解决开发、部署、运行时相互影响的问题。我们将订单系统进行独立拆分,从而独立开发、部署、运行,避免受其它业务影响。

    系统拆分主要有如下几个原则:

    • 相关业务拆分独立系统;
    • 优先级一致的业务拆分独立系统;
    • 拆分系统包括业务服务和数据。

    基于以上原则,我们将订单系统进行独立拆分,所有订单服务通过RPC接口提供给外部使用。订单系统内部,我们将功能按优先级拆分为不同子系统,避免相互影响。订单系统通过MQ(队列)消息,通知外部订单状态变更。

    独立拆分后的订单系统架构如下所示:

    图片描述

    其中,最底层是数据存储层,订单相关数据独立存储。订单服务层,我们按照优先级将订单服务划分为三个系统,分别为交易系统、查询系统、异步处理系统。

    独立拆分后,可以避免业务间的相互影响。快速支持业务迭代需求的同时,保障系统稳定性。

    高性能、高可用、高稳定的订单系统

    订单系统经过上述独立拆分后,有效地避免了业务间的相互干扰,保障迭代速度的同时,保证了系统稳定性。这时,我们的订单量突破百万,而且还在持续增长。之前的一些小问题,在订单量增加后,被放大,进而影响用户体验。比如,用户支付成功后,极端情况下(比如网络、数据库问题)会导致支付成功消息处理失败,用户支付成功后依然显示未支付。订单量变大后,问题订单相应增多。我们需要提高系统的可靠性,保证订单功能稳定可用。

    另外,随着订单量的增长、订单业务的复杂,对订单系统的性能、稳定性、可用性等提出了更高的要求。

    为了提供更加稳定、可靠的订单服务,我们对拆分后的订单系统进行进一步升级。下面将分别介绍升级涉及的主要内容。

    性能优化

    系统独立拆分后,可以方便地对订单系统进行优化升级。我们对独立拆分后的订单系统进行了很多的性能优化工作,提升服务整体性能,优化工作主要涉及如下几个方面。

    异步化

    服务所需要处理的工作越少,其性能自然越高。可以通过将部分操作异步化来减少需要同步进行的操作,进而提升服务的性能。异步化有两种方案。

    • 线程或线程池:将异步操作放在单独线程中处理,避免阻塞服务线程;
    • 消息异步:异步操作通过接收消息完成。

    异步化带来一个隐患,如何保障异步操作的执行。这个场景主要发生在应用重启时,对于通过线程或线程池进行的异步化,JVM重启时,后台执行的异步操作可能尚未完成。这时,需要通过JVM优雅关闭来保证异步操作进行完成后,JVM再关闭。通过消息来进行的,消息本身已提供持久化,不受应用重启影响。

    具体到订单系统,我们通过将部分不必同步进行的操作异步化,来提升对外服务接口的性能。不需要立即生效的操作即可以异步进行,比如发放红包、PUSH推送、统计等。

    以订单配送PUSH推送为例,将PUSH推送异步化后的处理流程变更如下所示:

    图片描述

    PUSH异步化后,线程#1在更新订单状态、发送消息后立即返回,而不用同步等待PUSH推送完成。而PUSH推送异步在线程#2中完成。

    并行化

    操作并行化也是提升性能的一大利器,并行化将原本串行的工作并行执行,降低整体处理时间。我们对所有订单服务进行分析,将其中非相互依赖的操作并行化,从而提升整体的响应时间。

    以用户下单为例,第一步是从各个依赖服务获取信息,包括门店、菜品、用户信息等。获取这些信息并不需要相互依赖,故可以将其并行化,并行后的处理流程变更如下所示:

    图片描述

    通过将获取信息并行化,可有效缩短下单时间,提升下单接口性能。

    缓存

    通过将统计信息进行提前计算后缓存,避免获取数据时进行实时计算,从而提升获取统计数据的服务性能。比如对于首单、用户已减免配送费等,通过提前计算后缓存,可以简化实时获取数据逻辑,节约时间。

    以用户已减免配送费为例,如果需要实时计算,则需要取到用户所有订单后,再进行计算,这样实时计算成本较高。我们通过提前计算,缓存用户已减免配送费。需要取用户已减免配送费时,从缓存中取即可,不必实时计算。具体来说,包括如下几点:

    • 通过缓存保存用户已减免配送费;
    • 用户下单时,如果订单有减免配送费,增加缓存中用户减免配送费金额(异步进行);
    • 订单取消时,如果订单有减免配送费,减少缓存中用户减免配送费金额(异步进行)。

    一致性优化

    订单系统涉及交易,需要保证数据的一致性。否则,一旦出现问题,可能会导致订单不能及时配送、交易金额不对等。

    交易一个很重要的特征是其操作具有事务性,订单系统是一个复杂的分布式系统,比如支付涉及订单系统、支付平台、支付宝/网银等第三方。仅通过传统的数据库事务来保障不太可行。对于订单交易系统的事务性,并不要求严格满足传统数据库事务的ACID性质,只需要最终结果一致即可。针对订单系统的特征,我们通过如下种方式来保障最终结果的一致性。

    重试/幂等

    通过延时重试,保证操作最终会最执行。比如退款操作,如退款时遇到网络或支付平台故障等问题,会延时进行重试,保证退款最终会被完成。重试又会带来另一个问题,即部分操作重复进行,需要对操作进行幂等处理,保证重试的正确性。

    以退款操作为例,加入重试/幂等后的处理流程如下所示:

    图片描述

    退款操作首先会检查是否已经退款,如果已经退款,直接返回。否则,向支付平台发起退款,从而保证操作幂等,避免重复操作带来问题。如果发起退款失败(比如网络或支付平台故障),会将任务放入延时队列,稍后重试。否则,直接返回。

    通过重试+幂等,可以保证退款操作最终一定会完成。

    2PC

    2PC是指分布式事务的两阶段提交,通过2PC来保证多个系统的数据一致性。比如下单过程中,涉及库存、优惠资格等多个资源,下单时会首先预占资源(对应2PC的第一阶段),下单失败后会释放资源(对应2PC的回滚阶段),成功后会使用资源(对应2PC的提交阶段)。对于2PC,网上有大量的说明,这里不再继续展开。

    高可用

    分布式系统的可用性由其各个组件的可用性共同决定,要提升分布式系统的可用性,需要综合提升组成分布式系统的各个组件的可用性。

    针对订单系统而言,其主要组成组件包括三类:存储层、中间件层、服务层。下面将分层说明订单系统的可用性。

    存储层

    存储层的组件如MySQL、ES等本身已经实现了高可用,比如MySQL通过主从集群、ES通过分片复制来实现高可用。存储层的高可用依赖各个存储组件即可。

    中间件层

    分布式系统会大量用到各类中间件,比如服务调用框架等,这类中间件一般使用开源产品或由公司基础平台提供,本身已具备高可用。

    服务层

    在分布式系统中,服务间通过相互调用来完成业务功能,一旦某个服务出现问题,会级联影响调用方服务,进而导致系统崩溃。分布式系统中的依赖容灾是影响服务高可用的一个重要方面。

    依赖容灾主要有如下几个思路:

    • 依赖超时设置;
    • 依赖灾备;
    • 依赖降级;
    • 限制依赖使用资源。

    订单系统会依赖多个其它服务,也存在这个问题。当前订单系统通过同时采用上述四种方法,来避免底层服务出现问题时,影响整体服务。具体实现上,我们采用Hystrix框架来完成依赖容灾功能。Hystrix框架采用上述四种方法,有效实现依赖容灾。订单系统依赖容灾示意图如下所示:

    图片描述

    通过为每个依赖服务设置独立的线程池、合理的超时时间及出错时回退方法,有效避免服务出现问题时,级联影响,导致整体服务不可用,从而实现服务高可用。

    另外,订单系统服务层都是无状态服务,通过集群+多机房部署,可以避免单点问题及机房故障,实现高可用。

    小结

    上面都是通过架构、技术实现层面来保障订单系统的性能、稳定性、可用性。实际中,有很多的事故是人为原因导致的,除了好的架构、技术实现外,通过规范、制度来规避人为事故也是保障性能、稳定性、可用性的重要方面。订单系统通过完善需求review、方案评审、代码review、测试上线、后续跟进流程来避免人为因素影响订单系统稳定性。

    通过以上措施,我们将订单系统建设成了一个高性能、高稳定、高可用的分布式系统。其中,交易系统tp99为150ms、查询系统tp99时间为40ms。整体系统可用性为6个9。

    可扩展的订单系统

    订单系统经过上面介绍的整体升级后,已经是一个高性能、高稳定、高可用的分布式系统。但是系统的的可扩展性还存在一定问题,部分服务只能通过垂直扩展(增加服务器配置)而不能通过水平扩展(加机器)来进行扩容。但是,服务器配置有上限,导致服务整体容量受到限制。

    到2015年5月的时候,这个问题就比较突出了。当时,数据库服务器写接近单机上限。业务预期还会继续快速增长。为保障业务的快速增长,我们对订单系统开始进行第二次升级。目标是保证系统有足够的扩展性,从而支撑业务的快速发展。

    分布式系统的扩展性依赖于分布式系统中各个组件的可扩展性,针对订单系统而言,其主要组成组件包括三类:存储层、中间件层、服务层。下面将分层说明如何提高各层的可扩展性。

    存储层

    订单系统存储层主要依赖于MySQL持久化、tair/redis cluster缓存。tair/redis cluster缓存本身即提供了很好的扩展性。MySQL可以通过增加从库来解决读扩展问题。但是,对于写MySQL存在单机容量的限制。另外,数据库的整体容量受限于单机硬盘的限制。

    存储层的可扩展性改造主要是对MySQL扩展性改造。

    分库分表

    写容量限制是受限于MySQL数据库单机处理能力限制。如果能将数据拆为多份,不同数据放在不同机器上,就可以方便对容量进行扩展。

    对数据进行拆分一般分为两步,第一步是分库,即将不同表放不同库不同机器上。经过第一步分库后,容量得到一定提升。但是,分库并不能解决单表容量超过单机限制的问题,随着业务的发展,订单系统中的订单表即遇到了这个问题。

    针对订单表超过单库容量的问题,需要进行分表操作,即将订单表数据进行拆分。单表数据拆分后,解决了写的问题,但是如果查询数据不在同一个分片,会带来查询效率的问题(需要聚合多张表)。由于外卖在线业务对实时性、性能要求较高。我们针对每个主要的查询维度均保存一份数据(每份数据按查询维度进行分片),方便查询。

    具体来说,外卖主要涉及三个查询维度:订单ID、用户ID、门店ID。对订单表分表时,对于一个订单,我们存三份,分别按照订单ID、用户ID、门店ID以一定规则存储在每个维度不同分片中。这样,可以分散写压力,同时,按照订单ID、用户ID、门店ID三个维度查询时,数据均在一个分片,保证较高的查询效率。

    订单表分表后,订单表的存储架构如下所示:

    图片描述

    可以看到,分表后,每个维度共有100张表,分别放在4个库上面。对于同一个订单,冗余存储了三份。未来,随着业务发展,还可以继续通过将表分到不同机器上来持续获得容量的提升。

    分库分表后,订单数据存储到多个库多个表中,为应用层查询带来一定麻烦,解决分库分表后的查询主要有三种方案:

    • MySQL服务器端支持:目前不支持
    • 中间件
    • 应用层

    由于MySQL服务器端不能支持,我们只剩下中间件和应用层两个方案。中间件方案对应用透明,但是开发难度相对较大,当时这块没有资源去支持。于是,我们采用应用层方案来快速支持。结合应用开发框架(SPRING+MYBATIS),我们实现了一个轻量级的分库分表访问插件,避免将分库分表逻辑嵌入到业务代码。分库分表插件的实现包括如下几个要点。

    • 配置文件管理分库分表配置信息;
    • JAVA注解说明SQL语句分库分表信息;
    • JAVA AOP解析注解+查询配置文件,获取数据源及表名;
    • MYBATIS动态替换表名;
    • SPRING动态替换数据源。

    通过分库分表,解决了写容量扩展问题。但是分表后,会给查询带来一定的限制,只能支持主要维度的查询,其它维度的查询效率存在问题。

    ES搜索

    订单表分表之后,对于ID、用户ID、门店ID外的查询(比如按照手机号前缀查询)存在效率问题。这部分通常是复杂查询,可以通过全文搜索来支持。在订单系统中,我们通过ES来解决分表后非分表维度的复杂查询效率问题。具体来说,使用ES,主要涉及如下几点:

    • 通过databus将订单数据同步到ES。
    • 同步数据时,通过批量写入来降低ES写入压力。
    • 通过ES的分片机制来支持扩展性。

    小结

    通过对存储层的可扩展性改造,使得订单系统存储层具有较好的可扩展性。对于中间层的可扩展性与上面提到的中间层可用性一样,中间层本身已提供解决方案,直接复用即可。对于服务层,订单系统服务层提供的都是无状态服务,对于无状态服务,通过增加机器,即可获得更高的容量,完成扩容。

    通过对订单系统各层可扩展性改造,使得订单系统具备了较好的可扩展性,能够支持业务的持续发展,当前,订单系统已具体千万单/日的容量。

    上面几部分都是在介绍如何通过架构、技术实现等手段来搭建一个可靠、完善的订单系统。但是,要保障系统的持续健康运行,光搭建系统还不够,运维也是很重要的一环。

    智能运维的订单系统

    早期,对系统及业务的运维主要是采用人肉的方式,即外部反馈问题,RD通过排查日志等来定位问题。随着系统的复杂、业务的增长,问题排查难度不断加大,同时反馈问题的数量也在逐步增多。通过人肉方式效率偏低,并不能很好的满足业务的需求。

    为提升运维效率、降低人力成本,我们对系统及业务运维进行自动化、智能化改进,改进包括事前、事中、事后措施。

    事前措施

    事前措施的目的是为提前发现隐患,提前解决,避免问题恶化。

    在事前措施这块,我们主要采取如下几个手段:

    1. 定期线上压测:通过线上压测,准确评估系统容量,提前发现系统隐患;
    2. 周期性系统健康体检:通过周期检测CPU利用率、内存利用率、接口QPS、接口TP95、异常数,取消订单数等指标是否异常,可以提前发现提前发现潜在问题、提前解决;
    3. 全链路关键日志:通过记录全链路关键日志,根据日志,自动分析反馈订单问题原因,给出处理结果,有效提高反馈处理效率。

    事中措施

    事中措施的目的是为及时发现问题、快速解决问题。

    事中这块,我们采取的手段包括:

    1. 订单监控大盘:实时监控订单业务指标,异常时报警;
    2. 系统监控大盘:实时监控订单系统指标,异常时报警;
    3. 完善的SOP:报警后,通过标准流程,快速定位问题、解决问题。

    事后措施

    事后措施是指问题发生后,分析问题原因,彻底解决。并将相关经验教训反哺给事前、事中措施,不断加强事先、事中措施,争取尽量提前发现问题,将问题扼杀在萌芽阶段。

    通过将之前人肉进行的运维操作自动化、智能化,提升了处理效率、减少了运维的人力投入。


    展开全文
  • 【PP生产订单】入门介绍(三)

    千次阅读 2018-11-13 20:02:29
    手动创建方式:指定订单类型,定义订单项目(一个只会有10),复制工艺路线,复制BOM(“提前期偏置量”和“工序提前期偏置”),计算进度,有效性检查(后台配置可选),可选功能,新增修改,保存。 有效性...
  • 在接google play的充值渠道,用户购买和支付都在客户端完成操作,用户支付完成后,客户端会下发支付信息给充值平台...订单相关信息 "nonce" : 1836535032137741465, "orders" : [{ "notificationId" : "android.test
  • 订单数据分析-实战

    千次阅读 2020-10-11 16:46:56
    1. 京东订单数据准备 1.1 京东订单数据介绍 2020年5月25日 10%抽样数据 大家电-家用电器-冰箱 70K+ 1.2 数据清洗 缺失值处理 ...有效订单、取消订单、待支付订单 GMV(所有有效订单的总交易额)
  • 订单功能怎么测试?/订单功能测试的设计点

    千次阅读 多人点赞 2020-12-29 16:33:13
    1、用户下单后,取消订单; 2、下单后,一直不付款,检查订单超时不付款的场景下,会不会自动取消订单; 3、在订单快超时时,付款; 4、下单后,在不同的终端登录,一端取消订单,同时一端对该订单进行付款; 5、...
  • 【PP生产订单】入门介绍(五)

    千次阅读 2018-11-22 19:56:46
    其中有效性检查不需要订单下达就可以做。 下面着重介绍一下生产订单的状态: 演变过程展示: CRTD 建立状态 下达 REL 下达状态 发料 REL,GMPS 下达,货物移动 报工 REL,GMPS,PCNF ...
  • 【PP生产订单】入门介绍(六)

    千次阅读 2018-11-24 11:32:34
    订单有效性(可用性)检查: 是要系统自动帮我们做还是我们手动操作,这个需要后台进行配置。 可用性检查这里有两个选项: 1、创建时候检查 2、下达时候检查 那么系统以什么方式进行检查呢? 这里...
  • 一、 问题 一件商品只有100个库存,现在有1000或者更多的用户来购买,每个用户计划同时购买1个到几个不等商品...(5)取消订单 (6)回退预占库存 三、 什么时候进行预占库存? (1)方案一:加入购物车的时候去...
  • SAP订单结算详解

    万次阅读 2019-02-28 08:23:45
    SAP订单结算详解 (2017-04-08 19:09:33) 转载▼ 标签: 订单 结算 sap 分类:ERP、MES与企业信息化 一.认识SAP订单 关键词:订单|订单类别|订单类型 SAP中的订单(Order)是个广义...
  • 1. 对销售订单有效性验证  1)检查销售订单的行是否被完全传回客户化表  2)验证销售订单的关键字段  3)检查子库存是否启用了货位控制,如果启用了货位控制,没有生成货位,则调用API生成货位  4)调用...
  • 订单功能如何测试

    千次阅读 2020-12-29 17:01:48
    1、用户下单后,取消订单; 2、下单后,一直不付款,检查订单超时不付款的场景下,会不会自动取消订单; 3、在订单快超时时,付款; 4、下单后,在不同的终端登录,一端取消订单,同时一端对该订单进行付款; 5、...
  • 正常的PO没有期间的,是一次的,但是框架订单会有一个时间范围,比如某个结算期间或者某个年度,将发生的费用都归结起来。 比如上图中的例子,下了一个FO框架订单,总预算是10000,有效范围是1998/01/01~1998/12/...
  • 超市订单管理系统

    千次阅读 2021-02-09 13:53:22
    超市订单管理系统是一个专为连锁店、超市等商业场所提供订单管理平台的系统。该系统的目标是建立一个订单管理平台,为需要合理规划超市供应链、供应商以及工作人员提供的便捷的平台。该系统的主要业务需求包括记录并...
  • 销售订单配置项目说明

    千次阅读 2015-10-26 14:55:35
    Sales Document Categ: 在SD内不同文件类型的分类,例如报价单,销售订单,运货单和发票等。 Sales Document Block:控制这个文件类型是否已经被冻结。有三个选择,如果该字段为空则表明这个文件类型没有被冻结,如果...
  • 订单中心,为网站下单提供接口,并基于多种维度提供订单查询,报表、导出功能。 关于订单的售后,放在“客服中心”系统中。 订单中心,负责处理订单流程,及与订单流程紧密相关的各种行为的支持。 所有市场、销售...
  • 在这个电子商务流行年代,24小时随时随地网购已经成为我们习以为常的生活习惯。看到不错的商品,我们会立即下单,完全不受时间、空间的限制,剁...上面示图是淘宝APP的订单详情页,左上方的自动确认时间起到了关键作...
  • 这时候可以使用网上推荐的多个方法临时解决。比如ME9F插入一条采购订单消息,然后让SAP误以为订单没有完成,从而允许ME28撤销采购订单。 要是有大量的需要修改的,可以通过SPRO修改配置: 具体如下: SPRO——...
  • 实现3天订单自动取消

    千次阅读 2015-05-07 18:26:31
    订单的表里面,再加入有效时间字段,如果查询的时候,如果订单为已下单未处理状态,查询有效字段,如果该字段的值少于当前时间,说明订单有效的,可以对订单进行下一步的操作,如果该字段的值大于当前时间,直接...
  • 【PP生产订单】入门介绍(一)

    千次阅读 多人点赞 2018-11-11 14:38:01
    这里讲的生产订单就是离散制造里面的单据,因为系统中有很多不同类型的单据(下图即后台配置)。 下面看一下跨应用的功能流程图中生产订单的位置: 通过需求计划产生计划订单,将计划订单转化成生产订单,然后...
  • 【转】 SAP CO内部订单配置

    千次阅读 2018-10-07 17:24:09
    1 定义订单类型    路径:IMG > 控制 > 内部订单 > 订单主数据 > 定义订单...
  • SpringBoot-项目5-订单模块

    千次阅读 2020-03-03 21:33:50
    81. 确认订单页-显示收货地址列表 此前已经完成“显示收货地址列表”功能,客户端(页面)向http://localhost:8080/addresses发请求,就可以得到收货地址列表的数据!所以,只需要在orderConfirm.html页面中,当加载...
  • 订单超时自动取消

    千次阅读 2015-01-29 17:09:44
    Java实现自动取消订单 这个功能我实际经验,民航某大航空公司的机票订单管理系统,订座45分钟付款,否者取消。 一: 1.quartz,每几分钟执行一次(根据订单处理速度,和订单生成情况)。 2.每次指定其中的...
  • 美团团购订单系统优化记

    千次阅读 2018-02-23 23:27:44
    目标作为线上S级服务,稳定的提升是我们不断的追求。尤其像七夕这类节日,高流量,高并发请求不断挑战着我们的系统。发现系统瓶颈,并有效地解决,使其能够稳定高效运行,为业务增长提供可靠保障是我们的目标。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,326
精华内容 30,530
关键字:

如何判断订单的有效性