0

我正在实现一个分布式聊天系统,在这个系统中我们有以下选项:

  1. 使在每个节点上运行的客户端和服务器作为单独的线程运行。充当接收者的服务器将作为守护线程运行,而客户端将用户输入作为普通线程运行。

  2. fork 两个进程,一个用于客户端,一个用于服务器。

我无法推理出要继续使用哪一个。任何见解都会很棒!

4

2 回答 2

1

您可以通过在接收数据并将它们放入正确队列的线程中创建 n 个工作人员,将数据推送到客户端的 m 个工作人员和处理来自队列的数据的 k 个工作人员,以“可扩展”的方式来做到这一点。

n 工作人员获取数据 m 工作人员推送数据 k 工作人员处理数据并跟踪状态 传入消息队列 传出消息队列

这样您就可以找到最适合您的 (n, m, k)。这里唯一的问题是,在没有任何错误的情况下实现它并非易事。您可能会将工作人员类型的数量减少到两种,即传入消息和进程 + 推送并使用 redis (redis.io) 中的列表作为队列。但这仍然需要大量的测试覆盖:) 祝你好运

实际上,您可以为此使用 websockets。像 socket.io http://socket.io/或 faye http://faye.jcoglan.com/这样的东西

只需为聊天创建前台 :) 这将以真正可扩展和可用的方式解决您的大部分问题。

于 2012-04-14T19:49:17.797 回答
0

他们两个同样糟糕。您实际上想要在 I/O 上进行多路复用。在 Erlang 中这是微不足道的,这是在 Erlang 中编程的唯一方法。在 Python 中,您可以使用 Twisted 或 gevent 或类似的。Ruby 有 EventMachine。Java有NIO。C有libev。等等。

于 2012-04-13T23:27:48.527 回答