【发布时间】:2012-02-24 05:50:47
【问题描述】:
我是一个真正的 Erlang 新手(1 周前开始),我正在尝试通过创建一个小型但高效的聊天服务器来学习这门语言。 (当我说高效时,我的意思是我有 5 台服务器用于对数十万连接的客户端进行压力测试 - 一百万会很棒!)
我找到了一些这样做的教程,唯一的是,我找到的每个教程都类似于 IRC。如果一个用户发送一条消息,除了发件人之外的所有用户都会收到它。 我想稍微改变一下,并使用一对一的讨论。
搜索连接用户最有效的客户端池是什么? 我考虑过注册该进程,因为它似乎可以完成我需要的一切,但我真的认为这不是更好的方法。 (或者无论如何都是最漂亮的方式)。
有人对此有什么建议吗?
编辑:
每个连接的客户端都会受到一个 ID 的影响。
当用户连接时,它首先发送一个登录命令给它的 id。 当用户想要向另一个用户发送消息时,消息看起来像这样
[ID-NUMBER][Message] %% ID-NUMBER IS A FIXED LENGTH
当我询问“最有效的客户端池”时,我实际上是在寻找最快的方法来检索/添加/删除已连接客户端列表中的一个可能很大(数十万 - 可能是数百万)的客户端)
编辑 2:
回答一些问题:
- 我正在使用原始套接字(现在使用 telnet 与服务器通信)- 稍后可能会迁移到 ssl...
- 这是我自己的协议
- 每个客户端都是一个派生的 Pid
- 每个客户端的 Pid 都链接到它自己的监视器(主要是出于调试原因 - 如果断开连接,客户端应该通过它自己的从头开始的身份验证重新连接)
- 在开始编码之前我已经阅读了几本书,所以我还没有掌握 Erlang 的各个方面,但我并不是不了解它,我想我会在需要时阅读更多关于它的内容。
- 我真正在寻找的是存储和搜索这些 PID 以直接在进程之间发送消息的最佳方式。
我应该使用列表编写自己的搜索客户端函数吗?
或者我应该使用 ets 吗?
甚至使用 register/2 unregister/1 和 whereis/1 来维护我的客户列表,使用它的唯一 id 作为 atom,这似乎是最简单的方法,我真的不知道它是否有效,但我很确定这是丑陋的解决方案 ;-) ?
【问题讨论】:
-
我认为这是一个很棒的问题,虽然有点曲折。
-
您能否更具体地说明“搜索连接用户最有效的客户端池是什么?”?我没明白你的问题。
-
@Isac : 我已经编辑了我的帖子,希望你会发现它更具体
-
@TheSquad 好多了,谢谢!
-
也检查答案编辑
标签: sockets erlang client-server server-side