K8凯发

在电子商务系统中使用幂等和高并发性

K8凯发电商系统?2018-11-09 12:40:37?电商资讯?

K8凯发

在Java Web项主张开发中,我时时在订单系统中天生订单时听到幂等节造和并发节造 。这部门总结了内容 。在高并发规划中,代码级别必要是并发的 =谠;但事实上,幂等性更多地是对系统表部接口的承诺,承诺在一个要求和多个要求中返回一样的数据 。从高档代数的幂等性,HTTP的幂等性和订单天生系统的幂等性来诠释幂等性;并发节造提供了散布式锁和其他步骤来实现并发场景的代码 。  。

I.幂等幂等['a?d?mpo?t?ns]

1.高档代数中幂等概想的诠释:

对于单眼操作,x是一组中的肆意数 。若是满足f(x)=f(f(x)),那么我们将f运算称为幂等 。例如,在实数集中,绝对值操作是示例: 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,但所有函数只能在其中一个属性上运行 。因而,从这个级别我们能够理解:函数只对其操作的对象的属性拥有幂等性,而不是拥有整个对象的幂等元素 。

%25E5%25B9%2582%25E7%25AD%2589%25E5%2592%258C%25E9%25AB%2598%25E5%25B9%25B6%25E5%258F%2591%25E5%259C%25A8%25E7%2594%25B5%25E5%2595%2586%25E7%25B3%25BB%25E7%25BB%259F%25E4%25B8%25AD%25E7%259A%2584%25E4%25BD%25BF%25E7%2594%25A8-1

必须澄清的另一点是,由:的幂等性表白的概想侧沉于数学运算和数值,并没有提到数字安全问题 。与上面的Person setAge函数一样,有两种情况 。关于等势,但法式开发必须关注:

同时挪用两个线程 由于春秋并没有从业务中削减,若是之前的通话设置为30岁,则下一次通话将变为10岁甚至越发离谱--1岁

幂等性是系统界面的一种表部承诺(不是实现) 。它承诺只有成功挪用接口,表部屡次挪用对系统的影响就是一致的 。申明为幂等的接口将假定表部挪用失败是正常的,并且在失败后将不成预防线沉试 。因而,RESTful设计使用幂等性和安全性作为衡量POST,PUT,GET和DELETE操作的两个分歧指标 。因而,post不是幂等的,而get get是幂等的,也就是说,在post要求中天生一个号令,我们必须节造幂等性 。如下所示,ajax要求是颁布要求的示例 。若是屡次挪用post要求,它将在表中插入多个纪录 。显然,帖子要求不是幂等的,所以幂等性的节造是我们在法式中节造它 。

%25E5%25B9%2582%25E7%25AD%2589%25E5%2592%258C%25E9%25AB%2598%25E5%25B9%25B6%25E5%258F%2591%25E5%259C%25A8%25E7%2594%25B5%25E5%2595%2586%25E7%25B3%25BB%25E7%25BB%259F%25E4%25B8%25AD%25E7%259A%2584%25E4%25BD%25BF%25E7%2594%25A8-2

2. HTTP和谈中的幂等性

SOA和项目中的RESTful API接口的盛行必要利用层HTTP和谈的支持 。目前的项目结构:Web API + RIA(Rich Internet Applications富Internet利用法式),Web API侧沉于提供业务服务,RIA侧沉于用户界面和交互设计,这两个领域的分工越创造确 。正如单一的Java说话并不料味着高质量的Java法式一样,单一的HTTP和谈并不料味着高质量的Web API 。要设计高质量的Web API,您必要相识散布式系统和HTTP和谈的职能 。幂等性在HTTP 1.1规范中界说 。

步骤也能够具佑装幂等性”的个性(除了谬误或有效期表)N的副作用> 0个一样的要求与单个要求一样 。

凭据界说,HTTP步骤的幂等性意味着对资源的一个或多个要求应拥有一样的成效 。幂等性是散布式系统设计中极度沉要的概想,HTTP的散布式个性也决定了它在HTTP中的沉要性 。例如,若是存在这样的业务逻辑,如果有一个远程API(可所以HTTP或不是HTTP)从账户中提取资金 。我们临时界说界面:

Bool退出(account_id,金额)

提款的语义是从与account_id对应的帐户中扣除金额;若是扣除成功,则返回true,账户余额削减金额;若是扣除失败,则返回false,帐户余额维持不变 。值妥贴心的是,与本地环境相比,我们不能等闲地如果散布式环境的靠得住性 。典型的情况是服务器正确处置了撤销要求,但由于网络等原因导致服务器的返回了局迷失,客户端无法知路处置了局 。若是它在网页上,一些不相宜的设计可能会导致用户以为上次操作失败,而后刷新页面,这会导致撤销被挪用两次,并且帐户也会被扣除一次 。如下图所示:

%25E5%25B9%2582%25E7%25AD%2589%25E5%2592%258C%25E9%25AB%2598%25E5%25B9%25B6%25E5%258F%2591%25E5%259C%25A8%25E7%2594%25B5%25E5%2595%2586%25E7%25B3%25BB%25E7%25BB%259F%25E4%25B8%25AD%25E7%259A%2584%25E4%25BD%25BF%25E7%2594%25A8-3

该问题的解决规划是通过引入支持散布式事务的中央件来使用散布式事务来确保撤销职能的事务性 。散布式事务的利益是挪用者极度单一,并且复杂性留给中央件来治理 。弊端是一方面,系统结构太沉,容易绑定到特定的中央件,这不利于异构系统的集成;另一方面,散布式事务能够保障事务的ACID性质,但不能提供机能和可用性 。保障 。

另一种更轻量级的解决规划是幂等设计 。我们能够通过一些技巧将平局变为幂等,例如:

Int create_ticket()bool idempotent_withdraw(ticket_id,account_id,amount)

create_ticket的语义是获取服务器端天生的唯一令牌令牌,该令牌将用于标识后续操作 。 idempotent_withdraw和withdraw之间的区别在于令牌与令牌有关联 。由令牌暗示的操作最多只会处置一次,每次挪用都将返回第一次挪用的了局 。通过这种方式,idempotent_withdraw是幂等的,客户端能够安全地屡次挪用它 ;痪浠八,当提交屡次点击时,也会提交服务器天生的令牌 。由于多个令牌是一样的令牌,因而服务器最多只处置一次一样令牌的颁布订单 。因而,实现了对幂等性的间接节造 。

幂等解决规划中的齐全提款流程分为两个步骤:1 。挪用create_ticket()获取令牌; 2.挪用idempotent_withdraw(token,account_id,amount) 。固然create_ticket不是幂等的,但在本设计中,它对系统状态的影响能够忽略,加上idempotent_withdraw是幂等的,因而任何一步由于网络或其他原因导致失败或超时,客户端能够沉试直到获得了局 。如图2所示:

%25E5%25B9%2582%25E7%25AD%2589%25E5%2592%258C%25E9%25AB%2598%25E5%25B9%25B6%25E5%258F%2591%25E5%259C%25A8%25E7%2594%25B5%25E5%2595%2586%25E7%25B3%25BB%25E7%25BB%259F%25E4%25B8%25AD%25E7%259A%2584%25E4%25BD%25BF%25E7%2594%25A8-4

幂等设计优于散布式事务的优势在于它轻量级,易于适应异构环境,机能和可用性 。在一些拥有更高机能要求的利用中,幂等设计通常是唯一的选择 。

HTTP GET步骤用于获取资源,不应该有副作用,因而它是幂等的 。例如:GEThttp://www.bank.com/account/123456,无论是被挪用一次还是N次,都不会扭转资源的状态 。把稳,这里的沉点是它拥有与N次一样的成效,而不是每个GET的一样了局 。 GEThttp://www.news.com/latest-news此HTTP要求每次都可能得到分歧的了局,但它没有任何副作用,因而满足幂等性 。 HTTP DELETE步骤用于删除资源并拥有副作用,但它应该满足幂等性 。例如:DELETEhttp://www.forum.com/article/4231,呼叫和N次对系统有一样的副作用,即删除id为4231的帖子;因而,挪用者能够屡次挪用或刷新页面,而不用不安导致谬误 。 更麻烦的是HTTP POST和PUT 。 POST和PUT之间的区别很容易被误会为“POST意味着创建资源,PUT意味着更新资源”;事实上,两者都能够用来创造资源,而更沉要的区别在于幂等性 。 POST和PUT在HTTP规范中界说如下:

%25E5%25B9%2582%25E7%25AD%2589%25E5%2592%258C%25E9%25AB%2598%25E5%25B9%25B6%25E5%258F%2591%25E5%259C%25A8%25E7%2594%25B5%25E5%2595%2586%25E7%25B3%25BB%25E7%25BB%259F%25E4%25B8%25AD%25E7%259A%2584%25E4%25BD%25BF%25E7%2594%25A8-5

与POST对应的URI不是创建的资源自身,而是资源的接管者 。两个一样的POST要求在服务器端创建两个拥有分歧URI的资源;因而,POST步骤没有幂等性 。与PUT对应的URI是要创建或更新的资源自身 。多个PUT对统一URI的副作用与一个PUT一样;因而,PUT步骤是幂等的 。论坛网站使用令牌步骤的幂等性节造来预防沉复颁布和订单天生 。

3.总结

在电子商务系统中,常见的问题是:若何预防沉复提交帖子要求? HTTP POST操作既不安全也不幂等 。当我们因沉复浏览器刷新而屡次提交表单时,会屡次发出一样的POST要求,导致远程服务器沉复创建资源 。因而,对于电子商务利用法式,第一个对应的后端WebService必须是幂等的,第二个服务器接管POST要求,并且必须在操作成功后跳转到另一个页面,这样即便用户刷新页面也是如此,并且不会反复提交表格 。

二,高并发性

1.散布式锁的界说

散布式锁是一种节造散布式系统之间共享资源同时接见的步骤 。在散布式系统中,通常必要协调其操作 。若是在统一系统的分歧主机之间共享分歧系统或一个资源主机,则接见这些资源通常必要互斥以预防互有关扰以确保一致性 。在这种情况下,使用散布式锁 。散布式锁在很多环境中是极度有效的原语 。它们是在统一系统的分歧系统或分歧主机之间共享资源的有效方式 。例如,在电子商务系统中,必须确保整个散布式系统内的沉要事物(订单,帐户等)的有效操作线程一次只有一个 。例如,买卖中心有N个服务器,订单中心有M个服务器 。若何确保订单的支付处置一样,帐户的一样充值操作是原子的 。

实现散布式锁的常见服务有:memcache zookeeper redis chubby hazelcast 。

2.散布式锁实现

散布式锁通常用于散布式利用法式,重要用于解决散布式资源接见矛盾的问题 。传统的锁ReentrantLock在实现时会出现问题 。 ReentrantLock的锁定和解锁要求必须在统一个线程中 。在散布式利用法式中,锁定和解锁是两个不有关的要求,因而它们绝对不是统一个线程 。这使得无法使用ReentrantLock 。


K8凯发 b2b2c多用户商城系统是基于PHP技术的企业级电子商务平台系统,系统支吃旖台自营、招商加盟和多商家入驻、集成微信商城、移动端APP商城、微信幼法式于一体 。公司主交易务蕴含商城系统定造开发、新零售系统解决规划、电商平台系统定造开发、商城网站建设服务等等,K8凯发为大、钟注幼企业提供一个安全、高效、壮大的电子商务解决规划,协助企业急剧构建、部署和治理其电子商务平台,拓展企业销售渠路,致力于推动PHP技术和电子商务行业的发展而不休致力 。

文章关键词  
电商网站开发
商城网站建设
做电商网站,找K8凯发信息技术,网站建设品牌设计企业

推荐阅读

除了供给尺度网上商城系统之表,我们还开源商城源码,为您提供电商平台开发定造服务

K8凯发全新版PHP企业级电商平台系统,以客户需要为己任,提供免费网店系统源码给用户履历,为国内客户出格是上海周边客户提供电商平台及网上商城网站建设服务,您的商城开发建站需要,我们来实现!

网上商城建站
蕴含微信商城网站建设及幼法式商城建设等一站式电商系统建站服务,java商城php商城 两种说话 。
APP开发
提供APP商城开发,蕴含Android App 、iOS App等等, 原生APP品质
手机商城开发
提供APP商城、微信商、幼法式、手机H5商城搭建及二次开发
电商平台开发
作为电子商务系统提供商,以自研的商城模板为企业提供专业的电商平台系统搭建服务

顿时搭建自己的电商平台

wechat_default
wechat_default
【网站地图】