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

随商电商系统2018-11-09 12:40:37电商资讯

在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,但所有函数只能在其中一个属性上运行。因此,从这个级别我们可以理解:函数只对其操作的对象的属性具有幂等性,而不是具有整个对象的幂等元素。

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

同时调用两个线程 因为年龄并没有从业务中减少,如果之前的通话设置为30岁,则下一次通话将变为10岁甚至更加离谱--1岁

幂等性是系统界面的一种外部承诺(不是实现)。它承诺只要成功调用接口,外部多次调用对系统的影响就是一致的。声明为幂等的接口将假定外部调用失败是正常的,并且在失败后将不可避免地重试。因此,RESTful设计使用幂等性和安全性作为衡量POST,PUT,GET和DELETE操作的两个不同指标。因此,post不是幂等的,而get get是幂等的,也就是说,在post请求中生成一个命令,我们必须控制幂等性。如下所示,ajax请求是发布请求的示例。如果多次调用post请求,它将在表中插入多个记录。显然,帖子请求不是幂等的,所以幂等性的控制是我们在程序中控制它。

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,帐户余额保持不变。值得注意的是,与本地环境相比,我们不能轻易地假设分布式环境的可靠性。典型的情况是服务器正确处理了撤销请求,但由于网络等原因导致服务器的返回结果丢失,客户端无法知道处理结果。如果它在网页上,一些不合适的设计可能会导致用户认为上次操作失败,然后刷新页面,这会导致撤销被调用两次,并且帐户也会被扣除一次。如下图所示:

该问题的解决方案是通过引入支持分布式事务的中间件来使用分布式事务来确保撤销功能的事务性。分布式事务的优点是调用者非常简单,并且复杂性留给中间件来管理。缺点是一方面,体系结构太重,容易绑定到特定的中间件,这不利于异构系统的集成;另一方面,分布式事务可以保证事务的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所示:

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

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规范中定义如下:

与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。


随商信息技术(上海)有限公司 b2b2c多用户商城系统是基于PHP技术的企业级电子商务平台系统,系统支持平台自营、招商加盟和多商家入驻、集成微信商城、移动端APP商城、微信小程序于一体。公司主营业务包含商城系统定制开发、新零售系统解决方案、电商平台系统定制开发、商城网站建设服务等等,随商为大、中、小企业提供一个安全、高效、强大的电子商务解决方案,协助企业快速构建、部署和管理其电子商务平台,拓展企业销售渠道,致力于推动PHP技术和电子商务行业的发展而不断努力。

文章关键词  
电商网站开发
商城网站建设

除了供应标准网上商城系统之外,我们还开源商城源码,为您提供电商平台开发定制服务

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

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

马上搭建自己的电商平台