什么是Erlang最好,最高效的客户端池技术
我是一个真正的Erlang新手(从1周前开始),我正在尝试通过创建一个小而高效的聊天服务器来学习这种语言。 (当我说有效率的时候,我的意思是我有5台服务器用于测试数以十万计的连接客户端 - 一百万美元会很棒!)
我找到了一些教程,唯一的是,我发现每个教程都是IRC。 如果一个用户发送消息,除发件人以外的所有用户都将收到该消息。 我想稍微改变一下,并使用一对一的讨论。
搜索连接用户的最有效的客户端池是什么? 我考虑过注册流程,因为它似乎满足了我需要的一切,但我真的不认为这是更好的方式。 (或者最好的办法就是这样做)。
有没有人会有这样的建议?
编辑:
每个连接的客户端都会受到ID的影响。
当用户连接时,它首先发送一个登录命令来提供它的ID。 当用户想要发送消息给另一个时,消息看起来像这样
[ID-NUMBER][Message] %% ID-NUMBER IS A FIXED LENGTH
当我要求“最有效的客户端池”时,我实际上正在寻找最快的方式来检索/添加/删除连接的客户端列表上的一个客户端,该客户端列表可能很大(数十万甚至上百万)
编辑2:
回答一些问题:
我应该使用列表编写自己的搜索客户端功能吗?
或者我应该使用ets?
甚至使用register / 2 unregister / 1和whereis / 1来维护我的客户端列表,使用它的唯一ID作为原子,它似乎是最简单的方法,我真的不知道它是否有效,但我很确定这是一个丑陋的解决方案;-)?
我正在做一些类似于使用gproc作为pubsub的聊天程序(类似于该页面上的演示)。 每个客户都注册为ID。 要查找特定的客户端,请查看该客户端ID。 要订阅客户端,请将属性添加到正在订阅的客户端ID的进程中。 要发布,请调用gproc:send(ClientId,Message)。 这涵盖了你的用例,更一般的基于聊天的聊天室,并且可以处理分布式的无主进程注册表。
我还没有测试过它是否可以扩展到数百万,但是它使用ets来完成存储,而gproc是Ulf Wiger的稳定代码。 我不会指望能够写出更好的实现。
我也是Erlang的新手(几个月),所以我希望这能让你走上正确的道路:)
首先,既然你是一个“新手”,你应该知道这些网站:
那么,考虑一个非持久性数据库,我会建议sets
或gb_sets
模块(文档在这里)。
如果你想持久化,你应该试试dets
(见上面的文档),但是我不能说明任何有关效率的东西,所以你应该进一步研究这个话题。
在“学习一些Erlang”一书中,关于数据结构的一章讲述了读密集型系统的sets
更好,而gb_sets
更适合平衡使用。
现在,消息系统是每个人在来Erlang时都想做的事情,因为这两者自然融合在一起。 然而,在继续之前还有很多事情需要研究。 消息传递基本上涉及以下内容: User Registration
, User Authentication
, Sessions Management
, Logging
, Message Switching/routing
等
现在,要做所有或大部分这些工作,需要有一个数据库,当然是IN-MEMORY,这就是我要么是Mnesia
,要么是ETS Tables
。 既然你是Erlang的新手,我想你还没有真正掌握了这些。 在某一时刻,您需要维护Who is communicating with who
, Who is available for Chat
等。因此,您可能需要查找事情并在某处写东西。
另一件事是你没有告诉我们客户。 它会是一个Web客户端(HTTP),它是一个全新的协议,你正在通过原始套接字实现吗? 无论如何,您需要掌握一些名为: Concurrency in Erlang
。 如果用户连接并被分配了一个ID
,如果你的设计是A process Per User
,那么你将不得不保存这些进程的Pid或者根据一些标准注册它们,然后再监视它们是否死亡等。这使我得到了OTP
和Supervision trees
。 然而,有很多关于客户端和服务器交互,你需要的网络通信等方面的信息,或者它只是一个简单的Erlang RPC项目,你正在为自己的修订做些什么?
编辑
使用ETS Tables
,或使用Mnesia RAM tables
。 不要想到注册这些Pid或将它们存储在列表,数组或集合中。 看看这个问题的解决方案
上一篇: What is the best, most efficient, Client pool technique with Erlang