前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >选择一个异步应用程序服务器还是多阻塞服务器?

选择一个异步应用程序服务器还是多阻塞服务器?

作者头像
CSDN技术头条
发布于 2018-02-09 10:03:00
发布于 2018-02-09 10:03:00
1.8K0
举报
文章被收录于专栏:CSDN技术头条CSDN技术头条

Jonathan Willis,白天是软件开发者,晚上是超级英雄,有人通过Twitter在StackOverflow上向他提了一个有趣的问题:

许多Rails应用程序或者只一个Vertx Play! 应用程序? 我一直在和我团队的其他成员讨论关于使用一个异步应用服务器,比如Play! Framework(建立在Netty上),相比于一个Rails应用程序服务器多实例旋转的优缺点。我知道Netty是异步/非阻塞的,意味着在一个数据区查询操作中,网络请求或者其他一些类似的东西,一个异步调用就将会允许事件循环线程从阻塞请求转换到另一个已准备好的请求去处理/服务。这将会使CPU繁忙运转而不是阻塞和等待。 我认为要赞同或者使用一些如Play!Framework 或者Vertx.io,以及一些非阻塞的…可伸缩的。在另一方面,我的团队的成员认为你可以通过使用一个Rails应用程序的多个实例来获得同样的好处,它只能有一个线程,并且没有真正的并发应用程序作用在JVM上,只要使用足够的App实例来匹配一个Play!应用的性能(或者即使我们使用多个Play!应用程序),当一个Rails应用程序阻塞了,操作系统将把流程转换至一个不同的Rails应用程序。最后,他们说CPU们将会做相同的工作量并且我们将会得到相同的性能。

你怎么认为?市场似乎改变了,以node.js、Golang、Akka甚至Java形式改变为异步服务器模式。这是否意味着这是唯一一种正确的方法?

我尝试如此回应:

两种方式都可以工作。所以,如果转换会造成高开发成本并且/或者产生进度冲突,那么这将是不值得的。当成本高得无法接受时做出转换,还是想想使用微服务逐步转换策略吧。

如果你在你开发周期的早期使用转换,那么转换会显得很有意义,重写是非常痛苦的。

或者你从来不需要转换,Rails将为你使用用例工作,它极具魅力。并且你一直如此成功地让你的客户高兴那么现金就会滚滚而来。

一个单机阻塞服务器方式的缺点:

  • 增加了内存的使用。来源:多进程、内存泄露、缺乏共享的数据结构(这增加了通信成本以及带来一致性问题);
  • 缺乏并行性。这将带来两个后果:更多的盒子和更多的延迟。你可能需要一个更大的盒子来装载同样的负载。所以如果你需要规模化则需要有更多相关资金,那么这可能是个问题。如果不打算这么做则没什么问题。在服务器中这意味着增加了延迟,延迟排序将不能通过乘法提高,这可能取决于你的应用程序会使参数作废。

以下是一些使用了这些从Rails到Node.js和Golang的转换的例子:

  • LinkedIn Moved From Rails To Node: 27 Servers Cut And Up To 20x Faster
  • Why Timehop Chose Go to Replace Our Rails App
  • How We Moved Our API From Ruby to Go and Saved Our Sanity
  • How We Went from 30 Servers to 2: Go

这些文章代表的观点可能是说明你的团队正在经历着。不幸的是,这个决定并不是显而易见的。

这取决于你所构建的本质、你团队的本质、你资源的本质、你技能的本质、你目标的本质以及你如何评估你的交易。

成本真的会下降吗?不管服务器数量做不相同的计算量?这取决于完成的工作量的类型和规模。典型的Web服务是IO绑定,等待来自其他服务器如数据库、缓存等的响应。

如果你使用单线程服务器进程在IO会有大量阻塞,所以这等于什么也没做。相比之下,非阻塞服务器将能够处理相当多的请求当单进程服务器正阻塞着。你可以不断增加进程,但是只有一台机器可以运转如此多进程。一个非阻塞服务器有相同数量的进程,同时可以保持CPU尽可能忙于处理进程请求。使用非阻塞服务器通常可以在更小更便宜的机子上处理更高负载。

如果你希望请求速率可以保持在可接受范围内盒子的数量,并且不希望巨大峰值,那么你就可以使用单线程服务器。非阻塞服务器在吸收负峰载量值而不需要增加机器表现很好。

如果延迟响应并不真正影响到你的工作,那么你可以使用较少的节点。

如果你的工作量是CPU绑定的,那么你至少将需要更多盒子,因为服务器不会在IO阻塞,对于平行那不会有相同的机会。

原文链接:Ask HighScalability: Choose An Async App Server Or Multiple Blocking Servers?(译者/王苇棋 审核/朱正贵、wendy 责编/仲浩)

译者简介:王苇棋,硕士毕业于中国香港浸会大学,关注数据挖掘和信息安全。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSDN技术头条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
黄规速
2022/04/14
3K0
socket阻塞与非阻塞,同步与异步、I/O模型
socket阻塞与非阻塞,同步与异步I/O模型
作者:huangguisu 原文出处:http://blog.csdn.net/hguisu/article/details/7453390
bear_fish
2018/09/20
3.6K0
socket阻塞与非阻塞,同步与异步I/O模型
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
用户6280468
2022/03/21
3.5K0
socket阻塞与非阻塞,同步与异步、I/O模型
高性能服务器程序框架
http://blog.csdn.net/zs634134578/article/details/19806429
bear_fish
2018/09/20
2.1K0
高性能服务器程序框架
服务器并发处理能力
序: 这里指的服务器是指提供HTTP服务的服务器,人们通常衡量一台web服务器能力的大小为其在单位时间内能处理的请求数的多少。 3.1 吞吐率 Web服务器的吞吐率是指其单位时间内所能处理的请求数。更关心的是服务器并发处理能力的上限即最大吞吐率。 Web服务器在实际工作中,其处理的Http请求包括对很多不同资源的请求即请求的url不一样。正因为这种请求性质的不同,Web服务器并发能力的强弱关键在于如何针对不同的请求性质设计不同的并发策略。有时候一台Web服务器要同时处理许多不同性质的
李海彬
2018/03/23
5.5K0
聊聊同步与异步、阻塞与非阻塞、I/O模型
程序员:假如我们执行A,B两个IO操作的时候,如果必须等待A完成后才能执行B那么这个就是
咻一咻
2020/05/29
1.3K0
也谈应用程序级的同步、异步、阻塞、非阻塞
这几个经常出现的词汇很容易会引起大家的误解,第一次接触相关词汇是在课上,当时上操作系统的老师说得比较模糊(阻塞==同步,非阻塞==异步),当时觉得挺对 的,
chain
2018/08/02
1.1K0
同步与异步/阻塞与非阻塞/回调【面试+工作】
  打个比方,比如我们去购物,如果你去商场实体店买一台空调,当你到了商场看中了一款空调,你就想售货员下单。售货员去仓库帮你调配物品。这天你热的实在不行了。就催着商家赶紧给你配送,于是你就等在商场里,候着他们,直到商家把你和空调一起送回家,一次愉快的购物就结束了。这就是同步调用。
Java帮帮
2018/12/07
1.3K0
同步与异步/阻塞与非阻塞/回调【面试+工作】
传统同步阻塞和异步非阻塞的区别理解
同步与异步的理解 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。 同步:当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。 异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。 异步调用,要想获得结果,一般有两种方式: 1、主动轮询异步调用的结果; 2、被调用方通过callback来通知调用方调用结果。
小勇DW3
2019/11/10
1.1K0
阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
本文会涉及到阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO等几个知识点,知识点虽然不难但经常容易搞混,这次带领大家再回顾一遍。
码农编程进阶笔记
2021/07/20
4210
阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
高并发环境下服务器该如何优化
以下内容为入门级介绍,意在对老技术作较全的总结而不是较深的研究。主要参考《构建高性能Web站点》一书。
Bug开发工程师
2018/07/23
1.8K0
Zuul 2: Netflix的异步、无阻塞系统之旅
来源: https://medium.com/netflix-techblog/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c
java达人
2020/02/14
1.9K0
Zuul 2: Netflix的异步、无阻塞系统之旅
15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!
是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。
Bug开发工程师
2020/03/02
8.4K0
apache和nginx那点事儿--阻塞和异步
先明白的事儿:当一个程序在执行的时候,一般会创建一个进程,也可以有多个进程。一个进程至少会创建一个线程,多个线程共享一个程序进程的内存。程序的运行最终是靠线程来完成操作的。线程的数量跟CPU核数有关,一个核最多能发出两个线程。线程的操作主要分为:一:给CPU进行程序命令的执行。二:IO的操作(读取或输出数据)或者请求网络数据。
后端技术探索
2018/08/10
1.1K0
服务器-Nginx的Web请求处理机制
web服务器和客户端是一对多的关系,所以web服务器要能同时为多个客户端提供服务。一般有三种方式:多进程方式、多线程方式和异步方式。
小二三不乌
2018/08/02
7320
几种服务器端IO模型的简单介绍及实现
一些概念: 同步和异步 同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,而异步是指用户进程触发I/O操作以后便开始做自己的事情,而当I/O操作已经完成的时候会得到I/O完成的通知。 阻塞和非阻塞 阻塞和非阻塞是针对于进程在访问数据的时候,根据I/O操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 服务器端几种模型: 1、
李海彬
2018/03/23
1.5K0
几种服务器端IO模型的简单介绍及实现
程序员修神之路--提高网站的吞吐量?
吞吐量是指对网络、设备、端口、虚电路或其他设施,单位时间内成功地传送数据的数量(以比特、字节、分组等测量)。
心莱科技雪雁
2019/04/22
1K0
程序员修神之路--提高网站的吞吐量?
JAVA语言异步非阻塞设计模式(原理篇)
作者 | 白宇(经授权转载自公众号有道技术团队) 编辑 | 刘振宇 本文主要讲解Java语言异步非阻塞模型的原理,以及核心设计模式“Promise”的基本特性。 1概述 异步非阻塞 [A] 是一种高性能的线程模型,在 IO 密集型系统中得到广泛应用。 在该模型下,系统发起耗时请求后不需要等待响应,期间可以执行其他操作;当收到响应后,系统收到通知并执行后续处理。由于消除了不必要的等待,这种模型能够充分利用 cpu、线程等资源,提高资源利用率。 然而,异步非阻塞模式在提升性能的同时,也带来了编码实现上的复杂性。
深度学习与Python
2023/04/01
1K0
JAVA语言异步非阻塞设计模式(原理篇)
高性能网络编程 - 解读5种I/O模型
以上两个关键点最终都与操作系统的 I/O 模型以及线程(进程)模型相关,我们先详细看一下I/O模型 。
小小工匠
2023/11/11
3480
高性能网络编程 - 解读5种I/O模型
同步、异步、阻塞、非阻塞
同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。
菲宇
2019/06/13
3.2K0
相关推荐
socket阻塞与非阻塞,同步与异步、I/O模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档