订单操作对电商订单表结构设计有的意义

【图文】电子商务的意义与作用_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
电子商务的意义与作用
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢&&&&&&&&&&&&&&&&&&
posts - 228,comments - 223,trackbacks - 0
在Java web项目开发中,经常会听到在做订单系统中生成订单的时候,要做幂等性控制和并发控制,特对此部分内容作出总结,在高并发场景下,代码层面需要实现并发控制;但是幂等性,其实更多的是系统的接口对外的一种承诺,承诺一次请求和多次请求会返回同样的数据。关于幂等性将分别从高等代数中的幂等性、HTTP中的幂等性和订单生成系统中的幂等性阐述;并发性控制则提供了分布式锁等方式来对并发场景进行代码实现。
一、幂等性&idempotence&&['a?d?mpo?t?ns]
1.高等代数中关于幂等idempotence概念解释:
  单目运算, x为某集合内的任意数, 如果满足f(x)=f(f(x)), 那么我们称f运算为具有幂等性(idempotent)。比如在实数集中,绝对值运算就是一个例子: abs(a)=abs(abs(a))。
  双目运算,x为某集合内的任意数, f为运算子如果满足f(x,x)=x, f运算的前提是两个参数都同为x, 那么我们也称f运算为具有幂等性。比如在实数集中,求两个数的最大值的函数: max(x,x) = x,&还有布尔代数中,逻辑运算 "与", "或" 也都是幂等运算, 因为他们符合AND(0,0) = 0, AND(1,1) = 1, OR(0,0) = 0, OR(1,1) = 1。
在将幂等性应用到软件开发中,需要一些更深的理解,我的理解如下:数学处理的是运算和数值, 程序开发中往往处理的是对象和函数. 但是我们不能简单地理解为数学幂等中的运算就是函数,而数值就是对象。如Person对象有两个属性weight和age,但是所有的function只能对其中一个属性操作。所以从这个层面我们可以理解为: 函数只对该函数所操作的对象某个属性具有幂等性, 而不是说对整个对象有运算幂等性。&
private int
private int
//是幂等函数
public void setAge(int v){
this.age =
//不是幂等函数
public void increaseAge(){
this.age++;
//是幂等函数
public void setWeight(int v){
this.weight=v+10;//故意加10斤!!
还有一点必须要澄清的是:&幂等性所表达的概念关注的是数学层面的运算和数值, 并没有提及到数值的安全性问题.如上面的Person的setAge函数, 有两种case不是幂等性所关心的, 但程序开发却又必须要关心的:
两个线程同时调用
因为age从业务上讲不可能递减, 如果前一次调用设置是30岁, 后一次调用变成了10岁或是更离谱的 -1&岁
幂等性是系统的接口对外一种承诺(而不是实现), 承诺只要调用接口成功, 外部多次调用对系统的影响是一致的。声明为幂等的接口会认为外部调用失败是常态, 并且失败之后必然会有重试。所以RESTful设计中将幂等性和安全性作为两个不同的指标来衡量POST,PUT,GET,DELETE操作的。因此,post不是幂等性的,put get delete都是幂等性的,也即在生成订单的post请求中,我们要做幂等性的控制。如下图,一个ajax请求是一次post请求的示例,如果这个post请求被调用多次,它会向表插入多条记录,很显然post请求并不是幂等性的,所以幂等性的控制交由我们程序中来控制。
2.HTTP协议中的幂等性
  项目中中的SOA和restful API接口的流行,都需要应用层HTTP协议的支持,目前的项目结构:Web API + RIA(Rich Internet Applications富互联网应用),Web API专注于提供业务服务,RIA专注于用户界面和交互设计,从此两个领域的分工更加明晰。正如简单的Java语言并不意味着高质量的Java程序,简单的HTTP协议也不意味着高质量的Web API。要想设计出高质量的Web API,还需要深入理解分布式系统及HTTP协议的特性。在HTTP1.1规范中定义幂等性。
Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects   of N & 0 identical requests is the same as for a single request.
从定义上看,HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的作用。幂等性是分布式系统设计中十分重要的概念,而HTTP的分布式本质也决定了它在HTTP中具有重要地位。比如有这样一个业务逻辑,假设有一个从账户取钱的远程API(可以是HTTP的,也可以不是),我们暂时定义接口:
bool withdraw(account_id, amount)
withdraw的语义是从account_id对应的账户中扣除amount数额的钱;如果扣除成功则返回true,账户余额减少amount;如果扣除失败则返回false,账户余额不变。值得注意的是:和本地环境相比,我们不能轻易假设分布式环境的可靠性。一种典型的情况是withdraw请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被丢掉了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了withdraw被调用两次,账户也被多扣了一次钱。如下图所示:
这个问题的解决方案一是采用分布式事务,通过引入支持分布式事务的中间件来保证withdraw功能的事务性。分布式事务的优点是对于调用者很简单,复杂性都交给了中间件来管理。缺点则是一方面架构太重量级,容易被绑在特定的中间件上,不利于异构系统的集成;另一方面分布式事务虽然能保证事务的ACID性质,而但却无法提供性能和可用性的保证。
  另一种更轻量级的解决方案是幂等设计。我们可以通过一些技巧把withdraw变成幂等的,比如:
int create_ticket()
bool idempotent_withdraw(ticket_id, account_id, amount)
create_ticket的语义是获取一个服务器端生成的唯一的处理号token,它将用于标识后续的操作。idempotent_withdraw和withdraw的区别在于关联了一个token,一个token表示的操作至多只会被处理一次,每次调用都将返回第一次调用时的处理结果。这样,idempotent_withdraw就符合幂等性了,客户端就可以放心地多次调用。也就是说,多次点击提交的时候,附带提交的还有服务端生成的token,由于多次提交带的是同一个token,所以服务端对于同一个token的post订单,至多只会处理一次,所以间接的实现了幂等性的控制。
基于幂等性的解决方案中一个完整的取钱流程被分解成了两个步骤:1.调用create_ticket()获取token;2.调用idempotent_withdraw(token, account_id, amount)。虽然create_ticket不是幂等的,但在这种设计下,它对系统状态的影响可以忽略,加上idempotent_withdraw是幂等的,所以任何一步由于网络等原因失败或超时,客户端都可以重试,直到获得结果。如图2所示:
和分布式事务相比,幂等设计的优势在于它的轻量级,容易适应异构环境,以及性能和可用性方面。在某些性能要求比较高的应用中,幂等设计往往是唯一的选择。
HTTP GET方法用于获取资源,不应有副作用,所以是幂等的。比如:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。
HTTP DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:DELETE http://www.forum.com/article/4231,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。
比较容易混淆的是HTTP POST和PUT。POST和PUT的区别容易被简单地误认为&POST表示创建资源,PUT表示更新资源&;而实际上,二者均可用于创建资源,更为本质的差别是在幂等性方面。在HTTP规范中对POST和PUT是这样定义的:
The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line ...... If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header.
The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.
POST所对应的URI并非创建的资源本身,而是资源的接收者。比如:POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性。而PUT所对应的URI是要创建或更新的资源本身。比如:PUT http://www.forum/articles/4231的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性。论坛网站防止重复发帖和订单生成都用到token方式的幂等性控制。
  在电商系统中,常见问题:如何防范post请求的重复提交?HTTP POST 操作既不是安全的,也不是幂等的。当我们因为反复刷新浏览器导致多次提交表单,多次发出同样的POST请求,导致远端服务器重复创建出了资源。所以,对于电商应用来说,第一对应的后端 WebService 一定要做到幂等性,第二服务器端收到 POST 请求,在操作成功后必须跳转到另外一个页面,这样即使用户刷新页面,也不会重复提交表单。
二、高并发
1.分布式锁的定义
  分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。分布式锁是一个在很多环境中非常有用的原语,它是不同的系统或是同一个系统的不同主机之间互斥操作共享资源的有效方法。如在电商系统中,需要保证整个分布式系统内,对一个重要事物(订单,账户等)的有效操作线程 ,同一时间内有且只有一个。比如交易中心有N台服务器,订单中心有M台服务器,如何保证一个订单的同一笔支付处理,一个账户的同一笔充值操作是原子性的。
  常见的实现分布式锁的服务有:memcache zookeeper redis chubby hazelcast。
2.分布式锁实现
  分布式锁在分布式应用当中是要经常用到的,主要是解决分布式资源访问冲突的问题。传统的锁ReentrantLock在去实现的时候是有问题的,ReentrantLock的lock和unlock要求必须是在同一线程进行,而分布式应用中,lock和unlock是两次不相关的请求,因此肯定不是同一线程,因此导致无法使用ReentrantLock。
1、什么是restful风格的API接口?
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
http://www.cnblogs.com/j2eetop/p/4612437.html
http://www.cnblogs.com/weidagang2046/p/exception-handling-principles.html
http://www.cnblogs.com/orange1438/p/4637776.html
阅读(...) 评论()已解决问题
双十一为什么要预售,预售对于电商有哪些意义?
预售对于平台、卖家、买家分别有什么意义,请大神们赐教。
浏览次数:1793
用手机阿里扫一扫
最满意答案
作为现在在电商圈混迹的人,尝试回答一下,对错也希望大神指教。最近关注天猫双11比较多,就拿天猫来举例。天猫做预售不是今年刚开始的,但是通过其他文章怎么看天猫的预售?&-&电子商务&听人评论说之前的更像是团购,其实从今年的预售产品来看,今年的情况又何尝不是。预售的生产过程更像是job&order&production&process,是以已经收集到用户订单数量,订单情况(是否有customize)为基础作为生产,好处当然是控制成本咯,避免overstock,避免多余人工成本,生产成本。我看了一下今年天猫双11的规则,到11月10日前付定金都算pre-order成功,也就是说,如果是用预售的形式,需要商家拿着用户订单数量,发给生产方,生成出的成品再发货。不知道天猫给商家规定的发货时间是多少,如果是一周以内的短期的话,我不清楚是否能够完成整个产品线的供应,更何况有些产品还是宣传力度比较大的海外热品。所以我猜测这里的预售更偏向于进货方面的成本控制,也就是成品已经有了,只是商家不知道应该order&多少量,根据双11前的增量进行订货控制。但是这种情况也不是完全可控可行的,货不在商家自己的手里,变数就会出现在它的上游,或者海关等方方面面,这样也不能保证预售店家允诺的产品能够预期发货。如果天猫对发货有一个严格的要求,要么天猫的实力强大到掌控到细节,协调好商家的实力和要求,要么天猫对用户体验没那么在乎哈哈,要么我猜测预售更多充当一个噱头。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&10.29&懒了一阵后更新;说到噱头,可以说的又很多了,这个和marketing相关性更强,双11的历史累计数据已经很多,所以每年的订货量应该有一个比较准确的预估,如果在大的模式没有改变的情况下,商家乃至天猫整个的进货策略应该在很早之前就已经确定了,而且是包括了预售刺激的销售量,所以这个预售还是明面预售,实质团购的。再说为啥要这个噱头呢?第一&拉长战线,增加销售额。双11&的其中一个原因是时间上的短促,一天的促销和3天的促销给人的感觉是不一样的,就像跳楼甩卖,老板跑了,2元2元全部2元用的多了,听到的人只会留下一个高冷的背影,稀有资源更会让人产生200%的非理性冲动,抢抢抢买买买才会造就天猫秒破记录的战绩。但是对商家来说,时间上的限制又何尝不是一个痛处,撑死了24小时饱和也会到一个极限,但是如果把这24小时变成48小时呢,24*11呢?销售量肯定没有办法成相同比例增长,但是增长是一定的,因为对于购物主力军的女性来说,增加商品曝光是会增加购买可能的。而且预售的本质是东西已经一半进了钱包,还是必须完成在双11抢购的使命,这还是保留了一定的冲动驱使,让人觉得买到就是赚了,再加上下半年开篇的旺季就属双11,每个人的钱包都已经急不可耐,就等着商家搂钱咯第二&总要比对手先行一步。商家促销要求快准狠,抢占先机才能保证胜利,在国内电商如此繁盛的情况下,大家砸钱也往前冲的干劲真真让消费者开心,商家之间开始不停的博弈,现在的双11是提前到10月,还有双11的返场,以后可能就会提前到双10,双9,双8...&如果别人都已经动了,你在不动,不等着回家卖红薯还要干啥类。所以除非你是垄断商品,是刚需商品,都要在考虑竞争对手的情况下做促销策略。说到这里,不免提一下京东的双11,粗略的看了一下,个人觉得今年京东完全输了,怎么小天的加入并没有让这个网站变得更善良。京东的双11,我这么勤快的一个人都懒得解释规则,每天一个品类是怎么回事?双11的主题宣传横屏滚动是怎样炫酷的用户体验?活动多到挑不出重点是什么鬼?我只读出了,天哪,京东运营人真多。用每天一个品类刺激多次消费,个人觉得并不高明,且不说用户记不住每天到底是什么在打折,你的每个品类对我的吸引力真的有那么大吗,这种方式给购物后端比如price&match,&客服等造成的压力也很大。这个对刺激销售的实际意义有多大?真的值得吗?其实总的来看,国内的电商都有一个特点,把用户当福尔摩斯,活动多而复杂,相比下美国电商,活动智商感人,把你当华生都是高抬。对比京东,天猫的双11是优秀的,形式虽然也需要有一个educate&consumer的过程,但是活动的纬度并不让人觉得有压力,而且属于模式上的创新,保不准再做几年,这个新的模式还是能起来的,谁知道呢&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&第三,就像楼下所说的,为了提前配货,根据已经预售的数据信息提前调货,协调各地的库存,但我觉得这个对全国有多个仓库的商家更有针对性,如果全国只有几个点还说什么调货。另一方面来看,预售和真实销售还是有偏差的,商家还是需要预留一部分的订单差异给那些下了定金却没有下订单的用户,至于这个差异是多少,应该是经过计算和经验定下来,避免无用功的成本过大。但是对于用户来说,如果是商家的年度活动千万不要等,不要等,不要等!第一是你自己决策的时间成本,第二好货真的不等人,第三是买的越快发单越早,晚一天买可能就晚一周发货,之前丝芙兰8折的时候,好些人等了半个月才收到发货通知。。。没有数据,其实我也不清楚预售给双11带来了多少的利益,但是谁也不知道如果没有预售,双11是不是有更好的表现?有的时候,是不是以不变应万变会有更好的结果呢?就简简单单的传递我打折我便宜的信息,是不是更加有效果?
答案创立者
以企业身份回答&
其实,预售的作用是提前备货。特别是目前电商仓储+配送的模式下,多数规模化电商会依据预售数据,做好全国分布式仓储中心的订单分配与物品储备。双十一当天即可进入配送环节。
预售说白了就是让你交定金冲双十一当天销售额,你交了钱就跑不掉了,不然你跑去京东买怎么办?说白了预售就是为了抢流量。
有阴谋!!达到的目的之一:让你在不知不觉间买下更多东西。哪怕到了双十一的时候突然发现京东更便宜,可是已经交了定金,想想算了,没有后悔的余地。购买行为从之前的【加购物车,攒到11.11,漫长的等待过程&&&&最终砍掉一部分,买下一部分】变成了,【哇定金才几块钱!东西好便宜!买买买!交定金,由于定金不退导致不得不为自己的冲动买更多的单】。把决策时间缩短了。把11.11原本仅有一天的狂欢,变成了长长的一个月的妹纸们无法抵御的&低价&推销。以及,如图?_?: &
能上预售的都是大店,十月中旬就开始推了,等于部分预售产品日常销售金额归到11.11当天去了(尾款需要这一天结算),而且今年加了个定金膨胀的玩法,贪便宜心里会更多人买预售。不计其他日子、其他未参加活动店铺的损失,只求一个11.11当天的销售金额。
正在进行的活动
生意经不允许发广告,违者直接删除
复制问题或回答,一经发现,拉黑7天
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
扫一扫用手机阿里看生意经
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is ok> 问题详情
在电子商务中,我们可以通过互联网,使生产商可与最终用户直接联系,中间商的重要性 因此有所降低。(
悬赏:0&答案豆
提问人:匿名网友
发布时间:
在电子商务中,我们可以通过互联网,使生产商可与最终用户直接联系,中间商的重要性 因此有所降低。()此题为判断题(对,错)。请帮忙给出正确答案和分析,谢谢!
为您推荐的考试题库
您可能感兴趣的试题
1在公有密钥体系中,公有密钥不能用来进行数据的加密,但解密必须用到。( )2陆路运输不属于基本物流服务的内容。( )3网络广告最大的特点就是具有交互性。( )
我有更好的答案
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
每天只需0.4元
选择支付方式
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
恭喜你被选中为
扫一扫-免费查看答案!
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
提示:请截图保存您的账号信息,以方便日后登录使用。
常用邮箱:
用于找回密码
确认密码:

我要回帖

更多关于 电商订单管理系统代码 的文章

 

随机推荐