【问题标题】:Concurrent program languages for Chat and Twitter-like Apps用于聊天和类似 Twitter 的应用程序的并发程序语言
【发布时间】:2011-01-26 16:15:45
【问题描述】:

我需要创建一个简单的聊天系统,例如 facebook 聊天和类似 twitter 的应用程序。 在这种情况下,最好的并发程序语言是什么?

Erlang、Haskell、Scala 或其他什么?

谢谢^_^

【问题讨论】:

  • Facebook 聊天或推特没有什么“简单”,它们是互联网上最复杂的两个应用程序
  • 您是否有机会使用开箱即用的解决方案而不是自己滚动解决方案?

标签: scala haskell concurrency erlang


【解决方案1】:

这实际上是一个相对容易解决的问题,可以通过任何具有良好线程支持的语言(例如 Java、C# 和其他语言)来解决。该模型相当简单:

  1. 每个客户端都使用 AJAX 请求连接到 Web 服务器,该请求在服务器上配置为不超时;
  2. 如果由于任何原因超时,客户端被配置为发出另一个 AJAX 请求;
  3. 该 AJSX 调用的服务器端点在某个等待更新的监视器上执行线程等待操作;
  4. 当用户发送聊天时,它会被发送到服务器,并且任何相关的监视器都会收到信号;
  5. 监听该监视器的所有线程都被唤醒,检索所有等待它们的消息并将其作为 AJAX 结果返回给客户端;
  6. 客户端呈现这些消息,然后发出另一个 AJAX 请求来监听消息。

这是基本框架,但不是故事的结尾。任何可扩展的聊天系统都将支持内部或外部联合(这意味着客户端可以连接到多个服务器),但除非您是 Google、Facebook 或 Twitter,否则您不太可能遇到此问题。

如果您需要某种消息队列/总线来进行服务器间通信。

这是你需要像 Erlang 这样的重型多线程语言来完成的事情,但它、Haskell 和其他人当然能够做到。

【讨论】:

  • 很抱歉,Erlang 不是多线程编程语言。它支持不是线程的 Erlang 进程。
  • @Gordon 我真正的意思是 Erlang 是面向并发的,而不是专门讨论线程。
  • ...但是您忘记了“线程警察”。我们一直在看着你知道... :)
【解决方案2】:

类似facebook聊天的聊天系统

Facebook 聊天是用 Erlang 编写的,http://www.facebook.com/note.php?note_id=14218138919

还有一个类似推特的应用

什么方面?消息传递?网络前端?最终都是消息路由。 Haskell 最近被用于几个实时生产交易系统,使用大量的多核并发。 http://www.starling-software.com/misc/icfp-2009-cjs.pdf

更相关:规模是多少:您希望同时服务多少用户?

【讨论】:

  • 实际上 twitter 最终都是 DATABASE,它与消息传递或路由以及关于如何在数据库中存储和检索所有推文的所有事情几乎没有关系,在那种规模下没有什么简单的
  • 除了您看到的内容不再来自数据库。它在不同类型的商店中。
【解决方案3】:

我会选择 erlang,它在支持彗星的应用程序中的效率已得到充分证明。

使用诸如氮气之类的框架,您可以在其中启动彗星请求,就像 Jquery 处理 ajax 一样容易。

【讨论】:

    【解决方案4】:

    Erlang 是我为此类事情选择的药物。但是,如果您对 JavaScript 感觉更舒服,我也会查看 Node.js。

    【讨论】:

      【解决方案5】:

      【讨论】:

      • F# 用于专有解决方案。
      • 我已经看过几个关于 twisted 的基准测试,但它的扩展性似乎很糟糕。它不能使用多个 CPU,而且我不确定它支持哪些轮询后端。我们主要将它用于客户端、机器人和其他类似的小型服务,但我想它可能对你有用,如果你不期望超过,比如几百个客户端。
      【解决方案6】:

      如果它实际上是一个简单 应用程序(并且不是在非常高的负载下),那么答案是使用任何你已经知道的具有良好线程的语言。 Erlang、Scala、Clojure、Haskell、F# 等都在这样的事情上做得非常好——但 Java 和 C# 也是如此。如果你选择你知道和/或喜欢的任何一个,你会没事的。

      如果您以此为借口来学习一种新的普遍有用的语言,我会选择 Scala 作为高性能的完美组合(Erlang 不是一般的,尽管它具有高效的并发性非常棒),高度功能强大(Java 和 C# 不具备)、高度可部署(由于在 JVM 上运行)和相当熟悉(假设您了解 C 语言)。

      如果您以此为借口练习容错并发,请使用 Erlang。这就是它的设计目的,而且做得非常好。

      【讨论】:

        【解决方案7】:

        使用 Scala/Lift 完成聊天应用程序 source code。

        8 分 20 秒实时,未经编辑,webcast 使用 Scala/Lift 从头开始​​编写聊天应用程序。

        【讨论】:

          【解决方案8】:

          我建议看看 Akka (www.akkasource.org)

          这是一个 Scala Actor 框架,具有大量用于制作可扩展后端应用程序的管道。

          它支持的开箱即用:

          演员监督 远程演员 集群成员 JAX-RS 上的彗星(项目氛围) 服务的 HTTP 身份验证 分布式存储引擎支持(Cassandra、MongoDB) + 更多

          【讨论】:

            猜你喜欢
            • 2019-09-25
            • 1970-01-01
            • 2013-01-20
            • 1970-01-01
            • 1970-01-01
            • 2014-07-08
            • 2019-03-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多