热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

rxjava获取异步请求的结果_从Redis异步到反应式架构

编者注:笔者整理了一份【Redis不完全指南】,包含了很多详细的知识点和Redis经典面试题,可关注「TopCoder」公众号࿰
2eb8bb82b855c6464ece14997f862183.png
编者注:笔者整理了一份【Redis不完全指南】,包含了很多详细的知识点和Redis经典面试题,可关注「TopCoder」公众号,发送 Reids 来获取~

Redis异步

说到Redis的通信,我们都知道Redis基于RESP(Redis Serialization Protocol)协议来通信,并且通信方式是停等模型,也就说一次通信独占一个连接直到client读取到返回结果之后才能释放该连接让其他线程使用。

这里小伙伴们思考一下,针对Redis客户端,我们能否使用异步通信方式呢?首先要理解这里讨论的异步到底是指什么,这里的异步就是能够让client端在等待Redis服务端返回结果的这段时间内不再阻塞死等,而是可以继续干其他事情。

针对异步,其实有两种实现思路,一种是类似于dubbo那样使用单连接+序列号(标识单次通信)的通信方式,另外一种是类似于netty client那样直接基于Reactor模型来做。注意:方式一的底层通信机制一般也是基于Reactor模型,client端不管是什么处理方式,对于redis server端来说是无感知的。

下面就这2种实现思路分别讨论下 :)

单连接+序列号通信方式

单连接+序列号通信方式理论上是可以的,不过由于RESP协议中并没有一个"序列号"的字段,所以直接靠原生的通信方法来实现是不现实的。不过我们可以通过echo命令传递并返回"序列号"+正常的读写方式来实现,这里要保证二者执行的原子性,可以通过lua脚本或者事务来实现,事务方式如下:

MULTI
ECHO "唯一序列号"
GET key1
EXEC

然后客户端收到的结果是一个 [ "唯一序列号", "value1" ]的列表,可以根据前一项识别出这是发送的哪个请求。

为什么Redis通信方式并没有采用类似于dubbo这种通信方式呢,笔者认为有以下几点:

  1. 使用停等这种通信方式实现简单,并且协议字段尽可能紧凑;
  2. Redis都是内存操作,处理性能较强,停等协议不会造成客户端等待时间较长;
  3. 目前来看,通信方式这块不是Redis使用上的性能瓶颈,这一点很重要。

Reactor模型通信机制

Reactor模型通信机制就是应用程序与Redis通信时,发送数据之后就将该连接的后续的读取操作(read事件)交给其他Reactor来处理,在Java中也就是常说的Java NIO/Selecter机制,注意,这里重要的是需要设置Redis结果读取的回调处理方法。

从以上两个异步处理机制流程来说,异步处理重要的是设置对应的处理回调逻辑,其实不仅仅是Redis通信,任何网络通信(RPC/数据库等)都可以进行异步化改造,异步化改造虽然原理不难,但是在一个处理链路上需要多个地方设置异步回调逻辑,理解上来说可能稍微麻烦一点。

反应式架构

反应式架构中的反应式就是 Reactive,分析反应式架构之前,先了解下常见的异步化处理机制:线程池、事件驱动、消息驱动等。

  • 线程池:业务中将耗时操作交给线程池来处理,不影响当前线程。
  • 事件驱动:比如网络IO事件,也就是常说的Reactor处理机制。
  • 消息驱动:通过消息将后续处理逻辑交给其他线程或者进程来处理,达到解耦效果。

反应式架构,从低纬度来说,比如针对网络通信这块,可以通过Reactor机制(比如Java的NIO/Selector等)来完成异步处理;从高纬度来说,就是在一整个业务链路中,涉及到可能造成阻塞的环节都改造成异步处理。

目前针对反应式架构,业界已经有一些对应的开源解决方案,比如Java 8 已经逐渐普及,因为它包含对 Lambda 的支持,这让开发者对 Lambda 的接受度大大提高;同时 Reactive 相关的业务框架在业界已有成熟的实现,RxJava 已经广泛在大小公司中应用;最后,包括 Java 9(引入 Reactive Sreams 规范 API)、Spring 5(引入 Reactor/WebFlux)、Spring Boot 2 都开始拥抱 Reactive,说明反应式编程的确是趋势。

整个方案对业务架构的升级主要包括编程框架、中间件,以及业务方的升级。中间件的升级,包括服务框架(RPC)、网关、缓存、消息(MQ)、DB(JDBC)、限流组件、分布式跟踪系统、移动端 Rx 框架。更多的反应式架构可参考:https://www.infoq.cn/article/2upHTmd0pOEUNmhY5-Ay

往期精选

  • Redis常见问题指北
  • MQ初窥门径【面试必看的Kafka和RocketMQ存储区别】
  • 如何用好redis pipeline
  • 常见限流方案设计与实现
  • 你的Redis有类转换异常么
  • Redis 基础数据结构
  • 分布式锁设计与实现

觉得文章不错,对你有所启发和帮助,希望能转发给更多的小伙伴。如果有问题,请发送问题给我,多谢!

欢迎小伙伴关注【TopCoder】精彩好文。

2d84ba3e27a1843f0d0ec0f4fd3d5a03.png



推荐阅读
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍如何使用Samba软件配置CIFS文件共享服务,涵盖安装、配置、权限管理及多用户挂载等关键步骤。通过具体示例和命令行操作,帮助读者快速搭建并优化Samba服务器。 ... [详细]
  • 本文探讨了高质量C/C++编程的最佳实践,并详细分析了常见的内存错误及其解决方案。通过深入理解内存管理和故障排除技巧,开发者可以编写更健壮的程序。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
  • 本文介绍了一种在 MySQL 客户端执行 NOW() 函数时出现时间偏差的问题,并详细描述了如何通过配置文件调整时区设置来解决该问题。演示场景中,假设当前北京时间为2023年2月17日19:31:37,而查询结果显示的时间比实际时间晚8小时。 ... [详细]
  • 本文详细介绍了如何通过RPM包在Linux系统(如CentOS)上安装MySQL 5.6。涵盖了检查现有安装、下载和安装RPM包、配置MySQL以及设置远程访问和开机自启动等步骤。 ... [详细]
author-avatar
天使犯罪de快乐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有