什么是Erlang最好,最高效的客户端池技术

我是一个真正的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作为原子,它似乎是最简单的方法,我真的不知道它是否有效,但我很确定这是一个丑陋的解决方案;-)?


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

    我还没有测试过它是否可以扩展到数百万,但是它使用ets来完成存储,而gproc是Ulf Wiger的稳定代码。 我不会指望能够写出更好的实现。


    我也是Erlang的新手(几个月),所以我希望这能让你走上正确的道路:)

    首先,既然你是一个“新手”,你应该知道这些网站:

  • Erlang官方文档:最常见的模块在stdlib应用程序中,所以从这里开始。
  • 备选文档:有一个实时搜索引擎,所以在搜索特定模块时非常好。
  • Erlang编程规则:让您输入erlang编程的思想。
  • 学习一些Erlang图书:从Erlang开始,每个人都必须阅读。 阅读真的很全面和有趣!
  • Trapexit.org:论坛和食谱,以寻找程序员面临的共同问题。
  • 那么,考虑一个非持久性数据库,我会建议setsgb_sets模块(文档在这里)。

    如果你想持久化,你应该试试dets (见上面的文档),但是我不能说明任何有关效率的东西,所以你应该进一步研究这个话题。

    在“学习一些Erlang”一书中,关于数据结构的一章讲述了读密集型系统的sets更好,而gb_sets更适合平衡使用。


    现在,消息系统是每个人在来Erlang时都想做的事情,因为这两者自然融合在一起。 然而,在继续之前还有很多事情需要研究。 消息传递基本上涉及以下内容: User RegistrationUser AuthenticationSessions ManagementLoggingMessage Switching/routing

    现在,要做所有或大部分这些工作,需要有一个数据库,当然是IN-MEMORY,这就是我要么是Mnesia ,要么是ETS Tables 。 既然你是Erlang的新手,我想你还没有真正掌握了这些。 在某一时刻,您需要维护Who is communicating with whoWho is available for Chat等。因此,您可能需要查找事情并在某处写东西。

    另一件事是你没有告诉我们客户。 它会是一个Web客户端(HTTP),它是一个全新的协议,你正在通过原始套接字实现吗? 无论如何,您需要掌握一些名为: Concurrency in Erlang 。 如果用户连接并被分配了一个ID ,如果你的设计是A process Per User ,那么你将不得不保存这些进程的Pid或者根据一些标准注册它们,然后再监视它们是否死亡等。这使我得到了OTPSupervision trees 。 然而,有很多关于客户端和服务器交互,你需要的网络通信等方面的信息,或者它只是一个简单的Erlang RPC项目,你正在为自己的修订做些什么?



    编辑

    使用ETS Tables ,或使用Mnesia RAM tables 。 不要想到注册这些Pid或将它们存储在列表,数组或集合中。 看看这个问题的解决方案

    链接地址: http://www.djcxy.com/p/57305.html

    上一篇: What is the best, most efficient, Client pool technique with Erlang

    下一篇: C++ Input Performance