首次响应系统
我第一次听到ReactiveX这个词是在几年前,当时我遇到了Rxjava项目,它似乎为我打开了一扇新的大门。Rxjava是REAX的java实现,REAX家族包括RxJS、Rx。NET,RxScala等等。
ReactiveX的本质是观察者迭代器函数的异步编程。它是一个事件驱动的、异步的和可观察的序列。
RxJava可以用来将异步回调重写为链调用。在代码中看起来非常简洁明了。当然,JDK还提供了CompletionStage,它提供了类似的函数来解决回调。
Rxjava只是一个基本的java库。如果我们想建立一个响应性的服务器,一个响应性的网络,一个响应性的数据访问,甚至一个响应性的微服务,我们应该怎么做?
那时我才知道垂直x.垂直。x就用于构建反应式应用程序。
垂直。x是Eclipse基金会的产品基于事件驱动和非阻塞编程。
垂直。x是是模块化的,包括核心、网络、数据访问、反应式、微服务、MQTT、认证和授权、消息传递、事件总线桥、开发、测试、集群、服务和云。可以用一切来形容。
实际上,除了JDK本身意想不到的新的api特性之外,java行业一直都是被动的。比如业界著名的Spring也在spring 5中加入了webflux框架,这是一个反应式的web框架。
什么是响应系统
上一节我们提到了Rxjava和Vert.x,它们有一些共同的关键字,比如异步、事件驱动、观察者模式、函数式编程、消息驱动等。所有这些都是为了使现代系统更健壮、运行更快、更灵活和更好。
该系统已经从很久以前的单一服务器转变为当前的多服务器架构,从二级响应转变为毫秒级响应。从90%可用,现在是99.999%可用。系统设计、架构、程序编码都发生了很大的变化。
我们迫切需要一个能够满足上述需求的通用系统架构解决方案。
那么什么是响应系统呢?
响应系统需要这些特征:响应性、弹性、弹性和消息驱动。我们称具有上述四个特征的系统为反应系统。
在以上四个特征中,响应性是系统的最终目标,弹性和弹性是系统的表现形式,消息驱动是系统构建的手段。
因此,我们得到了响应系统的最终架构图:
图1
使用响应系统的体系结构可以保证系统的可维护性和可扩展性,当系统出现问题时可以有更好的容忍度。
反应系统的四个特征
在定义响应系统时,我们提到了四个特征:响应性、弹性、弹性和消息驱动。
接下来,我们将详细描述这四个特征的秘密。
及时响应
respond是指系统可以立即响应请求,应该有两层含义。
第一,响应时间要足够短。如果用户请求页面,等待2秒钟估计是极限。估计这个用户会流失很久。
时代在变,科技也在变。下载一个十几年前几百K的文件需要一分钟,估计很快。现在没有M每秒,肯定会让人抓狂。
随着现代CPU、服务集群和光纤传输的飞速发展,以及页面所承载的信息的巨大变化,一个普通的页面可能包含十个或二十个请求。每个请求的时间已经提高到毫秒甚至微妙的水平。同时,页面显示也有很多新的变化,比如异步加载和预加载。
最终目标是创建一个能够及时响应的系统。系统背后的各种技术和新的请求方法都服务于这个目标。
第二,错误的响应时间应该很短。
一方面,应该及时提醒用户可能出现的错误。无论是系统本身的错误还是用户的使用错误,都需要在限定的时间内做出反应。
另一方面,系统本身应该能够快速定位和响应问题。这是提高系统本身稳定性和安全性的基本要求。
如何发现和应对系统本身的问题?首先,我们应该有一个完善的错误记录系统,这样一切都有规律可循。二是要有相应的监控措施,让系统出现任何问题都能及时得到通知和报警。
韧性
可恢复性是指当系统遇到故障或错误时,仍然可以向外界提供服务。
首先,我们的系统需要足够健壮,能够抵抗正常访问,并且能够可预测地处理热点访问。
其次,现代系统的功能多种多样,一个简单的APP后台可能有几十个服务。因此,我们需要区分哪些服务是关键的,哪些是非关键的。对于关键服务,我们必须确保其稳定性。对于非关键服务,可以先考虑关键服务。
例如,在订单系统中,下订单肯定是关键服务,而点赞数和商品评论并不那么重要。
有必要区分和隔离关键服务和非关键服务。非关键服务的任何错误或异常都不会影响关键服务。
再次,如果一个服务发了错误,要尽量缩小影响范围,不要让一个小小的错误影响到所有的服务。
最后,故障应该有恢复措施,这个恢复措施不能影响其他系统服务。例如,我们可以复制现有的系统,当一个服务失败时,我们可以用备用服务来替换它。
这样才能保证系统的可靠性。
有弹性
弹性是指服务可以在需要的时候动态扩展,不需要的时候可以停用服务以节省资源。
现在很多云服务都提供了动态扩展的功能。如果系统是自己实现的,就要区分热点问题和非热点问题。
只有热点问题需要考虑灵活性,系统不能有瓶颈,可以碎片化或复制,从而实现分布式动态加载功能。
负载均衡技术可能是我们最常用的弹性函数,但是如何动态自动均衡负载可能是一个很有意义的话题。
灵活性可以通过软件实现,也可以通过硬件实现,但我们需要在成本和效果之间取得平衡。
消息驱动(消息驱动)
消息驱动的本质是发送消息,接收消息,然后进行处理。如今,很少有大型系统不使用消息中间件。使用这些消息中间件的优势在于它可以被解耦和异步驱动。
这里不讨论异步的优点。大概,你不用一直傻傻的等,而是充分利用时间去做更有效率的事情。
脱钩的效果更大。现代系统基本上由许多服务组成。要想保证这么多系统的平稳运行,就必须做解耦操作,否则一个服务的失败会导致所有服务的不可用,让你感到害怕。
消息驱动是这些不同服务组件之间的通信桥梁。告诉他们该做什么,等待他们的反馈。
或者我们可以把这些服务看成一个个的人,很多人之间的交流是通过语言进行的。语言驱动也可以称为消息驱动。
在这里,我们来谈谈信息驱动中的一个常见概念:背压。
我们知道服务发送和接收消息的处理速度是有限的。当发送和接收消息的速度快于接收消息的速度时,消息将被阻止。当消息被阻止过多时,消息可能会丢失或服务可能会崩溃。而且,如果有太多消息没有被处理,没有收到响应,对用户体验也是非常不好的。
在这里,我们需要使用背压的概念。如果消息接收方不能处理消息,我们可以通知消息发送方它有压力,需要减少负载。背压是一种信息反馈机制,它使系统能够优雅地响应负载,而不是在负载下崩溃。
总结
无功是近年来非常流行的概念。如何设计一个系统,通过反应来满足我们的需求,是我们需要考虑的问题。
随商信息技术(上海)有限公司 b2b2c多用户商城系统是基于PHP技术的企业级电子商务平台系统,系统支持平台自营、招商加盟和多商家入驻、集成微信商城、移动端APP商城、微信小程序于一体。公司主营业务包含商城系统定制开发、新零售系统解决方案、电商平台系统定制开发、商城网站建设服务等等,ShopSuite为大、中、小企业提供一个安全、高效、强大的电子商务解决方案,协助企业快速构建、部署和管理其电子商务平台,拓展企业销售渠道,致力于推动PHP技术和电子商务行业的发展而不断努力。