随着有赞零售业务的快速发展,系统和业务复杂度也在不断提升。如何解决系统服务化后,多个系统之间的耦合,提升业务的响应时间与吞吐量,有效保证系统的健壮性和稳定性,是我们面临的主要问题。结合目前技术体系和业务特点的思考,我们在业务中实践了响应式架构以及RxJava框架,来解决系统与业务复杂所带来的问题。

实践响应式架构

响应式架构是指业务组件和功能由事件驱动,每个组件异步驱动,可以并行和分布式部署及运行。

响应式架构可以带来以下优势:大幅度降低应用程序内部的耦合性

事件传递形式简化了并行程序的开发工作,使开发人员无须与并发编程基础元素打交道,同时可以解决许多并发编程难题,如死锁等。

响应式架构能够大幅度提高调用方法的安全性和速度。

对复杂业务系统的领域建模,响应式架构可以天然支持。每个系统组件就可以对应到一个业务实体,业务实体之间通过接收事件来完成一次业务操作。

我们使用响应式架构主要是为解决多个系统间的多次远程调用带来的分布式问题,尤其在长任务场景中,响应式架构显得尤其必要。

有赞连锁出现后,随着连锁商家经营规模的扩张,会在系统中创建新的门店。创建新门店会引发一系列业务初始化工作,例如店铺、员工、仓库、商品、库存等业务域,并且各业务域之间存在一定的依赖关系(如图1所示),例如商品依赖仓库初始化完成。

图1 连锁新建分店系统依赖关系

商家新增门店时,在店铺初始化完成后,连锁系统发送店铺初始化成功消息,相应系统对事件进行响应,处理完成(成功/失败)后将回执给连锁系统,连锁系统根据相关业务的反馈,决定是继续通知下游业务,还是结束整个过程。新建门店部分流程如图2所示。

在创建门店业务中,每个系统响应连锁系统发出的消息,处理完成后进行回执。通过这种模式,业务系统本身不关心其他系统是否成功或失败,只需对通知的事件进行处理,整体初始化进度与异常处理由连锁系统来控制。这种设计使得各业务系统之间没有直接耦合并保持相互独立。

图2 连锁体系新增分店消息驱动图

上面的案例介绍了在复杂业务场景下系统间对响应式架构的实践,系统内部同样会遇到复杂业务场景。下面介绍下在系统内部应对复杂业务的实践。

RxJava在有赞零售实践

Rxjava是用来编写异步和基于消息的程序的类库。RxJava在Android有着广泛的使用,主要应用在用户界面绘制与服务端通讯等场景。RxJava的核心思想是响应式编程以及事件、异步这两个特点。响应式编程是一种通过异步和事件流来构建程序的编程模型。在复杂的业务开发中,最棘手的问题就是如何清晰直观的展现复杂的业务逻辑,并且方便后续的业务维护与扩展。

响应式编程使得复杂业务逻辑更清晰

有赞零售的业务场景中有着复杂的业务逻辑,有赞目前提供多种产品供商家选择,商家在不同产品进行切换时,为了商家更好的体验,不同业务的切换会进行数据初始化与处理。例如有赞微商城转换到有赞零售。

这里拿着微商城升级零售的业务场景给大家举例。微商城升级为零售时需要对商品进行转换。首先初始化店铺基础信息。然后读取商品流,将微商城的商品类型转换成零售支持的商品类型。最后读取规格,为规格创建供应链商品库,创建门店商品与添加网店商品的供应链商品关联关系。整体转换流程如图3所示。图中也画出了可以并发处理的场景。

图3 微商城升级有赞零售流程

如果单纯使用设计模式来解决上面这种场景单一、但业务逻辑特别复杂的场景,是很难做到的。也可以看到除了初始化信息那一步,后面的商品模型转化自始至终在业务中流转的事件都是商品,这里就可以使用RxJava来优化业务代码使得处理流程可以并发,加快升级速度。

最终我们按照图3的流程处理升级逻辑,其中的并发场景,比如保存完零售商品后,并发处理库存、和销售渠道,使用rxjava封装的方法帮助我们进行并发操作。如下所示代码结构清晰,对外屏蔽了复杂的并发处理逻辑。

Observable.zip(

callAsync(()->处理库存相关操作),

callAsync(()->更新商品库门店销售渠道),

callAsync(()->创建商品库与网店商品关联关系),

(sku1,sku2,sku3)-> sku

).blockingFirst();

最终我们的整体的代码

UpgradeItem.listItems(manager, shop)

.flatMap(item-> fromCallable(()->更新为零售商品类型))

.flatMap(item-> fromCallable(()->并发处理商品操作), true)

.flatMap(item-> 商品流转化为sku流, true)

.flatMap(sku-> fromCallable(()->保存零售商品))

.flatMap(sku-> fromCallable(()->并发处理保存商品后续操作, true)

.subscribeOn(Schedulers.io());

整个商品处理流程就是上面这段代码,一目了然,后面扩展可以自己在中间加入处理流程,也可以在对应业务方法中修改逻辑。

多服务、数据源组合

随着微服务架构兴起,我们将不同的业务域拆分成不同的系统。这样方便了系统的维护,提升了系统的扩展性,但是给上层业务系统也带来了很多麻烦。往往我们为了展示一个页面会涉及到2-3个或更多的应用,而多次的分布式调用不但使得系统的rt增加,也使得核心页面的出错风险更高。

降低rt:在假设第三方接口已经达到性能顶点的情况下,并发是解决多次分布式调用降低rt的常用方法。

自动降级:传统编程方法中,自动降级处理,意味着我们代码中会出现一大堆try/catch,而使用rxjava,我们可以直接定义当流处理异常时,程序需要怎么做,这样的代码看起来非常简洁。

商品搜索作为商品管理的核心入口,根据不同场景聚合商品、优惠、库存等信息。由于商品列表页展示的信息涉及到多服务数据的整合,一方面需要保证整个接口的rt,另一方面不希望由于一个商品数据或外部服务的异常影响到整个商品列表的加载。因此该场景非常适用于RxJava。

最终我们的代码

1.根据入参获取商品加载器

//只有包含的merger才会加载

List validMergers =

Observable.fromIterable(skuAttrMergers).filter(loader -> request.getAttributes().contains(loader.supportAttribute().getValue())).toList().blockingGet();

2.根据es结果获取商品各个属性详情并加载到SkuAttrContext中(某类属性加载失败则忽略)

//调用load并发加载数据到商品属性上下文中

Observable.fromIterable(商品信息加载器列表)

.flatMap(商品信息加载器-> Observable.fromCallable(() ->异步加载商品信息))

.onErrorResumeNext(Observable.empty())//如果失败则忽略

.subscribeOn(Schedulers.io()),false,线程数(为加载器数

量)).blockingSubscribe();

3.组装搜索结果(如果某个sku组装失败则直接忽略)

//调用merge将数据合并到目标对象

商品搜索返回结果列表 = Observable.fromIterable(商品id列表)

.map(商品id->初始化商品搜索结果返回对象)

.flatMap(商品搜索结果返回对象-> {

val observables=Observable.fromIterable(商品加载器列表)

.map(loader -> Observable.fromCallable(() ->合并每个sku的不同属性)).toList().blockingGet();

return Observable.zipIterable(observables, (a) -> sku, false, 线程数)

.onErrorResumeNext(Observable.empty()); //如果失败则忽略

}, false, 1)

.toList()

.blockingGet();

后记

本文主要介绍了响应式架构与RxJava在有赞零售的使用场景。目前我们对响应式架构的实践方式是:在系统间使用消息中间件来进行实现,在系统内则使用RxJava实现异步化和响应式编程。对于响应式架构的思想,我们也在探索阶段,并在部分业务场景进行实践。未来面对越来越复杂的零售业务场景,会用响应式架构全面实现系统业务的异步化。总的来说响应式架构思想为提升复杂业务系统健壮性、灵活性提供了强有力的支撑。后面大家如果想更多的讨论响应式架构与编程的实践,欢迎联系我们。

在有赞做java有发展吗_响应式架构与 RxJava 在有赞零售的实践相关推荐

  1. 在有赞做java有发展吗_有赞响应式架构与 RxJava 实践

    原标题:有赞响应式架构与 RxJava 实践 文 | 陈肃 on 有赞零售 随着有赞零售业务的快速发展,系统和业务复杂度也在不断提升.如何解决系统服务化后,多个系统之间的耦合,提升业务的响应时间与吞吐 ...

  2. 有赞 java_响应式架构与 RxJava 在有赞零售的实践

    随着有赞零售业务的快速发展,系统和业务复杂度也在不断提升.如何解决系统服务化后,多个系统之间的耦合,提升业务的响应时间与吞吐量,有效保证系统的健壮性和稳定性,是我们面临的主要问题.结合目前技术体系和业 ...

  3. java 字体 自适应大小_响应式网页设计:rem、em设置网页字体大小自适应

    「rem」是指根元素(root element,html)的字体大小,好开心的是,从遥远的 IE6 到版本帝 Chrome 他们都约好了,根元素默认的 font-size 都是 16px.这样一个新的 ...

  4. java 职业发展方向_学Java有哪些发展方向 可以从事哪些职业

    很多人都不知道学Java有哪些发展方向,可以从事哪些职业,随着互联网技术的发展,导致现在Java培训非常热,是因为通过学习Java能够快速的就业,这对于往年就业压力非常大的大学生来说,无疑是一条就业的 ...

  5. Java的HTTP服务端响应式编程

    传统的Servlet模型走到了尽头 传统的Java服务器编程遵循的是J2EE的Servlet规范,是一种基于线程的模型:每一次http请求都由一个线程来处理. 线程模型的缺陷在于,每一条线程都要自行处 ...

  6. flex如何做响应式设计_响应式设计-您做错了!

    flex如何做响应式设计 Responsive design is not just about the web that automatically adjusts to different scr ...

  7. window safari 怎么进入响应式_响应式网站怎么做?模板教程来了

    随着移动端网站访问需求增加,"响应式网站"越来越受到用户欢迎.到底什么叫响应式网站呢? 其实就是网站效果可以随着屏幕尺寸大小而自适应,不会发生变形.扭曲.缺失的现象.不管你是在使用 ...

  8. Java程序员的日常 —— 响应式导航Demo

    这两天想要做响应式的页面,于是本着重复造轮子的想法,模仿Bootstrap官网,精简了一个响应式导航的Demo. 效果 代码 <!DOCTYPE html> <html> &l ...

  9. html5做在线音乐,html5实现在线响应式音乐播放器

    大概很早的时候就有想法做一个音乐播放器玩玩,以前可能还考虑过做APP,大一的时候第一个html的静态页面也是做的音乐网站,想想,大概小时候比较喜欢音乐吧.然而,现在入了前端大坑,就用h5做一个耍耍好了 ...

最新文章

  1. 【 MATLAB 】序列运算之序列移位的函数实现
  2. effective c++ 条款10 让operator= 返回*this的引用
  3. 使用tensorflow serving部署keras模型(tensorflow 2.0.0)
  4. Unity Built-in Shader转URP Shader 接口查询对照表
  5. Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用
  6. 解决 favicon.ico 404 (Not Found)
  7. 【华为云动态】华为云携手Google,IBM,SAP等多家知名企业加入CDF,助力软件开发生态发展
  8. 2016年总结:教师路的开启,爱情味的初尝 (上)
  9. cad化气路图_气路图符号cad下载
  10. mysql存小程序获取到的带有表情的昵称_拉取用户信息,带表情的昵称,存储到数据库是???要怎么处理...
  11. 换服务器皮肤文件,lol怎么替换皮肤文件
  12. 【 unity3d 】NGUI playTween与Tween动画 脚本的使用
  13. 第二周:1.逆序的三位数(5分)(题目来源中国大学MOOC)
  14. 如何将PDF压缩突破限制大小
  15. Centos7 安装VLC播放器
  16. 努力构建15分钟听力圈,腾讯天籁行动助力听障老人更快融入数字社会
  17. 用python处理水仙花数
  18. html5 video视频标签
  19. 【Quip】多人协作在线编辑文档
  20. 「职场套路」那些心照不宣的职场套路,工作多年还不知道?

热门文章

  1. 【项目管理】 项目管理术语总结 (PMP培训笔记)
  2. python获取网卡的ip子网掩码和网关
  3. ElasticSearch 之 文本搜索
  4. 【DirectX11】第一篇 DirectX11简介
  5. zynq Linux软件中断,zynq7010 在 linux 系统下 irq_f2p 中断驱动-Go语言中文社区
  6. 大数据常见错误解决方案(转载)
  7. 使用awk截取IP地址前三段的办法
  8. 编写java汽车销售的类_Java经典编程300例之实例062 简单的汽车销售商场(多态)...
  9. C语言实现NP调度算法,基于任务复制的进化调度算法.pdf
  10. 字节跳动无恒实验室首次亮相Black Hat 2021亚洲黑帽大会:全生命周期管理的隐私保护框架