问题 Web服务器中的proactor模式与同步模型的区别


在同步模型中,当客户端连接到服务器时,客户端和服务器都必须彼此同步才能完成某些操作。

同时,异步模型允许客户端和服务器分离并独立工作。客户端发送建立连接的请求并执行某些操作。当服务器正在处理请求时,客户端可以执行其他操作。完成操作后,将完成事件置于事件解复用器中的队列中,等待Proactor(例如HTTP处理程序)发回请求并调用完成处理程序(在客户端上)。这些术语在boost :: asio文档中使用 Proactor设计模式:没有线程的并发

通过这种方式,异步模型可以接受同时连接,而无需为每个连接创建一个线程,从而提高整体性能。为了实现与异步模型相同的效果,第一个模型(同步)必须是多线程的。有关更多详细信息,请参阅: 前驱模式 (我实际上学习了用于来自该文档的异步模型的proactor模式。在这里它描述了典型的同步I / O Web服务器)。

我对这个问题的理解是否正确?如果是这样,这意味着异步服务器可以接受请求并异步返回结果(第一个连接请求Web服务器上的服务不需要是第一个回复的)?本质上,异步模型不使用线程(或者在单个组件中使用线程,例如在Proactor,异步事件多路复用器(boost :: asio文档)组件中,而不是通过创建整个客户端 - 服务器应用程序堆栈,这是描述在Proactor Pattern文档的多线程模型中,第2.2节 - 常规并发模型的常见陷阱和陷阱)。


889
2017-10-05 12:45


起源

我不清楚你在问什么。 - Sam Miller


答案:


Proactor模型假设在子任务中拆分网络会话过程,例如:解析主机名,接受或连接,读取或写入信息的某些部分,关闭连接 - 并允许您在不同会话的子任务之间切换。然而,Reactor模型将网络会话过程视为(几乎)单个任务。

绝对的Proactor优势:

  • 由于“外包”任务,性能得到提升。例如,您可以向DNS发送解决方案请求并等待5分钟以回答无所事事(Reactor) - 或者您可以在等待(Proactor)时执行其他操作。

绝对的Proactor缺点:

  • 由于任务切换,性能降低,这意味着对于单个会话,您执行的代码(Proactor)应该比它应该更多(Reactor)。

但总体表现通常是在每个时间段的许多“满意”客户中测量的。因此,Proactor与Reactor的优势取决于具体情况。这里举一些例子。

  1. HTTP服务器。客户希望在浏览器窗口中看到某些内容。他不需要在加载整个页面之前等待以查看第一段文本。 Proactor是有效的,因为部分页面加载比整个页面加载更快。整个页面的加载时间与Reactor模型大致相同。

  2. 低延迟游戏服务器。客户希望尽快获得他的命令​​的完整结果。 Reactor是有效的,因为没有像部分阅读或写作这样的子任务 - 客户端在读取完整响应之前不会看到任何内容。因此,Reactor不会在子任务之间进行额外的切换,并且每次都保证某个客户端在其命令上获得进展,而Proactor将强制所有客户端等待彼此不可预测的时间。

在这两种情况下,多线程都可以为您提供线性加速。


13
2017-11-16 07:43



感谢你的回答。以为它被遗忘了。 - Amumu
这个例子不是真的,这取决于你如何使用它们和应用程序场景。 Pro-actor和Re-actor之间的最大区别在于,即使那些操作还没有准备就可以提前进行网络操作,例如,你可以在没有数据到达时读取但是当数据到达时,你会看到它将完成(这就是为什么把它命名为亲演员)。在Reactor中,当操作准备就绪,比如数据到达时,将调用messageRecv函数。对于响应请求的业务逻辑代码,它们仍然在单个函数中执行,与reactor没有区别 - jean