分布式、服务化的 ERP 系统架构设计

初稿出处: 刘彻   

和另外安全设备一样,RFID设备的安全性并不健全。固然RFID设备获得了大面积的运用,但其带来的四平威逼需要我们在装置配备前化解。本文将根本介绍多少个RFID相关的平安题材。

ERP之痛

图片 1

曾几几时,我混迹于电商、珠宝行业4年多,为这两个行业开发过两套大型业务连串(ERP)。作为一个ERP系统,系统首要效率模块无非是订单管理、商品管理、生产采购、仓库管理、物流管理、财务管理等等。作为一个管理系列,我们的形似开发习惯就是使用.Net或Java技术,建立一个单块(单进程)架构的行使,唯有一个SQLServer或MySql数据库。然后在档次文件中分一下梯次模块,三层社团格局社团代码编写开发。最后测试,交付上线。

1.RFID伪造

起头,因为数据量不大,系统特性还不错,各类列表查询,报表查询,Excel数据导出功效等用的都很流畅。不过随着集团事务发展,订单量日积月累,前期各样业务部门的表格查询、数据导出需求不断追加,大家逐步就感觉系统运行更加慢。于是我们或许首先想到的缓解方案就是,优化系统瓶颈数据库这些大头。大家恐怕的一种尝试就是将数据库单独放置到一个服务器,实现数据库和应用程序分离,或者是建立各类数据库表索引,优化程序代码等办法。经过如此一番研讨优化,系统某些成效可能性能的确大大提高,不过大家仍然察觉一些职能列表的数量查询导出仍然很慢,或者趁着数据量继续积累,原来较快的列表导出效率,也越发变得放缓了。我们用尽各个办法,最后也达不到可以的类别性能速度。

基于总计能力,RFID可以分为三类:

为了提升系统性能,大家或许会积极学习有些互联网商家的技能经验,什么高并发、高性能、大数额、读写分离等方案,发现自己根本不许出手。大家会以为因为系统工作特色不相同。ERP系统并发量不高,首假如工作复杂,各样事务耦合度远不止那一个互联网应用,不佳做拆分,数据查询逻辑要远比互联网系统错综复杂,一个列表页查询出来的多少,往往需要关联4、5张表才能获取结果。有些报表类的甚至更多。加上各样事情操作事务性、数据一致性要求很高,很多时候造成大家措不及手,无法进一步优化系统。

1.家常标签(tag)

曾几什么时候,我也被这么或这样的理由所挫败,认为ERP系统丰裕特别,无药可救,不过后来。。。

2.应用对称密钥的价签

本人明天已经不这么觉得了,似乎有了新的化解方案O(∩_∩)O哈哈~

3.运用非对称密钥的标签

曙光乍现

内部,普通标签不做任何加密操作,很容易举行伪造。但普通标签却广泛应用在物流管理和旅游业中,攻击者可以轻易将信息写入一张空白的RFID标签中或者涂改一张现有的价签,以赢得使用RFID标签举办表明类别对应的走访权限。对于普通标签攻击者可以展开如下三件事:

在讲述具体方案前,先说下团结的想法。我先是觉得我们做ERP系统前,就得有当今互联网思维。大家不用再去做一个大一统的序列了。我们要分拆一个明斯克串,做成一个个小系统。然后通过系统接口让这个小系统相互通信。这样来组合一个大系统,具体来说就是“分布式”、“服务化”的互联网思维。让系统在架构设计上就是一个自发帮助中度可扩大的连串。

1.修改现有标签中的数据,使一张无效标签变为有效的,或者相反,将实惠的标签变为无效。例如,能够由此改动商品的竹签内容,然后以一个较低的价钱购入一件高昂的商品。

怎么办吗?具体来说就是要将订单管理、商品管理、生产采购、仓库管理、物流管理、财务管理拆分成一个身长系统。这一个子系统可以单独设计开发,对外显露出各个其他子系统要求的数码接口即可。每个子系统都有独立的数据库。甚至那些子系统能够交由不同的团伙去开发和维护,使用不同的技术系统,使用不同的数据库。而不是再像在此以前那么,都合并在同一个大而全的系统中,一个大而全的数据库。

2.一律如故修改标签,不过是将一个标签内容改动为另一个标签的情节,就是狸猫换太子。

对此新架设的系统他有什么长处呢?

3.依照取得到的别人标签内容来制作一张自己的竹签。

第一,也是最要害的就是化解系统的性质问题。以往数据库实例只有一个,没法扩张出五个实例,以便在性质受限的情事下依靠扩充数据库实例来达成负载均衡。也许有人会说可以接纳读写分离方案,不过因为ERP系统的性状,那些方案很多时候不具体。比如说操作库存的时候,你不可能从读库里读库存,然后在写库里写入库存。因为主从复制会有时效性,写入的库存并不可以即时写入从库。这样的气象在ERP中也有多处。何况写库不可以扩充,只可以有一个。而新设计方案是写库是分开的,每个子系统有谈得来的数据库。

从而,当想在一部分处理如身份证这种富含敏感消息的体系中动用RFID标签时,一定要使用加密技术。但即使不得不选取普通标签的话,一定要保管配有对应的资阳专业、监控和审计程序,以检测RFID系统中其他的要命行为。

说不上,就是翻新卓殊便利,各个子系统今后台微服务的措施存在。前台一个单独的web项目,那多少个web项目调用后台这一个子系统的服务接口。这样的计划性,在某个业务子系统需要更新的时候,可以独自更新。不用像从前这种单进程架构时,一个小更新需要所有系统重启,导致用户会话也不见,用户需要新报到。如今日的这种计划就不会有其一题目。

2.RFID嗅探

系统完整设计

RFID嗅探是RFID系统中一个要害的问题。RFID阅读器总是向标签发送请求认证的信息,当阅读器收到标签发送的验证消息时,它会选用后端数据库验证标签认证音讯的合法性。但不幸的是,大部分的RFID标签并不表明RFID阅读器的合法性。那么攻击者可以行使自己的阅读器去套取标签的始末。

系统物理部署视图

3.跟踪

图片 2

经过读取标签上的内容,攻击者能够跟踪一个对象或人的移动轨迹。当一个标签进入到了阅读器可读取的限量内时,阅读器能够分辨标签并记下下标签当前的岗位。无论是否对标签和阅读器之间的通信进行了加密,都不能避开标签被追踪的事实。攻击者可以动用移动机器人来跟踪标签的岗位。

详见计划

4.拒绝服务

   拆分应用层

当阅读器收到来自竹签的求证音讯时,它会将表达音信与后端数据库内的信息举办比对。阅读器和后端数据库都很容易遭逢拒绝服务攻击。当出现拒绝服务攻击时,阅读器将不可以做到对标签的验证,并导致其他相应服务的中止。所以,必须保证阅读器和后端数据库之间有相应防范拒绝服务攻击的建制。

拆分应用层,是践行“微服务”架构的看法。将原先大而全的单进程架构按照业务模块拆分成可独立布置的应用程序,以此来达成平滑系统改进、升级、方便负载扩充的目标。具体来说,技术上得以选择restfull风格的接口,也足以运用像java中dubbo框架格局来简化开发复杂度。ERPWeb端或另外活动端也是一个单身的运用充当表现层。分外薄,只是简单的接受参数,调取后台其他各个微服务程序的接口获取所需出示的多少。微服务充当业务逻辑层,每个微服务都是可独立布置上线的次序,对外提供数据访问接口。

5.欺骗

微服务可以选取流行的各样RPC框架,比如dubbo,能够协理多种调用协议Http、TCP等,这么些框架使得编码比较便于,框架封装底层数据通信细节,使得客户端执行长途方法如同执行本地点法同样简单。

在欺诈攻击中,攻击中不时将团结伪造成为一个官方的用户。有时,攻击者会把团结伪造成后端数据库的总指挥,假诺伪造成功,那么攻击者就可以无限制的做任何事,例如:相应无效的伸手,更改RFID标识,拒绝正常的服务或者干脆直接在系统中植入恶意代码。

dubbo微服务架构,还协理服务治理,负载均衡等功效。这样不光可以增强系统的可用性,还是能动态升级系统应用层的属性。比如仓库管理中入库工作相当费劲,占用分外多的CPU和内存资源,我们得以另外加一台机器,单独再安排一个储藏室管理服务上来。这样使得整个体系,有四个仓库管理服务在同时工作,平衡负载。而这一切都是在劳务注册中心,比如Zookeeper下自动完成的。

6.否认

微服务结构,天生很好的帮忙系统更新提高操作。比如财务模块有个新要求需要上线,我们只需要替换财务模块的服务重启即可。这对已经报到连串的用户来说,没有稍微影响,不用再行登陆系统,其他模块服务应用也不受影响。

所谓否认就是当一个用户在开展了某个操作后拒绝认可他曾做过,当否认发送时,系统尚未主意可以表明该用户到底有没有进展那项操作。在采纳RFID中,存在二种可能的否定:一种是发送者或接收者可能否认举行过一项操作,如暴发一个RFID请求,此时我们没任何凭证可以评释发送者或接收者是否爆发过RFID请求;另一种是数据库的拥有者可能否认他们予以过某件物品或人其他标签。

    拆分数据层

7.插入攻击

数据库瓶颈是ERP系统的世代之伤。大量错综复杂的数额查询表连接逻辑充斥着漫天系统。数据库垂直拆分成功的首要就是怎么重新设计系统数据层各种模块相互耦合的题材。能迎刃而解这多少个题目,永久之伤便足以解决了。

在这种攻击中,攻击者试图向RFID系统发送一段系统命令而不是原先好端端的多寡内容。一个最简便的例子就是,攻击者将攻击命令插入到标签存储的常规数据中。

我们先来看一个超人数据层模块耦合问题。需求是显得物料库存,列表字段:物料编号、物料名称、品类、仓库、数量

8.重传攻击

物料表:

攻击者通过截获标签与阅读器之间的通信,记录下标签对阅读器认证请求的东山再起新闻,并在此后将这一个信息重传给阅读器。重传攻击的一个例证就是,攻击者记录下标签和阅读器之间用于注脚的消息。

物料ID 名称 品类ID
Z0001 Iphone6红色手机壳 Z
Z0002 iPhone6黑色手机壳 Z

9.物理攻击

库存表:

物理攻击发送在攻击者可以在物理上接触到标签并篡改标签的音讯。物理攻击有多种艺术,例如:使用微探针读取修改标签内容,使用X射线或者其他射线去破坏标签内容,使用电磁烦扰破坏标签与阅读器之间的通信。

物料ID 仓库ID 数量
Z0001 W1 10
Z0002 W1 20

此外,任何人都得以肆意的应用小刀或此外工具人为的毁坏标签,这样阅读器就无法甄别标签了。

品种和仓库表省略。。。

10.病毒

很扎眼,传统一个数据库中,大家只需要简单的join操作,即可关联这两张表,外加关联品类和储藏室表即可查询出咱们所要的数码。可是现在我们的架构中,物料表和商品表不在同一个数据库实例中,我们无法运用join操作了,这我们该怎么实现需求呢?

同其他信息体系一样,RFID系统很容易遭受病毒的口诛笔伐。多数境况下,病毒的对象都是后端数据库。
RFID病毒可以毁掉或泄漏后端数据库中存储的价签内容,拒绝或困扰阅读器与后端数据库之间的通信。为了爱慕后端数据库,一定要顿时修补数据库漏洞和其它风险。

新的架构,只允许大家透过对方的服务接口来获取数据,不可以平昔关乎对方服务的私家数据库。至少从架构上,服务化角度来说不可以平昔访问对方服务的数据库。这种场合下,假若web模块子系统调用仓库子系统来获取数据,则我们需要在仓库模块中创设一个service方法来装配这么些多少。然后回来给web子系统。如下图所示,仓库管理格局首先获得当地库存表的物品编码、和储藏室表的仓库名称字段音信,并且分页完后最后准备回来20条数据到Web模块前,将这20条数据中的物料ID作为参数请求商品模块子系统,商品子系统再次来到这20个物料ID相关的商品信息给到库房管理模块,然后仓库管理模块重新组建上列表所需的物品名称和品种七个字段数据,实现最后要回来给Web子系统的数据。

即使如此RFID系统不时变成被口诛笔伐的靶子,不过由于RFID系统低廉的资金,使得其在众多领域依然拿到了广泛的利用。所以当准备安排RFID系统时,一定要更多的关心其安全题材,特别是本文描述的前四种攻击:伪造、嗅探、跟踪和拒绝服务攻击。

图片 3

也许你会说,这太辛劳了,这种办法的特性肯定没有直接join来的高,解决不了性能问题。咋看起来好像是这么回事,但是仔细考虑看看,在系统并发量低、数据量小、业务不算繁忙的条件下,的确性能还不如传统一个数码中join情势来的迅速。但大家考虑将来吧!我们现在的架构设计是将一个数据库拆成三个数据库,每个数据库可以运作在单身的服务器上去,这样未来就能负载数据库的下压力了。全体来说这样才能不会让数据库成为将来业务繁忙时候的特性瓶颈了。想想皆以为令人兴奋不已,是不是?

此时有人又会问,这之后系统数据量、业务更大了,连你这多少个拆分成多少个数据库还不够用如何做吧?我的办法是,可以依据拆分的数据库,单独每个库可以做读写分离、使用缓存等。甚至足以继承拆分下去,将子系统再次拆分成三个儿子系统。视工作模块繁忙程度而定。

报表系统

有人又会问,有些列表查询逻辑极度复杂,关联十多张表,假若按上述办法拆分数据,这简直是不幸啊!是的,你说的尚未错。这种景象下自家的方案是将那种越来越错综复杂的表格级其余多少查询突显需求,可以独自做个表格系统。报表数据库设计使用数据仓库形式。为了更高的读取性能,大家得以将数据库表设计成很多冗余字段形式也就是反范式设计,以及建立分外多的组合索引。

这种系统成功的根本就是数码和主ERP系统工作库的联手问题了。一般可以写一个定时同步程序,将ERP主业务系统的数码通过帅选、转化等情势一向生成报表视图所需的最后或中等数据,简化关联查询。报表系统也足以接纳微服务架构设计。如下图所示:

图片 4

假若报表所需的数目要求实时的,大家得以让ERP系统业务操作时,触发同步数据的乞请,实时同步至报表库。

分布式事务

唯恐有人又又问了,ERP系统广大操作都要求事务性,你拆分系统后怎么落实事务性,保障数据一致性呢?

其一题目很好,也是本人控制写这篇随笔前考虑的终极一个题材。在微服务架构中,实现夸服务的作业并不容易,至少不像当地使用使用当地数据库事务这样方便,性能高效,数据一致性好。

莫不你听过分布式事务这多少个概念。有两种现象,一种是一个施用中运用多少个数据库,为维持数据一致性,需要采用分布式事务。还有一种情形就是本着大家这么些架构而言的。微服务环境下的分布式事务,具体来说打个假设。采购入库那个操作设计在库房管理服务中。入库后,需要革新采购子系统中的采购单中的入库数量。那么些进程要求数据一致性,也就是采购单入库成功后写入了库存表中的数量,同时要更新采购单表中的入库数量。我们不可能一向在仓房服务中去拜访采购服务中的数据库,必须透过买进服务提供的劳动接口才行。假诺这样,我们怎么能保证数据一致性呢?因为很有可能库存表写入成功,但调取采购服务写入采购单数据时失利了。可能是网络问题由来促成的,这样数据就不一致了。

在分布式事务技术中,有落实最后一致性这么一说,意思就是假设自己能保证两边数据最终落实了一致性就行,不自然要选用工作。这样说来就有方案了。如仓库子系统在拍卖采购入库时需要充实入库单数据和翻新库存数据等三个表。这三个表都在仓库子系统中,我们得以选拔一个本地工作来担保仓库子系统中的表数据一致性。然后调用采购子系统立异采购单里的入库数量。为了以防万一那些过程突然中断导致调用失败,大家考虑扩张一个信息队列中间件如ActiveMQ。即便接口重回失败大家就往MQ里写入这一个处理请求,等到采购子系统復苏正常后,MQ通告采购子系统处理这一个革新操作。由于新闻消费掉未来不会再有打招呼了,采购子系统处理过程中发生相当导致改进战败,需要将问题写入本地的日志库,以便布告管理员做继续补偿处理。就如此经过各个措施来达成数据的尾声一致性即可。即便听上去有点坑,但这就是解决方案。没有任何更好的了。或者更新败北后再次调用仓库子系统回滚入库单和库存数据,达到最终一致性!如图所示:

图片 5

不行幸运能和豪门一块享受文化和经验,正是由于大家的忘我分享,才让大家得以成长和升华,我近期几年来都很少分享东西,有时候是因为做事很忙没有时间写点东西,有时候也是因为自己懒或是没有什么样新东西得以享受给我们的。最终也冀望我们对自身的享用不足之处给予批评指正,一起前行!

1 赞 4 收藏 3
评论

Leave a Comment.