本文基于黄浩在珠三角技术沙龙深圳会场2011-12-04的技术分享,版权归于黄浩和珠三角技术沙龙,如需转载,
请联系
珠三角技术沙龙:www.techparty.org
关于该分享的PPT和录音,请参考
概要
电子商务系统的用户界面有比较浓厚的互联网应用色彩,所以很多系统大多采用类似于互联网网站的设计方法和设计理念,在架构设计、技术理念乃至系统运营层面,电子商务系统与企业系统往往是相互独立甚至异构,非常容易形成信息孤岛。从企业级系统的角度,结合一定的互联网技术特点,开发设计电子商务系统,能够有效地避免。本次分享主要就电子商务系统的平台设计、中间件产品的合理运用,充分利用架构设计提升电子商务系统的高可用性及扩展集成柔性等方面,提供全新的设计思路。
个人简介
黄浩,资深Java专家及企业级应用系统架构师,中山大学MPM,ITEye资深会员,原OOCL珠海ISD资深JEE专家,现就职于深圳金蝶中间件,担任实施服务部总体架构师,核心技术团队成员。在中间件的企业级应用、企业级系统架构设计、中间件与业务基础件、基础框架的设计开发上有比较丰富的经验。负责设计的北方国际电子交易平台项目被中国SOA标准组织评为2010年十大SOA优秀成功解决方案。现主要负责企业电子商务化、企业系统集成与整合平台化的解决方案、技术咨询与总体架构设计工作。
演讲内容
- 企业电子商务系统和互联网电子商务系统的异同
- 基于中间件(金蝶,oracle,apache,jboss)构建一个电子商务系统
- 中间件技术的应用实践
- 其他中间件,关于云计算,带来另外一个角度的云计算的思考
电子商务简介
互联网型的电子商务包括以下特点
- 基于长尾理论,针对个体消费者。
- 在线协作平台,互联网公司不需要考虑其自身供应链的关系,其自身提供平台给供应商和消费者使用。
- 关注用户体验,针对个体消费。
企业化电子商务(苏宁易购,南航电子商务系统,dell电子商务等公司的电子商务)特点
- 其本身是企业信息化的一个部分,基于企业自身的信息化系统
- 供应链集成,需要考虑到自身的上下游,包括供应商,分销商,物流商
- 其业务流程的价值,不仅仅关注一次销售,而且更关注整个业务流程如何缩短和优化
电子商务系统构成
- 会员系统
- 客服系统
- 监控系统
- 应用相关接口
- 辅助子系统(大数据分析,数据挖掘子系统)
传统企业在实施电子商务所面临的主要有四个问题
- 缺乏向互联网运作的成熟的技术团队(成熟的团队一般都在大型互联网公司)
- 大家比较显而易见的电子商务网站的UI,而并不清晰其真正实现的基础架构
- 难以解决企业系统的协同交互
- 缺乏成熟可复用的技术方案
电子商务系统的一些技术特点
应用场景层面
- 电子商务系统相对传统网站,有着显著的对数据实时比较高的要求,同时要求一部分的一致性
- 受制于企业系统的约束,比如支付方面受制于事务方面的影响,保证其可靠性。
- 可能有海量的非事务性访问,电子商务网站有大量的人去访问搜索,需要大量的查询和展现,有一定规模的事务性访问,
- 具有一些互联网系统的特点,
- 其本身具有一些企业系统的特点
技术架构层面
- 电子商务很关注数据的mashup(揉合),比如去哪儿网,把很多信息的整合
- 关系型数据库的性能,(水平分割,垂直分割,NoSql和传统关系型数据库的结合),
- 同时可能有不同的架构思路(偏企业系统方向,偏互联网方向)
- 分布式部署
- 事务缓存机制,事务迁移,事务恢复,事务的批量处理,去面对大负载的压力
- 严格的安全机制,使用HTTPS,或者数字证书(在线支付)
基于中间件构建电子商务系统
传统电子商务技术
页面展示方面
- LAMP方案
- 模板技术,velocity
- 动态内容静态化,将内容生成静态HTML页面,yahoo的23个web优化建议
系统集成方面
- 大多使用Rest风格纯http交互
- WebService(amazon,ebay)
- Json,XML(weibo,淘宝,阿里巴巴)
- 采用Base64,base128码传递二进制数据进行交
- 特殊报文传输(google的ProtocolBuffer)
- 简单地基于web的集成
- 与支付系统(包括银行,第三方支付系统,通过页面跳转,与银行系统交互,并接受回调来实现)
持久化存储方向
- 结合关系型数据库,并利用NoSQL进行优化
- Mysql集群+NOsql缓存
- 对持久化数据进行垂直或者横向切分
- 非结构化的信息存储
- 比如订单、挂单,等直接以文件的方式存储,文件添加索引来实现查询,
- 使用简单事务,甚至原始事务,放弃复杂事务。
-
基本放弃orm,比如使用ibatis
- 基本放弃了基于数据库的内容检索
- 使用基于索引文件的内容搜索
- – 比如使用hibernate-lucene对实体生成索引文件
- – 比如定时对数据库内容进行基于Lucene的索引生成
主要的问题
- 缺乏独立的软件机器技术方案提供
- 几乎所有的方案来自于电子商务企业内部(当当,京东,淘宝,都有独自的技术解决方案)
- 技术方案缺乏共性,差异性比较大
- 几乎都偏向于互联网应用层面
- 大多数关注web, 更加关注web层面,忽视了基础架构层
- 与企业系统隔离,在架构、技术以及业务各个层面缺乏与企业系统的互通在架构、技术以及业务各个层面缺乏与企业系统的互通
基于中间件技术构建电子商务系统
优势
- 从系统架构的角度看待电子商务系统的建设,而非传统的人机交互层面。给技术人员一个全新的思考
- 在处理系统集成层面有先天的优势,而企业系统与电子商务系统的无缝整合是企业化电子商务系统最为关键的一环
不善于
- 无法构建电子商务网站,尤其是人机交互的用户体验,页面展现等,需要大量结合运用互联网技术。
- 在电子商务的业务领域,比如依赖分析、行为意向分析、定向推荐,所数据挖掘等,中间本身无法实现,需要技术人员设计实现
全新的视角
中间件技术的技术堆栈

软件架构框架层
1 网络层
2 操作系统/硬件服务器层/硬储存设备
4 基础架构技术层
- 应用服务器
- MQ(消息队列)
- 云计算平台
- 分布式计算框架(EJB,Hadoop)
- 内存数据库(Oracle‘s TimesTen)
- 缓存(Memcache)
4 应用架构层
- 数据ETL(Extract-Transform-load),即数据抽取、转换、装载
- 企业服务总线ESB
- 安全认证
- 单点登录(SSO)
5 业务架构层
- 业务流程 BPM/BPEL
- Web服务
- 数据建模、业务建模
- 数据挖掘和商业智能(DM&BI)
6 表现层
- 基于portlet的门户技术
- 内容管理 CMS
- web开发框架
监控与治理
- 系统监控管理工具
- 服务治理工具
基于中间件的企业电子商务系统架构
基于中间件的电子商务系统物理部署架构
1.DMZ的网络隔离
包含两个缓存中间件,针对web的缓存中间件和针对应用的缓存中间件
2.消息中间件,集成中间件来与外部系统通过互联网实现集成应用
中间件技术的实践
案例:
卖家家上网挂单,录入挂单后,提交给服务器,服务器保存挂单到数据库,生成静态的HTML缓存,生成索引来方便查询。
问题:
当有批量的用户来向服务器来提交订单,可能造成服务器宕机
方案:
使用MQ消息中间件,通过异步来实现负载均衡,通过JMS和MQ把消息分发到不同的web服务器,来实现业务的负载均衡
技术运用:
通过多个Consumer机制,实现消息的负载处理
• 其原理类似于生产-消费线程(并不是所有MQ都支持)
• 可以有效应对瞬间大批量订单,降低DoS攻击的影响。
• 通过负载均衡,可以确保重点客户的订单处理
– 设计多个处理队列,将重点客户的订单发送至特定的队列,从而确保处理的高效和优先级。
– 实现服务质量等级差
基于队列的消息处理
• 可以采用单队列-多消费者模式,也可以采用多队列-多消费者模式
– 避免单个队列有过多的消费者,否则消息分发本身将耗费太多资源
• 可以根据订单类型、地域来设置消费者和消息队列
• 通过消息的优先级设置优化处理
– 通过MQ的优先级机制,以及Consumer顺序实现部分订单优先处理
相关建议
避免业务操作所产生消息的先后约束性
• 具有先后顺序约束关系的操作可以利用有序消息
– 不是所有MQ都支持,并且会弱化MQ的负载均衡作用
业务场景
使用MQ,将实时存储和处理订单改为异步处理
• 应用前提是订单的存储和处理能力远小于HTTP请求。
秒杀、竞价、限时抢购等一系列瞬时大量业务操作
• 避免瞬时过大的并发访问导致网站崩溃
![]()
![]()
方案:
使用MQ消息中间件,实现串行化并发操作
技术运用:
同负载均衡相反,主要是通过MQ消除并发冲突
为处理队列只设置一个消费者
• 相当于分布式系统环境下的单实例模式
• 只设置一个队列、一个消费
相关建议
仅当处理操作不支持并发操作时才考虑
考虑增加消息过滤及消息合并,避免重复操作消
业务场景
更新基于Lucene的索引文件
• Lucene更新文件索引需要对文件生成写锁
– 将索引同步生成改为发送消息给MQ,然后统一先后处理索引生成,避免出现同步锁而索引更新失败的情况。
动态更新配置文件信息时
• 更新配置文件产生的写锁冲突
• 生成动态词库时产生的写锁冲突
![]()
方案:
使用MQ消息中间件,实现延迟并缓冲的操作 (实现系统buffer)
技术运用:
利用MQ的消息存储空间实现操作及访问的缓冲
• 一般来说,MQ的消息存储空间可以达到100,000+*
• 一般来说,MQ的吞吐量可以达到10,000+消息/秒*
• *:网络带宽和消息本身大小及消息持久化与否会决定具体量值
实现跨系统应用间的分布式缓冲结构
• 平衡各个应用子系统的负载压力
• 化波峰为波谷,平衡不同时间段的负载压力
• 合理设置MQ的相关配置
– 牺牲可靠性,提高吞吐能力(>1,000,000+条消息/秒)
– 结合中央式缓存,提高缓冲空
不立即处理提交的请求,通过MQ缓冲
• 当消息积累到一定数量或者延时,进行消费
– 消费者采用主动消费和基于监听器(MessageListener)的方式相结合
• 消费者消费时取出所有消息,对消息进行合并处理
– 将重复的消息进行过滤
– 在业务层面进行定制,对无效的操作(比如执行、取消)进行丢
业务场景
用户修改信息导致需要频繁地通知或发布事件
• 会员修改门店,重新反复生成门店静态网页内容
– 当然可以使用延迟动态装载+缓存的方式避免这个问题
• 应用场景
操作上下文创建的代销占操作较大比重时
• 频繁地写IO,写入数据库,初始化、关闭资源的代销较大
– 通过Buffer实现批量的写入
• 主要是跨应用节点的行为,比如发邮件、发短信、协同处理等
需要延迟进行的操作
• 当在管理控制平台修改相关规则后,需要延迟定时更新
– 将规则修改后数据同步消息放在Buffer队列中,通过定时消费者进行处理
跨系统事件通知机制
• 事件及时并发处理能力远小于事件分发能力与事件数量
![]()
![]()
方案:
数据ETL-跨系统间的数据同步
技术运用:
利用数据库的改动实现数据间的增量变更Delta Change
• 利用数据库自带的闪回机制
– Oracle的flashback, SQL Server的snapshot机制
• 设计中间存储表
– 针对不支持闪回的数据库,进行定期的更新
• 将数据库变动转为DML脚本
通过前置机的API方式,传递系统数据
• 如通过Spring的事件机制或ORM插件,将数据变动通过API调用传入前置机,再转换成统一格式。
数据格式与数据通信协议
• 跨网络间通信可以考虑使用MQ
• 数据格式可以考虑SDO,或其他文本格式(如JSON、XML)、二进制数据格式(如Protobuf
相关建议
不应使用基于触发器的方式
尽量不要对业务操作数据进行同步,会带来严重性能影响
大规模数据同步,考虑使用数据库工具
• Microsoft DTS/Oracle Stream 复制/MySQL Replication
业务场景
实现库存数据的实时同步
• 当传统渠道销售商品后,通过ETL更新电子商务挂单数量
• 避免电子商务系统与其他系统之间出现的数据不一致情况
实现商品目录等基础数据的同步
• 确保电子商务系统中的编码、名称能与企业系统一致
• 可以考虑使用MDM实现,但实质上,ETL是MDM的重要组成部分

![]()
方案:
ESB 服务总线 -实现分布式应用集成
技术原理
接入适配/数据、协议转换/事件通知/服务管理
同步/异步:Web Service/ JMS
技术运用
通过ESB提供的服务接入屏蔽各个系统间的分布式差异
• 应用程序通过ESB获取其他应用功能的信息并调用
通过ESB提供的服务封装屏蔽系统间的技术架构差异
• ESB服务封装方式因产品而异
– 基于SCA的服务封装和基于SDO的数据封装
– 基于RMI(Java对象序列化)的数据访问
– 基于WebService的服务的封装
– 基于MQ消息的封装
• 定制化实现与其他开源分布式协议的兼容
– 比如:Hessian、Protobuf 分布式通信的对象序列化及接口封装支持
• 相比起传统基于RMI分布式调用,可以实现多种调用方式
– 同步调用、异步单向调用、异步双向调用等
– 能够更为有效地接入企业不同的应用系统
相关建议
在ESB基础上定制实现分布式调用框架
• 屏蔽对ESB本身的调用,避免业务逻辑与ESB间的耦合
• 屏蔽中间信息(服务、数据)格式,生成POJO对象和基本API接口
定制开发应用开发框架
• 扩展Spring,在传统开发框架上支持分布式调用框架
• 避免系统内应用服务调用通过ESB中转,对性能有严重影响
业务应用场景
跨应用系统流程接入
• 比如: 电子商务下单->预留库存->生成财务应收账单
实现B2B银行支付
• 新的支付模式,如预付冻结、支付解冻等操作
技术运用
利用SOA架构思想,将整个电子商务系统服务体系化
• 对系统内部,梳理子系统、模块间的关系,解耦应用
• 对系统外部,定义服务接口,实现服务的接入和输出
服务接口的规范与协议
• 采用自描述的服务描述
– 使用标准化Web服务,通过XML Schema来描述服务数据标准
• 在现有Pojo的基础上,增加其他方式的适配
– Hessian,Json, 以及REST风格XML
• 结合MQ,实现异步服务处理机制,提高服务能力
通过ESB管理并监控服务
• 服务的注册、获取、版本管理等
• 了解服务的质量、服务的响应时间、出错率等等
• 实现服务的流量控制
相关建议
关注内部分布式通信与外部服务接入异同
• 合理考虑使用分布式通信协议
– 包括WebService, Hessian
• 服务元数据的自解释
• 多客户端支持
– Web客户端语言
– 企业应用语言
• 性能
– 基于HTTP的文本型服务输出应考虑支持Gzip压缩
• 上下文安全性
– WS-Security
– Token技术:比如淘宝平台使用的SessionKey(<255位)
定制开发服务监控及治理平台
业务应用场景
内部子系统SOA架构的梳理
• 将部分业务功能服务化,比如结算支付、基础框架功能、合同处理等
实现非Web化的系统访问
• 支持非Web化的电子商务订单
– 方便会员企业系统的对接,提供EDI/EbXML多种订单处理方式
• 移动客户端的接入
– 确保系统的处理逻辑与web操作间实现松耦合。
构建服务平台
• 将电子商务系统的服务发布给客户或第三方,实现平台的增值
– 实现业务逻辑层面的重用,支持移动客户端访问
• 对重要的接口和环节进行定义,实现第三方服务接入
– 可以对接入、输出的服务响应时间、服务质量进行监控和统计分析
方案
业务流程–定制灵活的交易流程
技术运用
通过工作流机制,将业务逻辑节点解耦
• 将电子商务的交易过程分解成多个步骤,从而灵活交易模式
• 将业务模块进行水平解耦,将系统分解成多个子系统,并通过工作流机制实现子系统间的相互业务衔接
利用流程定义工具来定制交易流程
• 基于WFMC的工作流,适合单个系统内部流程
• BPEL/BPMN,适合跨系统间组织的业务流程
相关建议
对于只涉及单个系统内部的流程最好不使用BPEL/BPMN
对于简单或者几乎标准化的交易过程,可以考虑固化封装流程
业务应用场景
针对企业电子商务(B2B)的交易流程
• 交易流程会在普通消费型电子交易流程上增加不同的环节和节点
– 合同处理:增加合同创建、变更、签章、法律认证等环节
– 支付方式:增加预付定金、分期付款、收验发票等环节
– 企业管控:增加订单审核、财务审批等多个操作环节。
在传统交易方式上变更的多种交易模式
• 竞价购买、竞拍购买
需要灵活定制的结算和订单处理规则
• 促销及优惠规则:包括折扣、返券、优惠等多种形式
• 下单规则:团购、秒杀、同行提货等
方案
分布式缓存-构建中央数据缓存
技术运用
将各个节点的缓存独立出来,使用专用缓存构建中心星状的分布式缓存应用
• 避免整个网络拓扑中节点间相互通信造成的网络堵塞
– 当web应用节点增多,服务器间通信将大大占据网络带宽
• 实现应用节点的柔性横向扩展
• 缓存节点本身可以进行负载均衡
合理设置缓存服务器之间通信
• Web缓存与应用缓存间的数据同步
• 缓存的失效机制及刷新处理
相关建议
为避免缓存宕机引发的数据灾难,缓存需要实现热备份
• 对于关键性的缓存数据,需要考虑持久化备份
尽量避免有状态信息数据的缓存
• 有状态信息数据一般无法被及时flush掉
• 极大规模应用时,异常情况下有状态数据的恢复容易造成灾难
当web应用节点过多时,考虑进行分隔处理
• 建立多个星状的缓存通信网络,彼此间相对独立
• Web缓存与应用缓存间的同步处理
– 比如Session中央缓存与后期数据数据缓存间的关系处理
应用场景
将Http Session存储在中央缓存上
• 避免应用节点之间的Session的复制和同步
• 减少每个应用节点的资源占用,并实现session的快速恢复
• 依赖于应用服务器的机制,有的服务器在本地依旧会保存当前节点创建的所有Session,而有的服务器只缓存一定数量的Session
将Web组件的ViewState存储在中央缓存上
• 减少web应用节点对于ViewState的存储
• 存储的Key包括ViewState的id和JsessionId
将数据持久访问层的对象查询放在中央缓存上
• 将中央缓存作为ORM的二级缓存
将MQ服务端的消息临时存储在缓存上
• 当瞬间非持久化消息量过大,存储在缓存上避免拒绝服务
• 帮助实现MQ负载均衡节点间的数据切换
技术运用
将同步性的数据库事务变为异步性的事务操作
• 降低事务锁冲突带来的访问瓶颈
• 减少并发的事务量,降低数据库的瓶颈
• 利用波峰波谷原理,将部分事务延迟到系统闲时提交
利用内存数据库存储事务操作的上下文
• 利用ORM的原理,存储原始对象、修改对象及执行顺序
– 便于提交、回滚事务
– 提交时包括prepare和commit两个操作
存储临时性的事务状态
• 避免频繁地事务补偿带来的代销
事务缓存与消息延迟处理的区别
• 前者的执行有依赖性,并直接写入持久性存储
• 前者是一系列操作,并需要保证原子
相关建议
内存数据库节点的崩溃会导致事务数据丢失
• 需要平衡事务缓存与事务日志
事务缓存后操作成功与失败对电子商务系统的反馈机制
• 事务缓存后写入持久性存储的操作可能会出现失败
– 处理逻辑可以视为失败消息的延迟获取,而非事务的延迟提交
• 事务失败续写:利用事务日志,再次写入持久性存储
• 事务补偿机制(两个银行转账,必须保持一致)
需要考虑事务缓存的数据与数据库数据一致性问题
• 事务缓存不能代替传统事务处理,只能作为性能优化的考虑
• 对于一致性要求严谨的数据操作,建议不要考虑事务缓
业务应用场景
事务缓存与异步处理逻辑的区别
• 对于业务来说,事务提交是完成的,只是物理上没有写入持久性存储。
不需要同步得到反馈的事务应用
• 某些信息修改,会员资料认证、会员信息等。
• 订单修改
临时性的事务中间状态
• 比如限时结算支付的订单
• 比如已经提交其他系统处理等待反馈的数据(如提交支付的订单,提交审批的合同)
WEB开发框架-基于组件的web开发
技术运用
借助基于组件的开发框架实现组件重用
• 包括服务端和客户端可重用Widget
– 服务端:JSF1.2+组件开发技术、Taperstry、Wicket
– 客户端:基于Jquery定制
实现IDE的开发集成技术实现
• 应用开发框架的集成
封装互联网技术支持
• 提供Ajax支持
– 包括局部刷新、局部提交,甚至Ajax Push机制
• 封装动态内容静态化及模板技术
– 封装缓存的调用
• 基于Yahoo的关于35个web优化实践的页面内容优化
• 跨浏览器支持
– 移动客户端浏览器支持(基于WML)
云计算PaaS平台应用前景探讨
IaaS(云计算基础设施)
硬件虚拟化:X86服务器,小型机,大型机
PaaS(平计算平台)
操作系统虚拟化:(Vmware)
服务平台化(应用服务器虚拟化):google app Engine
服务组件化(中间件服务虚拟化):集成中间件,流程中间件,数据中间件,消息中间件,交互中间件,监控中间件
SaaS(云计算应用)
应用服务化:apple , 360 , tecent 提供的云服务
PaaS带来
柔性的横向扩展能力
简化目前的负载均衡模型,并能提供柔性的横向扩展能力。
合理并适度地利用硬件资源
降低服务器之间的部署及管理成本
简化的分布式应用编程
减低基于中间件的应用编程难度
提供新的分布式计算模型,降低分布式应用的编程难
整合的上层应用支持
根据标准化协议,整合各类中间件之间的通信
为上层应用提供基础平台架构,中间件产品的应用不会带来底层架构层次的大的变动
JEE 7 Platform
• 云计算下编程模型
– JNDI将在云环境全局化或虚拟全局化,支持动态跨JVM资源注入与获取
– JPA/JDBC/JMS云计算环境下的编程模型
• 新的云环境部署规范
– WAR/EJB/WS的云环境部署
– 部署描述符的改进
• 新的负载均衡模型
– WAR中的Session处理
VMWare收购SpringSource带来的思考
• 基于Spring的新分布式计算模型与框架
– 动态注入新虚拟化JVM的Bean实例
– Bean实例级别的负载均衡