首页 > 编程语言 >RxJava在业务系统中的实践

RxJava在业务系统中的实践

时间:2023-04-02 15:33:16浏览次数:38  
标签:异步 Flowable 编程 实践 业务 线程 computation RxJava fromCallable


在java的世界里由于大多数接口和API都是阻塞式的交互,进而影响到很多童靴的编程思想和编程习惯。因而,有一些专家讲java的编程模型是阻塞式模型(与Node.js区别大),不是没有道理的。从高性能的视角看,任何阻塞点都可能导致性能的退步。而响应式编程其天然就是非阻塞的,当数据准备完成后自动触发下一个动作而不是等待数据完成。这种思想再结合异步化编程使得我们在统一线程模型,降低多线程编程成本的同时提升整个系统的吞吐量。

划重点

异步化编程不同于传统的阻塞式编程,在任务处理上异步化编程的关注点已发生转移:

以前一个线程中执行完所有的computation任务和IO任务>>>>如今需要computation任务和IO任务分离进行处理(CPU只关注computation任务)

响应式架构

由业务组件构成,业务组件由事件异步驱动

那如何结合业务进行优化呢?

首先要找出业务系统中的阻塞点,进行分类,各个击破。

应用日志

日志的性能显得很重要,虽然log4j和logback都提供了异步方式,但是它们本质上还是基于锁来实现。log4j2是新一代的基于LMAX Disruptor的无锁异步日志系统,在多线程程序中,其吞吐量比log4j和logback高10倍左右。

HTTP请求

服务端异步其实之前也讲过,了解spring mvc的异步特性介绍

RPC调用

客户端异步改造其实不难

其实应用日志、HTTP请求、RPC调用...等改造起来不难,最麻烦最有挑战性的是执行范式上(串行请求)的改造。

实践1:根据订单号需查询:商品信息、商品详情(需要更新缓存)、浏览量、留言信息

感受下,是不是感觉世界美好了很多!

//根据订单号查订单
Flowable<Order> orderFlow = Flowable.fromCallable(() -> queryOrder(orderId));
//查商品
Flowable<Item> itemFlow = orderFlow.flatMap(order -> Flowable.fromCallable(() -> queryItem(order.getId())));
//查询商品相关信息
Flowable<Detail> detailFlow = itemFlow.flatMap(item -> {
   //浏览量
   Flowable<Long> pvFlow = Flowable.fromCallable(() -> queryItemPv(item.getId()));
   //留言
   Flowable<Comment> commentFlow = Flowable.fromCallable(() -> queryItemComment(item.getId()));
   //浏览,留言,商品共同组成detail
   return Flowable.zip(pvFlow,commentFlow,(pv,comment) -> buildItemDetail(item,pv,comment));
});
//更新缓存(doOnNext不会对流的结果造成任何影响,只是触发一个操作)
detailFlow.doOnNext(detail -> cache(detail));

实践2:支付

Response response=Observable.zip(
    callAsync(()->updateStock()),
    callAsync(()->updatPayHistroy()),
    callAsync(()->updateOrder()),
    (response1,response2,response3)-> response()
).blockingGet();

目前响应式纯异步编程在业务系统的应用仍然处于起步阶段,暂时没法完全消除阻塞点,改造的过程中需要重点关注:

  • 业务组件的抽象及依赖上治理
  • cpu核数个线程来调度所有的computation任务
  • 底层的IO线程模型统一(RPC,HTTP,缓存都是各自维护自己的线程池),理论上这些线程池都可以趋于统一

标签:异步,Flowable,编程,实践,业务,线程,computation,RxJava,fromCallable
From: https://blog.51cto.com/alex/6164855

相关文章

  • elasticsearch实践篇:跨表join查询
    随着业务发展跨表join查询需求越来越多,系统的慢查询不断报出,引入ElasticSearch来实现聚合查询势在必行。ES是一个基于Lucene的搜索引擎,通过将业务主表及辅表的索引字段及需要like字段同步到ES里,每张表的索引字段最终汇总成一个联合索引,来实现多个表的跨表搜索。性能要求检索需求......
  • 研发人员如何才能在做业务的过程中自我增值?
    1背景如何才能在做业务的过程中不再是资源一样被消耗而是像资产一样自我增值?如何成长?如何高效率地成长?如何让自己的成长走在环境要求的前面?基于以上这些问题,本文将依次阐述以下内容:先从“人的本质”入手(第二章节),接着探讨“人的成长”的本质(第三章节),最后再探讨业务和技术的一般规律......
  • python从入门到实践第16章 下载数据1
    第一步获取csv格式文件需要python爬虫的相关知识 第二步 先打印第一行观察标签importcsvfilename='data/sitka_weather_2014.csv'withopen(filename)asf:reader=csv.reader(f)header_row=next(reader)print(header_row)['AKST','MaxTempe......
  • 在业务中有个SQL语句导致mysql锁表,该SQL为重要业务使用不能kill,解决方案
    在业务中有个SQL语句导致mysql锁表,该SQL为重要业务使用不能kill,怎么快速恢复如果有一个重要业务正在使用导致了MySQL表的锁定,不能通过终止相关的MySQL进程来解除表锁定,需要采取其他措施来快速恢复业务。以下是一些可能有用的步骤:使用MySQL的SHOWPROCESSLIST命令来查看当前正......
  • 流程一般会分为两类:业务流程与审批流程。
      流程一般会分为两类:业务流程与审批流程。 业务流程:为达到特定的价值目标而由不同的人分别共同完成的一系列活动。活动之间不仅有严格的先后顺序限定,而且活动的内容、方式、责任等也都必须有明确的安排和界定。主要目的是为了使不同活动在不同岗位角色之间进行转手交接成......
  • Ceres 自动求导解析-从原理到实践
    Ceres自动求导解析-从原理到实践目录Ceres自动求导解析-从原理到实践1.0前言2.0Ceres求导简介3.0Ceres自动求导原理3.1官方解释3.2自我理解4.0实践4.1Jet的实现4.2多项式函数自动求导4.3BA问题中的自动求导Reference1.0前言Ceres有一个自动求导功能,只要你按照C......
  • 企业实践 | 如何在阿里云裸金属服务器上使用UEFI模式实践安装国产银河麒麟V10操作系统
    [点击......
  • 【专题】2022年中国企业ESG战略与实践白皮书报告PDF合集分享(附原数据表)
    当前,随着气候变化、新冠疫情和地缘政治等重大突发事件的冲击,公司所处的宏观环境面临着越来越多的不确定性。在中国,伴随着“双碳”目标的实施和“共同富裕”的实施,我国的经济增长方式正在转向一种新的、同时也是一种生态与福利并重的增长方式。在这种情况下,ESG成为了许多公司关注的......
  • 前端工程化实践 - 多人开发分支管理、Git记录提交规范(二)
    一、前言Git在工作中是很重要的一部分,如果操作不熟练或者使用不规范,很容易给工作造成很多麻烦比如习惯所有功能写在一个分支,导致无法分开上线比如提交了依赖目录,导致Git仓库的代码过大比如合并分支出现错误,将不用上线的代码提交比如分支命名不规范,导致误删分支这一篇正好是前端工程......
  • 蓝牙mesh组网实践(在mesh工程中添加BLE功能)
    目录CH582这款芯片是能够同时跑mesh+BLE的,在我司提供的透传模型“一般节点”或者叫“普通节点”的代码adv_vendor中,也可以添加BLE功能,方便用户随时连接BLE。在adv_vendor工程中添加BLE的操作步骤如下:①如图配置预编译宏。BLE_MAC:用于配置BLE广播所用的MAC地址为代码中自定义......