Sockets 使用Erlang的最佳、最高效的客户机池技术是什么

Sockets 使用Erlang的最佳、最高效的客户机池技术是什么,sockets,erlang,client-server,server-side,Sockets,Erlang,Client Server,Server Side,我是一个真正的Erlang新手(开始于一周前),我正试图通过创建一个小型但高效的聊天服务器来学习这种语言。(当我说高效时,我的意思是我有5台服务器用来对成千上万的连接客户端进行压力测试-一百万台就好了!) 我已经找到了一些这样做的教程,唯一的一点是,我找到的每一个教程,都是类似IRC的。如果一个用户发送消息,则除发送者之外的所有用户都将收到该消息。 我想改变一下,使用一对一的讨论 搜索已连接用户最有效的客户端池是什么? 我考虑过注册这个过程,因为它似乎可以做我需要的一切,但我真的不认为这是更好的

我是一个真正的Erlang新手(开始于一周前),我正试图通过创建一个小型但高效的聊天服务器来学习这种语言。(当我说高效时,我的意思是我有5台服务器用来对成千上万的连接客户端进行压力测试-一百万台就好了!)

我已经找到了一些这样做的教程,唯一的一点是,我找到的每一个教程,都是类似IRC的。如果一个用户发送消息,则除发送者之外的所有用户都将收到该消息。 我想改变一下,使用一对一的讨论

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

有人会有这样做的建议吗

编辑:

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

当用户连接时,它首先发送一个登录命令以给出其id。 当用户想要向另一个用户发送消息时,消息如下所示

[ID-NUMBER][Message]%ID-NUMBER是固定长度的

当我要求“最有效的客户机池”时,我实际上是在寻找最快的方法来检索/添加/删除连接客户机列表中的一个客户机,这个客户机可能会很大(几十万——也许几百万)

编辑2:

回答一些问题:

  • 我正在使用原始套接字(现在使用telnet与服务器通信)-稍后可能会转移到ssl
  • 这是我自己的协议
  • 每个客户机都是派生的Pid
  • 每个客户端的Pid都链接到它自己的监视器(主要是出于调试原因-如果断开连接,客户端应该通过自己的起始身份重新连接)
  • 在开始编写代码之前,我读过几本书,所以我还没有掌握Erlang的每一个方面,但我并不是不知道,我想在需要的时候我会读更多关于它的内容
  • 我真正想要的是存储和搜索这些PID的最佳方式,以便在进程之间直接发送消息
我应该使用列表编写自己的搜索客户端函数吗

还是应该使用ets


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

我对Erlang也有点陌生(几个月),所以我希望这能让你走上正确的道路:)

首先,由于您是“新手”,您应该了解以下网站:

  • : 最常见的模块都在stdlib应用程序中,所以从这里开始
  • : 有一个实时搜索引擎,所以它在搜索时非常好 对于特定模块
  • : 让您进入erlang编程的思维模式
  • : 从Erlang开始,每个人都必须阅读。它真的很全面 读起来很有趣
  • : 论坛和食谱,搜索程序员面临的常见问题
好的,考虑到非持久性数据库,我建议使用
集合
gb_集合
模块(文档)

如果您想要持久性,您应该尝试使用
dets
(参见上面的文档),但我不能说明任何关于效率的内容,因此您应该进一步研究这个主题


在《了解一些Erlang》一书中,有一章提到
集合
更适合阅读密集型系统,而
gb\u集合
更适合均衡使用。

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


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

现在,消息传递系统是每个人来到Erlang时都想做的事情,因为这两个系统自然地融合在一起。然而,在继续之前,有许多事情需要研究。消息传递基本上涉及以下内容:
用户注册
用户身份验证
会话管理
日志记录
消息交换/路由
e.t.c.
现在,要完成所有或大部分任务,需要一个数据库,当然是内存中的数据库,这就引出了
Mnesia
ETS表
。由于您是Erlang的新手,我想您还没有真正掌握如何使用这些工具。在某一时刻,您将需要维护
谁正在与谁通信
谁可以聊天
e.t.c.因此您可能需要查找内容并在某个地方写入内容。

另一件事是您没有告诉我们客户。它将是一个Web客户机(HTTP)吗?它是您在原始套接字上实现的一个全新协议吗?无论如何,您都需要掌握Erlang中名为:
并发性的东西。如果用户连接并被分配了
ID
,如果您的设计是
每个用户的进程
,则您必须保存这些进程的PID或根据某些标准注册它们,如果它们死亡,则再次监视它们,这将使我进入
OTP
监督树
。然而,有很多,告诉我们更多关于客户端和服务器的交互,你需要e.t.c.的网络通信,还是只是一个sim卡