gpt4 book ai didi

sockets - 什么是 Erlang 最好、最有效的客户端池技术

转载 作者:行者123 更新时间:2023-12-04 12:35:55 27 4
gpt4 key购买 nike

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

我找到了一些这样做的教程,唯一的是,我发现的每个教程都像 IRC。如果一个用户发送一条消息,除了发件人之外的所有用户都会收到它。
我想稍微改变一下,并使用一对一的讨论。

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

有没有人有任何建议这样做?

编辑 :

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

当用户连接时,它首先发送一个登录命令给它的 id。
当用户想要向另一个用户发送消息时,消息看起来像这样
[ID-NUMBER][Message] %% ID-NUMBER IS A FIXED LENGTH
当我要求“最有效的客户端池”时,我实际上是在寻找最快的方法来检索/添加/删除连接的客户端列表中可能很大的一个客户端(数十万 - 可能是数百万)

编辑 2:

为了回答一些问题:

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

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

    还是我应该使用 ets ?

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

    最佳答案

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

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

    关于sockets - 什么是 Erlang 最好、最有效的客户端池技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9097694/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com