ServiceStack没有服务器端异步支持

Pos*_*Guy 4 servicestack

我的一个朋友过去告诉我他看过ServiceStack.说它看起来不错,但它没有异步支持所以在他的书中,它不是一个使用这个框架的选项(没有好的,如果没有异步),我必须有点同意.

除非ServiceStack添加了异步,否则不确定这对我来说是不是一个好选择.

它让我想知道a)如果没有异步,stackoverflow真的使用它吗?b)如果a是,那么它显然必须是一个高度定制的版本,它可能有异步吗?

我相信来自stackoverflow的人可以回答这篇文章.

myt*_*thz 15

ServiceStack v4中添加了服务器端异步

最需要的功能,服务器端异步支持已被添加其中ServiceStack HttpHandlers的,现在从一个共同继承HttpAsyncTaskHandler实现基类IHttpAsyncHandler.这使您可以通过多种方式从服务返回异步任务,如http://bit.ly/1cOJ3hR所示

例如,服务现在可以有一个对象,任务或异步任务返回类型,可以返回已启动或未启动的任务(我们将自己启动).这种转变尽可能顺利,所有现有服务都像以前一样继续工作,所有测试都通过.

ServiceStack服务客户端中基于任务的异步

在匹配新的服务器端异步故事并且现在所有项目都已升级到.NET 4.0时,所有服务客户端都已更改为返回所有异步操作的.NET 4.0任务,因此可以在C#的async/await方法中使用它们.Async的一些例子:http://bit.ly/17ps94C

Async API还提供OnDownloadProgress回调,您可以使用它来在UI中提供进度指示器,例如:http://bit.ly/19ALXUW

Http Utils中的异步API

HTTP Utils也添加了异步重载,它为调用外部第三方(即非ServiceStack)HTTP服务提供了一个很好的API.


缓存提供比Async更好的性能

不确定实际测量结果是什么导致Async对于维护高性能系统是强制性的,因为良好的缓存策略将提供比Async更好的性能.有许多高性能服务和网站不使用异步,例如,YouTube使用1M线阻塞Python构建,每天处理40亿次视图,最近还发布了如何获取Django(一个庞大的Python Web框架)的帖子)通过利用HTTP缓存扩展到80亿页面查看.对于大多数多线程站点/服务(例如.NET/Ruby/Python),阻塞IO是常态,而不是异步 - 这应该测量所有过早优化以计算它是否实际产生任何最终用户/利用率的好处.

StackOverflow使用ASP.NET的Sync MVC控制器

StackOverflow本身是一个ASP.NET MVC网站,它使用标准的同步MVC控制器,并采用良好的缓存策略,利用本地和分布式缓存,并使用ServiceStack的JSON序列化程序.因此,即使使用同步MVC控制器,StackOverflow也具有极佳的服务器利用率,可处理95M页面浏览量/月.StackOverflow Careers 2.0使用ServiceStack及其RedisMQ支持其所有BackOffice操作.

  • 异步与缓存正交; 一个不是另一个的替代品.阻止IO只是常态,因为大多数语言缺乏连续传递样式(CPS)转换.传统上,非阻塞IO更难以实现,因此自然缺乏对该主题的研究.看看nginx和lighttpd的实现.我几乎称它们为非阻塞请求处理状态机的理想示例.他们对.NET 4.5对异步HTTP请求服务的处理方式采用了类似的方法. (11认同)
  • 同时使用异步和缓存的决定为您提供了一个强大的工具.说,在某些情况下,缓存比异步更好.如果您有5000个不同的用户,缓存将无助于访问其不同的数据.但是,async会这样做,因为当sql查询正在进行时,所有用户都可以使用ASP.NET工作线程*.所以,是的,在v4中添加不应该阻止你添加一些.NET 4特定的添加(异步方法替代),对吧? (3认同)
  • @DotNetWise缓存通常是比async更好的替代方案,在大多数情况下,async可以减轻任何需求,在异步重写逻辑之前应该考虑(和评估).我已经更新了答案,以反映[v4中添加了服务器端异步](https://github.com/ServiceStack/ServiceStack/blob/master/tests/ServiceStack.WebHost.Endpoints.Tests/AsyncTaskTests.cs#L216 ).ProTip:使用"故事结束"在评论中没有位置,这更有可能阻止任何想要在将来帮助你的人. (3认同)
  • 一个用例我遇到了在那里异步是唯一的解决方案是一个高吞吐量的网络API,用来处理每秒数千同时请求在商用硬件或虚拟机共享内核的实施过程中.通过阻塞对后端服务总线的调用,线程耗尽在IIS上是即时且持久的.一旦我们使用I/O完成端口实现异步解决方案,该服务就能够适当地扩展.没有阻塞调用实现可以支持足够的吞吐量来让我们开心. (3认同)