Netty - 它是如何异步的?(Netty - how is it asynchronous?)

让我们想象有一台服务器,当接收到一个汽车模型的请求时,询问所有寻找最便宜汽车经销商并且以价格回复(使用任何协议)的汽车经销商。 此操作需要一段时间。 在一个偶然阻塞的请求/响应服务器模型中,我确实如此

request = "audi a8" // prepare a request and one line after have the response
response = server.findCheapestCar(request) // takes 20 seconds

我不想阻止我的客户端主线程20秒,所以宁愿要它异步执行。 我对异步的理解是我可以传递某种对象并随身携带。 一旦服务器准备好响应,它将通知我传递的对象 - >休闲回调模式。

这种方法需要库匹配 - 客户端和服务器都需要知道对象。 但我希望在Netty上构建的异步服务器能够处理来自各种客户端(C ++ / Python和其他)的请求。

netty的异步性来自何处? 客户端需要什么来从异步获益?


Let's imagine there is a server, that when receives a request with a car model queries all known car dealers looking for the cheapest one and responds back with the price (using whatever protocol). This actions takes a while. In a casual blocking request/response server model, I do

request = "audi a8" // prepare a request and one line after have the response
response = server.findCheapestCar(request) // takes 20 seconds

I don't want to block my client main thread for 20 seconds, so would rather want it to be executed asynchronously. My understanding for something being asynchronous is that I can pass some sort of an object to it and carry one with my work. Once the server is ready with the response it will notify the object I passed -> Casual callback pattern.

This approach would require library match - both client ad the server need to know the object. But I want my asynchronous server built on Netty to be able to handle requests from various clients (C++/Python and others).

Where is the asynchronousness of netty coming from? What do I need on the client side to benefit from the asynchronousness?


原文:https://stackoverflow.com/questions/46831551
2021-04-04 14:04

满意答案

netty的异步来自哪里?

Netty采用了你可能从JavaScript这样的语言中得知的eventloops原理。 这允许netty完全异步工作。 (有关eventloops和基本原理的更多信息,我会推荐这个关于JavaScript中的evenloop的视频

客户端需要什么来从异步获益?

  1. 客户端发送请求(包含有效负载和请求id = clientside递增整数)
  2. 服务器处理请求50秒
  3. 服务器发送响应(包含有效载荷和客户端在其请求中发送的相同请求ID)
  4. 客户端收到响应并查找请求标识(如果客户端能够找到请求标识及其基础回调,它将调用它)

希望有所帮助


Where is the asynchronousness of netty coming from?

Netty adopted the principle of eventloops which you may known from a language like JavaScript. This allows netty to work fully asynchronous. (For more information about eventloops and the basic underlying principle I would recommend this video about the evenloop in JavaScript)

What do I need on the client side to benefit from the asynchronousness?

  1. Client sends request (containing payload and request id = clientside incrementing integer)
  2. Server process the request for 50sec
  3. Server sends response (containing the payload and the same request id the client send in his request)
  4. Client receives the response and looks up the request id (If the client is able to find the request id and its underlying callback it will invoke it)

Hope that helped

相关问答

更多

netty如何使用

和spring , 先写一个类,然后与一般的bean同样配置 <!-- netty config example --> <bean id="tcpServer" class="com.yixun.collector.server.NettyTCPServer" init-method="createServerBootstrap" destroy-method="stopServer"> <property name="handshakePipelineFactory" ref="handsha...

从netty中提取数据(而不是推动更好的背压控制)?(Pulling data from netty (instead of push for better back pressure control)?)

使用setAutoRead(false) 见http://normanmaurer.me/presentations/2014-facebook-eng-netty/slides.html#33.0 我找不到更好的例子,但希望有人会提出一个更完整的例子。 我认为如果已经从套接字读取数据, FlowControlHandler也可以提供帮助,但您一次只需要一条消息。 Use setAutoRead(false) see http://normanmaurer.me/presentations/201...

Netty 4 ChannelInboundMessageHandlerAdapter(Netty 4 ChannelInboundMessageHandlerAdapter)

您只需覆盖messageReceived即可处理消息。 如果你想要一些“特殊”处理,你可以“覆盖”其他人。 You only need to override messageReceived to process messages. You "can" override others if you want some "special" handling.

Jboss netty和netty之间的区别?(Difference between Jboss netty and netty?)

在这篇文章中你可以找到你回答,在Netty 3.X中,这些包来自org.jboss.netty。* http://netty.io/3.10/api/index.html 但是从Netty 4.X开始,包装来自io.netty。*参见: http ://netty.io/4.0/api/index.html 是的,版本3和版本4有几个不同之处。 我建议您使用稳定版本进行开发,请在http://netty.io/wiki/index.html中查看 In this post you could fi...

Spark如何使用Netty?(How does Spark use Netty?)

Spark使用Akka Actor进行RPC和消息传递,而后者使用Netty。 另外,为了移动批量数据,使用Netty。 对于混洗数据,可以选择使用Netty。 默认情况下,NIO直接用于传输洗牌数据。 对于广播数据(驾驶员对所有员工的数据传输),默认情况下使用Jetty。 Spark uses Akka Actor for RPC and messaging, which in turn uses Netty. Also, for moving bulk data, Netty is used....

Netty - 它是如何异步的?(Netty - how is it asynchronous?)

netty的异步来自哪里? Netty采用了你可能从JavaScript这样的语言中得知的eventloops原理。 这允许netty完全异步工作。 (有关eventloops和基本原理的更多信息,我会推荐这个关于JavaScript中的evenloop的视频 ) 客户端需要什么来从异步获益? 客户端发送请求(包含有效负载和请求id = clientside递增整数) 服务器处理请求50秒 服务器发送响应(包含有效载荷和客户端在其请求中发送的相同请求ID) 客户端收到响应并查找请求标识(如果客户端...

何时在netty中使用Unpooled(when to use Unpooled in netty)

将byte[]传递给Netty write方法相当于传递未加密的ByteBuf 。 我们可以在ByteArrayEncoder的源代码中看到这一点,它在内部调用Unpooled#wrappedBuffer(byte[]) : @Override protected void encode(ChannelHandlerContext ctx, byte[] msg, List<Object> out) throws Exception { out.add(Unpooled.wrappedBu...

netty,tomcat线程模型(netty , tomcat threading model)

在Netty中,通过将Executor传递给构造函数来指定ThreadPool。 因此,只要您不使用与Tomcat中使用的池相同的池,它就不会影响可用的线程。 Netty的Webseocket实现可以与其NIO传输一起使用。 在这种情况下,您将在连接之间共享许多线程。 因此,从连接到线程没有1:1的映射。 In Netty you specify the ThreadPool by pass an Executor to the constructor. So as long as you don...

如何使用JDBC来最大化Netty的性能?(How to use JDBC to maximize performance of Netty?)

确保您有足够的数据库连接,显然如果您的池没有连接,您的工作人员将阻止等待连接。 工作人员将等待新连接(如果允许池增长),或者等待连接返回。 否则,请使用一般最佳实践。 使用setFetchSize()和使用批处理的写入来调整读取。 最大限度地减少往返次数,并仅获取所需的数据。 您是否有慢的特定代码(或查询)? Make sure you have enough database connections, obviously your workers will block waiting for a...

Netty应用程序 - 多个请求响应(Netty application - multiple request response)

案例2 您可以将侦听器添加到您的写入中,并触发下一次写入。 案例3 如果您知道哪个ChannelHandlerContext属于您感兴趣的设备(您可以通过在每个连接时在Map中注册这些设置来存储),那么您可以使用该上下文触发事件。 Netty将负责排队该事件并确保它在正确的线程和通道中进行处理。 Case 2 You can add a listener to your write and have that trigger the next write. Case 3 If you know w...

相关文章

更多

[Netty 1] 初识Netty

1. 简介 最早接触netty是在阅读Zookeeper源码的时候,后来看到Storm的消息传输层也由 ...

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty源码分析

Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户 ...

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

storm学习之Netty代替ZMQ

整理自 http://www.csdn.net/article/2014-08-04/2821018/ ...

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器 ...

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

在Twitter,Netty 4 GC开销降为五分之一

原文:http://www.infoq.com/cn/news/2013/11/netty4-twit ...

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

最新问答

更多

java中的Base64二进制数据类型(Base64 binary data type in java)

Base-64编码是一种将任意字节转换为适合ASCII编码的文本字符范围内的字节的方法。 这是在没有任何解释的情况下完成的 - 原始字节在发送者端被转换为base-64; 接收器将它们转换回字节流,这就是它的全部内容。 当您的代码打印encoded1.getClass().getName() ,它获取的只是字节数组的静态类型。 为了将base-64中编码的数据解释为对程序有意义的内容,您需要知道作为base-64传输的基础数据的格式。 一旦字节传递给你(在你的情况下,这是encoded1的1字节

SQL Select Distinct基于条件(SQL Select Distinct based on Conditional)

你可以试试这个, SELECT ASN, CASE WHEN MAX_STATUS = 2 THEN 'MISCOUNT' WHEN MAX_STATUS = 0 THEN 'NOT STARTED' WHEN MAX_STATUS = 1 AND MIN_STATUS = 1 THEN 'VERIFIED' WHEN MAX_STATUS = 1 AND MIN_STATUS = 0 THEN 'I

带有Category和SubCategory的嵌套类别表(Nested Category table with Category and SubCategory)

检查公用表表达式,这些表达式允许您创建“递归选择”。 http://www.mssqltips.com/sqlservertip/1520/recursive-queries-using-common-table-expressions-cte-in-sql-server/ Check for Common Table Expressions, those allow you to create "recursive-selects". http://www.mssqltips.com/sqls

我的应用程序中有两个http请求,但我只想使用一个'http_proxy'(I have two http requests in my application, but I want only one use 'http_proxy')

我的解决方案是改变lib。 我正在使用SOAPpy,现在我正在使用SUDS并且工作。 由于某种原因,SOAPpy中的param http_proxy错误地使用了代理。 My solution was to change the lib. I was using SOAPpy, now Im using SUDS and worked. For some reason the param http_proxy in SOAPpy was using the proxy incorrectly.

记录样本的GNU无线电文件格式(GNU Radio File Format for the recorded samples)

文件接收器只是数据流的转储。 如果数据流内容是简单字节,那么文件的内容很简单。 如果数据流包含复数,则该文件将包含复数列表,其中每个复数由两个浮点数给出,每个浮点数(通常)为4个字节。 有关gnuradio文件读写块的实现,请参阅文件gnuradio / gnuradio-core / src / lib / io / gr_file_sink.cc和gr_file_source.cc。 您还可以使用python和gnuradio将文件转换为其他格式。 from gnuradio import

在Windows下的package.json脚本中设置环境变量(Setting environment variables in package.json scripts under Windows)

我设法解决了这个问题,有趣的是,删除了空间: "buildDev": "set NODE_ENV=development&& webpack" 哪个(至少对我来说)似乎是错的。 我预计这将导致语法错误和development&&的NODE_ENV值,但它完美地工作 - 尽管是丑陋的。 Make it cross-platform by using cross-env: "buildDev": "cross-env NODE_ENV=development webpack"

无法使用Renderer将Object实例设置为JComboBox的选定项(Unable to set Object instance as selected item of JComboBox with Renderer)

如果要通过使用对象的不同实例来执行此操作,但具有相同的属性,则需要覆盖类的equals和hashcode方法,以便属性组合是唯一的。 这非常重要,这是一种关系期望,任何equal另一个的对象都将具有相同的hashcode 这是一个非常快速的示例,我使用IDE的自动生成过程(因为我很懒),但是,如果您的Registration类具有在与类的实例进行比较时应该考虑的其他属性,则需要将其修改为支持他们(再次,任何好的IDE都应该能够做到这一点) public class Registration {

在表单提交上,在Codeiginiter验证之前首先进行jquery检查(On Form Submission, do jquery checking first before Codeiginiter validation)

如果您想在提交表单之前在客户端进行验证,则以下内容将起作用: // view echo form_open('basic_controller/submission'); echo form_input( array('name'=>'text', 'id'=>'text_input') ); echo form_submit('my_submit', 'Enter', "id='my_submit'"); echo form_close(); // controller function s

返回然后作为未定义。(Returning Then as Undefined. Q in NodeJS)

您的主要功能landingPage没有返回值。 其中的代码产生一个承诺,但你也应该返回它。 当你想要返回deferred持有的promise时,你应该延迟一个在外部函数作用域中定义的变量,这样你就可以返回它定义的promise( deferred.promise ): var landingPage = function (dir) { var deferred = Q.defer(); // *** define here Uni.get('https://'+getDirec

在同一个类中调用方法(Calling a method within the same class)

这不是一种扩展方法。 你需要使方法静态并调用它们: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication4 { class arraymod { static void Main( string[] args ) { int[]