APP下载

高并发仓储管理系统的设计与实现

2019-09-23史荧中

无锡职业技术学院学报 2019年4期
关键词:出库队列库存

许 敏 史荧中 张 悦

(1.无锡职业技术学院 物联网技术学院,江苏 无锡 214121;2.无锡超正软件有限公司,江苏 无锡 214153)

随着互联网技术的不断发展,全球已进入网络经济时代,电子商务将互联网技术运用到传统的销售行业,实现了从生产、仓储、运输到销售环节的重大变革。艾瑞数据显示,2016年中国电子商务市场交易规模达20.2万亿元,增速为23.6%,其中,网络购物增长23.9%,成为推动电子商务市场发展的重要力量之一[1]。繁荣的交易背后离不开大量用户和网店管理者的积极参与,也离不开交易管理、仓储管理、物流管理等系统的高效支持。

当前电子商务与现代物流的蓬勃发展对仓储管理系统提出了新的需求。早期的仓储管理是简单、静态的对货物储存的管理,主要依靠人工记忆和手工录入,不但费时费力,而且容易出错。随着信息技术的发展,手工记账逐渐转变成电子记账,通过信息化手段对仓储管理中的入库、出库、库位、库存等全方位的记录与分析,解决了仓储管理中账目不清晰的问题[2-4]。RFID技术及人工智能的发展又推动仓储管理向自动化、智能化发展[5-10]。现阶段电子商务的发展又对仓储管理提出新的要求,鉴于电商企业经常会做一些公开的促销活动的经营特点,销售订单在活动期间会呈几何级数的增长,传统的人工审核销售单或手工添加库存信息已经不能适应经营需求,需要开发新的功能以尽量避免手工作业,也避免高并发时用户需要等待的情形。

对于电商企业来讲,高并发是一种“甜蜜的烦恼”,电商企业对此是既欢迎又担心。大量用户能在自己的平台上蜂拥购物,显然是电商企业追求的目标,但高并发会形成对服务器资源的持续性占有,当并发数超过一定临界点后,会造成服务器阻塞,导致应用系统性能直线下降,可能影响用户的购物体验。对于注重用户体验感的电商企业来讲,高并发的处理尤为关键,因而在技术架构的设计上要充分考虑到这些因素。

1 系统需求分析

围绕仓储管理的自动化、智能化,学者们开展了众多研究,基于RFID技术的仓储管理系统能进行托盘、包装箱、货物信息的自动收集[5-6];人工智能技术促进了仓库的布局优化、成本控制[7-10]。

当前对仓储管理研究与实践的重点是与电子商务、现代物流的对接[11-12]。在仓储管理与电子商务的对接中,客户(买家)、网上店铺(卖家)及仓储管理系统是三个独立又相关的部分。客户通过网上店铺下单,卖家将订单转发至仓储管理系统,仓储管理系统对订单进行审核,并将审核结果返回给卖家及客户,如图1所示。传统的订单处理是由人工审核的,在高并发时会出现较长的等待审核时间,存在着性能瓶颈。

随着电子商务的发展,仓储管理的性能及安全性得到越来越多的重视,在淘宝、京东等大型购物网站上也得到了实践应用。淘宝、京东的“双十一”大促,要求仓储管理系统实时性高、响应快、能解决高并发问题。企业通常会从两方面来解决应用系统的高并发负载压力,一是提升服务器的硬件配置水平,如购买性能更加优良的服务器,更大内存、更快速的CPU,更多的CPU个数等;二是优化应用系统的架构设计,提高服务器资源的利用率,降低用户请求的资源占有率,从而提升系统的并发承载能力。从中小企业的角度来看,考虑到成本问题,大型购物网站所选用的拆分系统、灾备切换、 分流(水平扩展)、限流(超预期流量)等技术方案很难直接应用于中小型电商网站。另外,如果把自己的业务托管到大型购物平台,如京东、淘宝等,那么自己的客户资源就会被暴露出来,无形中降低了竞争力。因而,如何在适度成本下为中小型电商企业设计并开发高效、安全的独立仓储管理系统,有着现实的需求。

针对这类需求,本研究设计并开发基于Redis的高并发仓储管理系统(WareHouse Management System, WMS)。该系统实现了仓储管理系统入库、出库、库存管理等基本功能,并具有如下特性:

(1) 该WMS系统独立于已有ERP系统,并通过接口进行对接;

图1 具有自动审核订单功能的仓储管理系统

(2) 采用基于JWT的Token认证机制在用户和服务器间传递信息,节约系统开销;

(3) 销售出库管理模块采用Lumen框架的队列和Redis缓存技术实现高并发控制。

2 系统功能概述

本系统设计仓储管理系统在入库操作中,自动给出仓库空余库位的信息,增加入库操作的执行效率;在出库操作中,采用Lumen框架中的队列和Redis高并发数据处理技术,实现出库操作的高并发处理,解决人工记录时间成本大、效率低、错误率高的问题,以及已有中小型WMS系统无法实现的高并发问题;此外,出库、入库的自动化操作,可以合理给出库存调度的方案,使得库存盘点、报表生成省时省力。综合上面分析,最终所设计的系统分成基础信息管理、权限管理、销售出库管理、入库管理、库存管理、接口管理及报表统计等七大模块,功能模块如图2所示。

图2 仓储管理系统功能模块

3 主要技术实现方法

3.1 API接口与第三方平台对接

本系统有完善的API接口,可以通过接口和ERP、进销存等其他第三方平台实现对接,完成销售单,采购单自动接收操作,避免访问第三方平台数据库,增强了系统的通用性;同时避免手动添加单据,以减少用户的工作量。平台方传递到WMS系统的接口设置如表1所示。

下面介绍本仓储管理系统与已有第三方平台的通信过程。系统需要接收的数据有两个,分别是接收第三方平台发送的销售单,作为仓储管理系统出库操作的启动事件;接收第三方平台发送的采购单,作为仓储管理系统入库操作的启动事件。以接收销售单为例,介绍本系统与第三方系统对接的算法。

表1 平台方传递到WMS系统的参数说明

首先,介绍两个系统间数据传递格式及内容。

本仓储管理系统开放一个接口,供第三方平台发送销售单信息。两个系统之间采用JSON格式传递数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,JSON数据格式简单,读写方便;且JSON格式压缩,占用资源少,便于网络传输。

经双方协议,发送数据格式为报文、密文、客户编号和时间戳。其中,报文是销售单信息,包括销售单号、销售商品信息等信息;加密签名是将商家编号、报文、密钥按照协议的顺序,进行MD5加密后的内容;客户编号是仓储管理系统已登记的客户编号;时间戳是第三方平台发送请求时的时间戳;密钥由第三方平台和仓储管理系统共享。仓储管理系统接收到JSON数据后,会对其进行验证解析。接着,WMS接收第三方平台所发送的JSON格式数据后,JSON数据进行解析,获得客户编号、请求时间戳、订单信息和密文。为了验证数据网络传输的完整性,需要对获得数据进行验证。密文验证的目的是验证网络传输数据时,有无丢失数据,WMS利用密钥加密后的报文和加密签名相同,则可保证网络传输数据的完整性。最后,验证报文信息。首先对获得Http格式的字符串进行解码,将信息转换成字符串数组,获取存放在报文中的各项订单信息。接着,从数据库中查询报文解析出的订单号,根据订单实际情况,返回“审核中”“审核通过”“订单重复发送”“订单数据不正确”等信息给第三方平台。

3.2 基于JWT的Token认证

系统采用基于JWT(JSON Web Token)的Token认证机制实现用户和服务器之间的信息传递。一旦用户完成了登陆,在接下来的每个请求中包含JWT,用来验证用户身份以及对路由、服务和资源的访问权限进行验证。

传统的用户登录认证中,通常采用session方式。用户登录成功,服务端会保存一个session,客户端会把sessionId保存在cookie中,每次请求都会携带这个sessionId。“cookie+session”模式通常是保存在内存中,随着用户量的增多,开销就会越大,不适用高并发场景。JWT认证只需服务端生成token,客户端保存这个token,每次请求携带这个token,服务端认证解析即可。JWT的构成非常简单,字节占用很小,便于传输,它不需要在服务端保存会话信息,易于应用的扩展。

以登录功能为例,前端接收用户输入的账户和密码,通过ajax post传递到后端指定的URL登录接口,后端接收到数据后,访问数据库服务器,验证账户密码是否合法,若合法,返回token令牌到前端,之后的用户操作都需要进行token认证,如图3所示。

图3 基于JWT的Token认证

3.3 具有高并发性能的出库管理方案设计

在传统处理订单模式中,ERP系统将订单信息发送给仓储管理系统,仓储管理系统读取库存,判断库存是否符合要求,增减库存,然后修改订单,完成上述一系列操作后才会返回订单处理结果,如图4所示。它的缺点是高并发状态下,用户等待系统处理时间过长。

为了解决高并发问题,本系统的设计方案是:ERP推送订单,仓储管理系统审核订单信息是否完整,如果订单信息符合要求,则将订单信息存入队列池,同时通知ERP系统接单成功。这样做的好处是可以及时对用户操作做出响应,提高用户的体验感。接着系统使用Lumen框架下的队列来依次处理订单,完成判断库存,增减库存,修改订单一系列操作,如图5所示。

图4 传统的WMS出库订单处理模式

图5 本仓储管理系统的出库订单处理模式

虽然该设计可以及时对客户订单做出响应,但存入队列池的订单,还需进行判断库存等一系列操作,又需要依次从队列池读取订单信息,频繁读写数据库操作会造成系统性能下降,所以将队列放到Redis缓存中,加快订单处理速度。在完成判断库存、增减库存、修改订单等一系列操作后,仓储管理系统会异步通知ERP系统订单的处理结果。

3.3.1高并发性能的出库管理实现流程 第一步,ERP系统向仓储管理系统发送订单。第二步,WMS系统接收到订单,解析出订单信息进入队列,存储在MySQL的jobs表中,如图6所示,同时系统给第三方平台发送“待审核”消息,表示已经收到订单。接着按队列中的顺序逐一读取jobs表中的订单信息,完成各个订单的审核流程。第三步,审核队列中的订单。在与第三方对接模块验证销售单格式合法性后,就将订单信息推送到系统队列中。队列先判断当前订单的货物数量是否足够,若足够就锁定库存数量、更新库存信息。第四步,订单处理后,异步返回客户“等待关联发货单”。

图6 队列池中的订单信息

3.3.2Redis缓存技术实现出库操作 需指出的是,将订单信息存入jobs表进行队列排队,订单审核时,又要从jobs表中读取销售单信息,在大批量订单高并发时,频繁地写入和读取数据表中数据,会导致系统性能降低。故本系统提出采用Redis技术提高系统的性能。

Lumen框架支持当前流行的缓存后端,可以为各种不同的缓存系统提供统一的API,如Memcached和Redis。本系统选用Redis内存数据库解决高并发问题。

Redis的配置步骤

(1) 安装Redis

(2) 通过Composer安装predis/predis

(3) 在wmsvendorlaravellumen-frameworkconfigdatabase.php文件中添加redis设置:

'redis' => [

'cluster' => false,

'default' => [

'host' => '127.0.0.1',

'port' => 6379,

'database' => 0,

]

如果redis和web服务器不是同一台机器,需要更改IP和相应端口。

在Lumen框架中配置Redis缓存,Mysql数据库中保存队列信息的jobs表中的数据就会存储在Redis内存数据库中,对销售单信息的写入和读取就在内存上进行,以保证高并发状态下,系统的实时性和有效性。

4 结语

本研究所设计的系统具有三大特点:本系统实现了API接口开发,只要按照接口文档接收和发送数据,就可以和任意第三方平台进行对接,从而有效降低开发成本。平台具有较强的通用性,具有广阔的应用前景。本系统采用基于JWT的Token认证机制实现用户和服务器之间的信息传递。一旦用户完成了登录,服务端只需生成token,客户端保存这个token,每次请求携带这个token,服务端认证解析即可。这种方式不需要在服务端保存会话信息,缓解服务器压力,易于应用的扩展。本系统基于Lumen队列和Redis缓存技术处理出库订单,系统在接到第三方销售单验证通过后,立即返回用户“待审核”状态,并同将销售单信息存入队列等待处理,该策略将出库队列的写入和读取放在Redis内存数据库中进行,减少了程序读写MySQL数据库的次数,提高了运行速度。同时,使用队列单线程处理销售订单,修改库存信息,确保了数据的一致性。

猜你喜欢

出库队列库存
乌克兰谷物和油料作物库存远低于2020年同期
乌克兰谷物和油料作物库存远低于2020年同期
配方高架库空箱出库程序的优化设计与应用
队列队形体育教案
队列里的小秘密
基于多队列切换的SDN拥塞控制*
在队列里
房地产去库存中的金融支持探究
优化拍卖出库流程控制防范拍卖出库环节财务风险
报文数据分析法在立体库故障分析中的应用