繁体   English   中英

有状态服务器为什么不可能在 Ruby、PHP、Java、ASP.NET、...?

[英]Stateful Server why not possible in Ruby, PHP, Java, ASP.NET,...?

这个关于在不缓存的情况下扩展数十万用户的视频中,这个人正在谈论 Erlang 有状态服务器。 在他们使用 Ruby Stateless 之前。

有状态服务器实际上意味着什么? 用户的 session 和服务器上有状态的 object 有什么区别?

为什么 Ruby、PHP、Java 或 ASP.NET 不能做与 Erlang 相同的事情?

更新:最后那个人说他必须结合 Erlang 和 Ruby 所以这意味着他不能单独使用 Ruby 。

我还没有看过演示文稿,但从摘要来看它看起来像一个游戏平台。 这与您的标准业务应用程序完全不同。 您的标准业务应用程序维护少量 session 本地 state 并且 state 通常不需要在线程之间共享。 我们的标准业务应用程序严重依赖数据库和缓存来共享业务数据。

这些多人游戏系统需要对 state 进行近乎实时的操作,而这需要被许多线程访问。 这就是 Erlang 擅长的地方。 并不是说您不能用其他语言做到这一点,而是您不能同样安全或高效地做到这一点。

  • 与 Ruby 不同,Erlang 的并发 model 没有锁。Erlang 使用消息传递并发 model(称为 Actor 模型)。 没有共享可变 memory,因此避免了很多难以发现的编程错误。
  • Erlang 运行时可以支持数十万个轻量级“进程”,只需很少的开销即可创建和销毁这些进程。
  • Erlang 的每进程堆使垃圾收集变得快速,并允许接近实时的应用程序。
  • Erlang 对分布式计算的支持非常好,因此通过添加硬件进行扩展相对容易。
  • Erlang 的异常处理及其监督模式使管理应用程序错误变得容易,即使在网络上的节点之间也是如此。

有状态服务器/应用程序是在用户请求之间维护一些 state 的服务器/应用程序。 您正常的 web 应用程序是无状态的。 每个新请求都被视为全新的。 如果你想保留一些信息,你使用 session(通常存储在 cookie 中)。

这允许自由扩展 web 个工作人员:您只需启动所需数量的工作人员即可。

有状态服务器/应用程序允许更快地执行操作(无需每次都从数据库中获取数据)并保存传输的信息(您不需要来回传递 cookies),但您付出的代价是降低了可扩展性。 现在您不能只将传入请求抛给任何空缺的工作人员,您需要将其定向到拥有用户 state 的工作人员。

当然,您可以使用 Ruby 两种方式进行编程。Rails/Sinatra 用于无状态 web 应用程序,EventMachine 用于有状态守护进程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM