使用Erlang的最佳,最有效的客户端池技术是什么

The*_*uad 7 sockets erlang client-server server-side

我是一个真正的Erlang新手(1周前开始),我正在尝试通过创建一个小而有效的聊天服务器来学习这种语言.(当我说效率时,我的意思是我有5台服务器用于对数十万个连接客户端进行压力测试 - 百万将是很棒的!)

我找到了一些教程这样做,唯一的是,我找到的每个教程都是IRC之类的.如果一个用户发送邮件,则除发件人之外的所有用户都将收到邮件.我想稍微改变一下,并使用一对一的讨论.

搜索连接用户的最有效客户端池是什么?我考虑过注册这个过程,因为它似乎做了我需要的一切,但我真的不认为这是更好的方法.(或者最好的方式去做).

有人会有这样的建议吗?

编辑:

每个连接的客户端都会受到ID的影响.

当用户连接时,它首先发送一个登录命令来给它的id.当用户想要将消息发送给另一个消息时,该消息看起来像这样

[ID-NUMBER][Message] %% ID-NUMBER IS A FIXED LENGTH

当我要求"最有效的客户端池"时,我实际上正在寻找在连接的客户端列表上检索/添加/删除一个客户端的最快方法,这可能很大(数十万 - 可能是数百万)

编辑2:

回答一些问题:

  • 我正在使用Raw Socket(现在使用telnet与服务器通信) - 稍后可能会转移到ssl ...
  • 这是我自己的协议
  • 每个客户都是一个衍生出来的Pid
  • 每个客户端的Pid都链接到它自己的监视器(主要是出于调试原因 - 如果断开连接,客户端应该从头开始auth重新连接)
  • 我在开始编码之前已经阅读了几本书,所以我还没有掌握Erlang的各个方面,但我并没有意识到它,我会在需要时阅读更多关于它的信息.
  • 我真正想要的是存储和搜索PID以便直接从进程到进程发送消息的最佳方法.

我应该使用列表编写自己的搜索客户端功能吗?

或者我应该使用ets?

甚至使用register/2 unregister/1和whereis/1来维护我的客户端列表,使用它的唯一id作为atom,它似乎是最简单的方法,我真的不知道它是否有效,但我我很确定这是丑陋的解决方案;-)?

Nia*_*rva 2

我正在做一些类似于您的聊天程序的事情,使用gproc作为 pubsub (类似于该页面上的演示)。每个客户端都以其 ID 进行注册。要查找特定客户端,您需要查找该客户端 ID。要订阅客户端,您可以向正在订阅的客户端 ID 的进程添加一个属性。要发布,请调用 gproc:send(ClientId,Message)。这涵盖了您的用例,以及更一般的基于房间的聊天,并且可以处理分布式无主进程注册表。

我还没有测试过它是否可以扩展到数百万,但它使用 ets 来进行存储,而 gproc 是由 Ulf Wiger 编写的坚如磐石的代码。我不指望能够编写更好的实现。